{"action":"created","comment":{"url":"https://api.github.com/repos/efficios/babeltrace/pulls/comments/58760129","id":58760129,"diff_hunk":"@@ -0,0 +1,334 @@\n+/*\n+ * durin.c\n+ *\n+ * Babeltrace - DWARF Information Reader\n+ *\n+ * Copyright 2015 Antoine Busque <abusque@efficios.com>\n+ *\n+ * Author: Antoine Busque <abusque@efficios.com>\n+ *\n+ * Permission is hereby granted, free of charge, to any person obtaining a copy\n+ * of this software and associated documentation files (the \"Software\"), to deal\n+ * in the Software without restriction, including without limitation the rights\n+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n+ * copies of the Software, and to permit persons to whom the Software is\n+ * furnished to do so, subject to the following conditions:\n+ *\n+ * The above copyright notice and this permission notice shall be included in\n+ * all copies or substantial portions of the Software.\n+ *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n+ * SOFTWARE.\n+ */\n+\n+#include <glib.h>\n+#include <babeltrace/ctf-text/durin.h>\n+\n+/*\n+ * XXX: libdwarf often hides pointers behind typedefs, which can lead\n+ * to misleading code. For instance, `Dwarf_Debug` is in fact a\n+ * pointer to an opaque struct. Therefore, passing its 'value' to\n+ * functions such as `dwarf_next_cu_header` will modify its members,\n+ * and therefore the behaviour of other functions using the same\n+ * `Dwarf_Debug`. Use extra caution.\n+ */\n+\n+/**\n+ * Advance `dwarf_info`'s internal state to point to the next compile\n+ * unit (CU) header.\n+ *\n+ * @param dwarf_info\tDwarf_Debug instance\n+ * @param cu_offset\tOut parameter, offset in bytes to the new CU\n+ * @returns\t\t0 on success, -1 on failure.\n+ */\n+static\n+int durin_cu_next_header(Dwarf_Debug *dwarf_info, Dwarf_Unsigned *cu_offset)\n+{\n+\tint ret;\n+\tDwarf_Unsigned _cu_offset;\n+\n+\tif (!dwarf_info || !cu_offset) {\n+\t\tgoto error;\n+\t}\n+\n+\tret = dwarf_next_cu_header(*dwarf_info, NULL, NULL, NULL, NULL,\n+\t\t\t\t&_cu_offset, NULL);\n+\tif (ret != DW_DLV_OK) {\n+\t\tgoto error;\n+\t}\n+\t*cu_offset = _cu_offset;\n+\n+\treturn 0;\n+\n+error:\n+\treturn -1;\n+}\n+\n+/**\n+ * Reset the internal CU offset state of `dwarf_info`, allowing to\n+ * read from the first CU again.\n+ *\n+ * libdwarf keeps the value of the last read CU header's offset stored\n+ * internally within the opaque Dwarf_Debug structure, from which it\n+ * then computes the offset of the next header and fetches\n+ * it. Therefore, the only apparent way to reset this offset is to\n+ * iterate over all CUs until they wrap over, short of instantiating a\n+ * new Dwarf_Debug structure. This function hides this manipulation.\n+ *\n+ * @param dwarf_info\tDwarf_Debug instance\n+ * @returns\t\t0 on success, -1 on failure.\n+ */\n+static\n+int durin_cu_reset_internal_state(Dwarf_Debug *dwarf_info)\n+{\n+\tint ret;\n+\tDwarf_Unsigned cu_offset;\n+\n+\tif (!dwarf_info) {\n+\t\tgoto error;\n+\t}\n+\n+\tdo {\n+\t\tret = dwarf_next_cu_header(*dwarf_info, NULL, NULL, NULL, NULL,\n+\t\t\t\t\t&cu_offset, NULL);\n+\t} while (ret == DW_DLV_OK);\n+\n+\tif (ret == DW_DLV_ERROR) {\n+\t\tgoto error;\n+\t}\n+\n+\treturn 0;\n+\n+error:\n+\treturn -1;\n+}\n+\n+struct durin_cu *durin_cu_create(Dwarf_Debug *dwarf_info)\n+{\n+\tint ret;\n+\tstruct durin_cu *cu;\n+\n+\tif (!dwarf_info) {\n+\t\tgoto error;\n+\t}\n+\n+\tret = durin_cu_reset_internal_state(dwarf_info);\n+\tif (ret) {\n+\t\tgoto error;\n+\t}\n+\n+\tcu = g_new0(struct durin_cu, 1);\n+\tif (!cu) {\n+\t\tgoto error;\n+\t}\n+\tcu->dwarf_info = dwarf_info;\n+\tcu->offset = 0;\n+\n+\treturn cu;\n+\n+error:\n+\treturn NULL;\n+}\n+\n+void durin_cu_destroy(struct durin_cu *cu)\n+{\n+\tg_free(cu);\n+}\n+\n+int durin_cu_next(struct durin_cu *cu)\n+{\n+\tint ret;\n+\tDwarf_Unsigned cu_offset;\n+\n+\tif (!cu) {\n+\t\tgoto error;\n+\t}\n+\n+\tret = durin_cu_next_header(cu->dwarf_info, &cu_offset);\n+\tif (ret) {\n+\t\tgoto error;\n+\t}\n+\tcu->offset = cu_offset;\n+\n+\treturn 0;\n+\n+error:\n+\treturn -1;\n+}\n+\n+struct durin_die *durin_die_create(struct durin_cu *cu)\n+{\n+\tint ret;\n+\tstruct durin_die *die = NULL;\n+\tDwarf_Die *dwarf_die = NULL;\n+\tDwarf_Error error;\n+\n+\tif (!cu) {\n+\t\tgoto error;\n+\t}\n+\n+\tdwarf_die = g_new0(Dwarf_Die, 1);\n+\tif (!dwarf_die) {\n+\t\tgoto error;\n+\t}\n+\t/* dwarf_siblingof on the cu fetches its root DIE. */\n+\tret = dwarf_siblingof(*cu->dwarf_info, NULL, dwarf_die, &error);\n+\tif (ret != DW_DLV_OK) {\n+\t\tgoto error;\n+\t}\n+\tdie = g_new0(struct durin_die, 1);\n+\tif (!die) {\n+\t\tgoto error;\n+\t}\n+\tdie->cu = cu;\n+\tdie->dwarf_die = dwarf_die;\n+\tdie->depth = 0;\n+\n+\treturn die;\n+\n+error:\n+\tif (dwarf_die) {\n+\t\tdwarf_dealloc(*cu->dwarf_info, *dwarf_die, DW_DLA_DIE);\n+\t\tg_free(dwarf_die);\n+\t}\n+\tg_free(die);\n+\treturn NULL;\n+}\n+\n+void durin_die_destroy(struct durin_die *die)\n+{\n+\tif (!die) {\n+\t\treturn;\n+\t}\n+\n+\tif (die->dwarf_die) {\n+\t\tdwarf_dealloc(*die->cu->dwarf_info, *die->dwarf_die,\n+\t\t\t      DW_DLA_DIE);\n+\t\tg_free(die->dwarf_die);\n+\t}\n+\tg_free(die);\n+}\n+\n+int durin_die_next(struct durin_die *die)\n+{\n+\tint ret;\n+\tDwarf_Die *next_die = NULL;\n+\tDwarf_Error error;","path":"formats/ctf-text/durin.c","position":null,"original_position":221,"commit_id":"7fc49fb48527dcbd416ef775259067c6562767b1","original_commit_id":"8c3c51b9876ef4cf6a17470ab9ca9342839bf370","user":{"login":"abusque","id":185922,"avatar_url":"https://avatars.githubusercontent.com/u/185922?v=3","gravatar_id":"","url":"https://api.github.com/users/abusque","html_url":"https://github.com/abusque","followers_url":"https://api.github.com/users/abusque/followers","following_url":"https://api.github.com/users/abusque/following{/other_user}","gists_url":"https://api.github.com/users/abusque/gists{/gist_id}","starred_url":"https://api.github.com/users/abusque/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abusque/subscriptions","organizations_url":"https://api.github.com/users/abusque/orgs","repos_url":"https://api.github.com/users/abusque/repos","events_url":"https://api.github.com/users/abusque/events{/privacy}","received_events_url":"https://api.github.com/users/abusque/received_events","type":"User","site_admin":false},"body":"I wasn't aware of that at. I haven't found any info in the doc explaining how it could avoid the clash, but seems like it does.","created_at":"2016-04-06T18:45:41Z","updated_at":"2016-04-06T18:45:41Z","html_url":"https://github.com/efficios/babeltrace/pull/30#discussion_r58760129","pull_request_url":"https://api.github.com/repos/efficios/babeltrace/pulls/30","_links":{"self":{"href":"https://api.github.com/repos/efficios/babeltrace/pulls/comments/58760129"},"html":{"href":"https://github.com/efficios/babeltrace/pull/30#discussion_r58760129"},"pull_request":{"href":"https://api.github.com/repos/efficios/babeltrace/pulls/30"}}},"pull_request":{"url":"https://api.github.com/repos/efficios/babeltrace/pulls/30","id":46842046,"html_url":"https://github.com/efficios/babeltrace/pull/30","diff_url":"https://github.com/efficios/babeltrace/pull/30.diff","patch_url":"https://github.com/efficios/babeltrace/pull/30.patch","issue_url":"https://api.github.com/repos/efficios/babeltrace/issues/30","number":30,"state":"open","locked":false,"title":"[RFC] Implement debug info analysis","user":{"login":"abusque","id":185922,"avatar_url":"https://avatars.githubusercontent.com/u/185922?v=3","gravatar_id":"","url":"https://api.github.com/users/abusque","html_url":"https://github.com/abusque","followers_url":"https://api.github.com/users/abusque/followers","following_url":"https://api.github.com/users/abusque/following{/other_user}","gists_url":"https://api.github.com/users/abusque/gists{/gist_id}","starred_url":"https://api.github.com/users/abusque/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abusque/subscriptions","organizations_url":"https://api.github.com/users/abusque/orgs","repos_url":"https://api.github.com/users/abusque/repos","events_url":"https://api.github.com/users/abusque/events{/privacy}","received_events_url":"https://api.github.com/users/abusque/received_events","type":"User","site_admin":false},"body":"This changeset adds the debug information analysis to babeltrace. This analysis allows mapping between instruction pointers (IPs) from a trace event's context to function name, from either DWARF info or ELF symbols, as well as source location, i.e. source file and line number, only if DWARF info is present.\r\n\r\nIn order for the analysis to work properly, the trace has to be taken with a 2.8.0-pre (that is, the current master) of LTTng UST (for the required statedump and (optionally) libdl events), with ip and vpid contexts enabled.\r\n\r\nThere is a dependency on elfutils, for libelf and libdw.","created_at":"2015-10-05T22:24:06Z","updated_at":"2016-04-06T18:45:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0e1a01b0cf3b96507d454b1cdd114706b6ecc2f5","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/efficios/babeltrace/pulls/30/commits","review_comments_url":"https://api.github.com/repos/efficios/babeltrace/pulls/30/comments","review_comment_url":"https://api.github.com/repos/efficios/babeltrace/pulls/comments{/number}","comments_url":"https://api.github.com/repos/efficios/babeltrace/issues/30/comments","statuses_url":"https://api.github.com/repos/efficios/babeltrace/statuses/7fc49fb48527dcbd416ef775259067c6562767b1","head":{"label":"abusque:debuginfo","ref":"debuginfo","sha":"7fc49fb48527dcbd416ef775259067c6562767b1","user":{"login":"abusque","id":185922,"avatar_url":"https://avatars.githubusercontent.com/u/185922?v=3","gravatar_id":"","url":"https://api.github.com/users/abusque","html_url":"https://github.com/abusque","followers_url":"https://api.github.com/users/abusque/followers","following_url":"https://api.github.com/users/abusque/following{/other_user}","gists_url":"https://api.github.com/users/abusque/gists{/gist_id}","starred_url":"https://api.github.com/users/abusque/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abusque/subscriptions","organizations_url":"https://api.github.com/users/abusque/orgs","repos_url":"https://api.github.com/users/abusque/repos","events_url":"https://api.github.com/users/abusque/events{/privacy}","received_events_url":"https://api.github.com/users/abusque/received_events","type":"User","site_admin":false},"repo":{"id":34083219,"name":"babeltrace","full_name":"abusque/babeltrace","owner":{"login":"abusque","id":185922,"avatar_url":"https://avatars.githubusercontent.com/u/185922?v=3","gravatar_id":"","url":"https://api.github.com/users/abusque","html_url":"https://github.com/abusque","followers_url":"https://api.github.com/users/abusque/followers","following_url":"https://api.github.com/users/abusque/following{/other_user}","gists_url":"https://api.github.com/users/abusque/gists{/gist_id}","starred_url":"https://api.github.com/users/abusque/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abusque/subscriptions","organizations_url":"https://api.github.com/users/abusque/orgs","repos_url":"https://api.github.com/users/abusque/repos","events_url":"https://api.github.com/users/abusque/events{/privacy}","received_events_url":"https://api.github.com/users/abusque/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/abusque/babeltrace","description":"This repo is a mirror of the official babeltrace git found at git.efficios.com/babeltrace.git. The Babeltrace project provides trace read and write libraries, as well as a trace converter. Plugins can be created for any trace format to allow its conversion to/from another trace format.","fork":true,"url":"https://api.github.com/repos/abusque/babeltrace","forks_url":"https://api.github.com/repos/abusque/babeltrace/forks","keys_url":"https://api.github.com/repos/abusque/babeltrace/keys{/key_id}","collaborators_url":"https://api.github.com/repos/abusque/babeltrace/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/abusque/babeltrace/teams","hooks_url":"https://api.github.com/repos/abusque/babeltrace/hooks","issue_events_url":"https://api.github.com/repos/abusque/babeltrace/issues/events{/number}","events_url":"https://api.github.com/repos/abusque/babeltrace/events","assignees_url":"https://api.github.com/repos/abusque/babeltrace/assignees{/user}","branches_url":"https://api.github.com/repos/abusque/babeltrace/branches{/branch}","tags_url":"https://api.github.com/repos/abusque/babeltrace/tags","blobs_url":"https://api.github.com/repos/abusque/babeltrace/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/abusque/babeltrace/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/abusque/babeltrace/git/refs{/sha}","trees_url":"https://api.github.com/repos/abusque/babeltrace/git/trees{/sha}","statuses_url":"https://api.github.com/repos/abusque/babeltrace/statuses/{sha}","languages_url":"https://api.github.com/repos/abusque/babeltrace/languages","stargazers_url":"https://api.github.com/repos/abusque/babeltrace/stargazers","contributors_url":"https://api.github.com/repos/abusque/babeltrace/contributors","subscribers_url":"https://api.github.com/repos/abusque/babeltrace/subscribers","subscription_url":"https://api.github.com/repos/abusque/babeltrace/subscription","commits_url":"https://api.github.com/repos/abusque/babeltrace/commits{/sha}","git_commits_url":"https://api.github.com/repos/abusque/babeltrace/git/commits{/sha}","comments_url":"https://api.github.com/repos/abusque/babeltrace/comments{/number}","issue_comment_url":"https://api.github.com/repos/abusque/babeltrace/issues/comments{/number}","contents_url":"https://api.github.com/repos/abusque/babeltrace/contents/{+path}","compare_url":"https://api.github.com/repos/abusque/babeltrace/compare/{base}...{head}","merges_url":"https://api.github.com/repos/abusque/babeltrace/merges","archive_url":"https://api.github.com/repos/abusque/babeltrace/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/abusque/babeltrace/downloads","issues_url":"https://api.github.com/repos/abusque/babeltrace/issues{/number}","pulls_url":"https://api.github.com/repos/abusque/babeltrace/pulls{/number}","milestones_url":"https://api.github.com/repos/abusque/babeltrace/milestones{/number}","notifications_url":"https://api.github.com/repos/abusque/babeltrace/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/abusque/babeltrace/labels{/name}","releases_url":"https://api.github.com/repos/abusque/babeltrace/releases{/id}","deployments_url":"https://api.github.com/repos/abusque/babeltrace/deployments","created_at":"2015-04-16T22:09:57Z","updated_at":"2016-01-29T21:55:04Z","pushed_at":"2016-04-06T18:42:22Z","git_url":"git://github.com/abusque/babeltrace.git","ssh_url":"git@github.com:abusque/babeltrace.git","clone_url":"https://github.com/abusque/babeltrace.git","svn_url":"https://github.com/abusque/babeltrace","homepage":"","size":3606,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"efficios:master","ref":"master","sha":"83e0efce601fcbc424e501844774dc64fe053453","user":{"login":"efficios","id":4039928,"avatar_url":"https://avatars.githubusercontent.com/u/4039928?v=3","gravatar_id":"","url":"https://api.github.com/users/efficios","html_url":"https://github.com/efficios","followers_url":"https://api.github.com/users/efficios/followers","following_url":"https://api.github.com/users/efficios/following{/other_user}","gists_url":"https://api.github.com/users/efficios/gists{/gist_id}","starred_url":"https://api.github.com/users/efficios/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/efficios/subscriptions","organizations_url":"https://api.github.com/users/efficios/orgs","repos_url":"https://api.github.com/users/efficios/repos","events_url":"https://api.github.com/users/efficios/events{/privacy}","received_events_url":"https://api.github.com/users/efficios/received_events","type":"Organization","site_admin":false},"repo":{"id":18916893,"name":"babeltrace","full_name":"efficios/babeltrace","owner":{"login":"efficios","id":4039928,"avatar_url":"https://avatars.githubusercontent.com/u/4039928?v=3","gravatar_id":"","url":"https://api.github.com/users/efficios","html_url":"https://github.com/efficios","followers_url":"https://api.github.com/users/efficios/followers","following_url":"https://api.github.com/users/efficios/following{/other_user}","gists_url":"https://api.github.com/users/efficios/gists{/gist_id}","starred_url":"https://api.github.com/users/efficios/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/efficios/subscriptions","organizations_url":"https://api.github.com/users/efficios/orgs","repos_url":"https://api.github.com/users/efficios/repos","events_url":"https://api.github.com/users/efficios/events{/privacy}","received_events_url":"https://api.github.com/users/efficios/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/efficios/babeltrace","description":"This repo is a mirror of the official babeltrace git found at git.efficios.com/babeltrace.git. The Babeltrace project provides trace read and write libraries, as well as a trace converter. Plugins can be created for any trace format to allow its conversion to/from another trace format.","fork":false,"url":"https://api.github.com/repos/efficios/babeltrace","forks_url":"https://api.github.com/repos/efficios/babeltrace/forks","keys_url":"https://api.github.com/repos/efficios/babeltrace/keys{/key_id}","collaborators_url":"https://api.github.com/repos/efficios/babeltrace/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/efficios/babeltrace/teams","hooks_url":"https://api.github.com/repos/efficios/babeltrace/hooks","issue_events_url":"https://api.github.com/repos/efficios/babeltrace/issues/events{/number}","events_url":"https://api.github.com/repos/efficios/babeltrace/events","assignees_url":"https://api.github.com/repos/efficios/babeltrace/assignees{/user}","branches_url":"https://api.github.com/repos/efficios/babeltrace/branches{/branch}","tags_url":"https://api.github.com/repos/efficios/babeltrace/tags","blobs_url":"https://api.github.com/repos/efficios/babeltrace/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/efficios/babeltrace/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/efficios/babeltrace/git/refs{/sha}","trees_url":"https://api.github.com/repos/efficios/babeltrace/git/trees{/sha}","statuses_url":"https://api.github.com/repos/efficios/babeltrace/statuses/{sha}","languages_url":"https://api.github.com/repos/efficios/babeltrace/languages","stargazers_url":"https://api.github.com/repos/efficios/babeltrace/stargazers","contributors_url":"https://api.github.com/repos/efficios/babeltrace/contributors","subscribers_url":"https://api.github.com/repos/efficios/babeltrace/subscribers","subscription_url":"https://api.github.com/repos/efficios/babeltrace/subscription","commits_url":"https://api.github.com/repos/efficios/babeltrace/commits{/sha}","git_commits_url":"https://api.github.com/repos/efficios/babeltrace/git/commits{/sha}","comments_url":"https://api.github.com/repos/efficios/babeltrace/comments{/number}","issue_comment_url":"https://api.github.com/repos/efficios/babeltrace/issues/comments{/number}","contents_url":"https://api.github.com/repos/efficios/babeltrace/contents/{+path}","compare_url":"https://api.github.com/repos/efficios/babeltrace/compare/{base}...{head}","merges_url":"https://api.github.com/repos/efficios/babeltrace/merges","archive_url":"https://api.github.com/repos/efficios/babeltrace/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/efficios/babeltrace/downloads","issues_url":"https://api.github.com/repos/efficios/babeltrace/issues{/number}","pulls_url":"https://api.github.com/repos/efficios/babeltrace/pulls{/number}","milestones_url":"https://api.github.com/repos/efficios/babeltrace/milestones{/number}","notifications_url":"https://api.github.com/repos/efficios/babeltrace/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/efficios/babeltrace/labels{/name}","releases_url":"https://api.github.com/repos/efficios/babeltrace/releases{/id}","deployments_url":"https://api.github.com/repos/efficios/babeltrace/deployments","created_at":"2014-04-18T15:27:49Z","updated_at":"2016-02-23T09:57:10Z","pushed_at":"2016-04-06T18:33:19Z","git_url":"git://github.com/efficios/babeltrace.git","ssh_url":"git@github.com:efficios/babeltrace.git","clone_url":"https://github.com/efficios/babeltrace.git","svn_url":"https://github.com/efficios/babeltrace","homepage":"","size":3736,"stargazers_count":9,"watchers_count":9,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":13,"mirror_url":null,"open_issues_count":2,"forks":13,"open_issues":2,"watchers":9,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/efficios/babeltrace/pulls/30"},"html":{"href":"https://github.com/efficios/babeltrace/pull/30"},"issue":{"href":"https://api.github.com/repos/efficios/babeltrace/issues/30"},"comments":{"href":"https://api.github.com/repos/efficios/babeltrace/issues/30/comments"},"review_comments":{"href":"https://api.github.com/repos/efficios/babeltrace/pulls/30/comments"},"review_comment":{"href":"https://api.github.com/repos/efficios/babeltrace/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/efficios/babeltrace/pulls/30/commits"},"statuses":{"href":"https://api.github.com/repos/efficios/babeltrace/statuses/7fc49fb48527dcbd416ef775259067c6562767b1"}}}}