{"action":"created","comment":{"url":"https://api.github.com/repos/rebar/rebar3/pulls/comments/28070425","id":28070425,"diff_hunk":"@@ -147,164 +146,84 @@ doterl_compile(Config, Dir, OutDir, MoreSources, ErlOpts) ->\n     SrcDirs = [filename:join(Dir, X) || X <- proplists:get_value(src_dirs, ErlOpts, [\"src\"])],\n     AllErlFiles = gather_src(SrcDirs, []) ++ MoreSources,\n \n-    %% Issue: rebar/rebar3#140 (fix matching based on same path + order of\n-    %% erl_first_files)\n-    ErlFirstFiles = get_erl_first_files(ErlFirstFilesConf, AllErlFiles),\n-    RestErls = [ File || File <- AllErlFiles,\n-                         not lists:member(File, ErlFirstFiles) ],\n-\n     %% Make sure that ebin/ exists and is on the path\n     ok = filelib:ensure_dir(filename:join(OutDir, \"dummy.beam\")),\n     CurrPath = code:get_path(),\n     true = code:add_path(filename:absname(OutDir)),\n     OutDir1 = proplists:get_value(outdir, ErlOpts, OutDir),\n-    G = init_erlcinfo(Config, AllErlFiles),\n-    %% Split RestErls so that files which are depended on are treated\n-    %% like erl_first_files.\n-    {OtherFirstErls, OtherErls} =\n-        lists:partition(\n-          fun(F) ->\n-                  Children = get_children(G, F),\n-                  log_files(?FMT(\"Files dependent on ~s\", [F]), Children),\n-\n-                  case erls(Children) of\n-                      [] ->\n-                          %% There are no files dependent on this file.\n-                          false;\n-                      _ ->\n-                          %% There are some files dependent on the file.\n-                          %% Thus the file has higher priority\n-                          %% and should be compiled in the first place.\n-                          true\n-                  end\n-          end, RestErls),\n-    %% Dependencies of OtherFirstErls that must be compiled first.\n-    OtherFirstErlsDeps = lists:flatmap(\n-                           fun(Erl) -> erls(get_parents(G, Erl)) end,\n-                           OtherFirstErls),\n-    %% NOTE: In case the way we retrieve OtherFirstErlsDeps or merge\n-    %% it with OtherFirstErls does not result in the correct compile\n-    %% priorities, or the method in use proves to be too slow for\n-    %% certain projects, consider using a more elaborate method (maybe\n-    %% digraph_utils) or alternatively getting and compiling the .erl\n-    %% parents of an individual Source in internal_erl_compile. By not\n-    %% handling this in internal_erl_compile, we also avoid extra\n-    %% needs_compile/2 calls.\n-    FirstErls = ErlFirstFiles ++ uo_merge(OtherFirstErlsDeps, OtherFirstErls),\n+\n+    G = init_erlcinfo(proplists:get_all_values(i, ErlOpts), AllErlFiles),\n+    NeededErlFiles = needed_files(G, ErlOpts, Dir, OutDir1, AllErlFiles),\n+    ErlFirstFiles = erl_first_files(Config, NeededErlFiles),\n+    {DepErls, OtherErls} = lists:partition(\n+                             fun(Source) -> digraph:in_degree(G, Source) > 0 end,\n+                             [File || File <- NeededErlFiles, not lists:member(File, ErlFirstFiles)]),\n+    DepErlsOrdered = digraph_utils:topsort(digraph_utils:subgraph(G, DepErls)),\n+    FirstErls = ErlFirstFiles ++ lists:reverse(DepErlsOrdered),\n     ?DEBUG(\"Files to compile first: ~p\", [FirstErls]),\n     rebar_base_compiler:run(\n       Config, FirstErls, OtherErls,\n       fun(S, C) ->\n-              internal_erl_compile(C, Dir, S, OutDir1, ErlOpts, G)\n+              internal_erl_compile(C, Dir, S, OutDir1, ErlOpts)\n       end),\n     true = code:set_path(CurrPath),\n     ok.\n \n-%%\n-%% Return all .erl files from a list of files\n-%%\n-erls(Files) ->\n-    [Erl || Erl <- Files, filename:extension(Erl) =:= \".erl\"].\n-\n-%%\n-%% Return a list of erl_first_files in order as specified in rebar.config\n-%% using the path from AllFiles.\n-%%\n-get_erl_first_files(FirstFiles, AllFiles) ->\n-    BaseFirstFiles = [filename:basename(F) || F <- FirstFiles],\n-    IndexedAllFiles = [{filename:basename(F), F} || F <- AllFiles ],\n-    [ proplists:get_value(FileName, IndexedAllFiles) ||\n-        FileName <- BaseFirstFiles,\n-        proplists:is_defined(FileName, IndexedAllFiles) ].\n-\n-%%\n-%% Return a list without duplicates while preserving order\n-%%\n-ulist(L) ->\n-    ulist(L, []).\n-\n-ulist([H|T], Acc) ->\n-    case lists:member(H, T) of\n-        true ->\n-            ulist(T, Acc);\n-        false ->\n-            ulist(T, [H|Acc])\n-    end;\n-ulist([], Acc) ->\n-    lists:reverse(Acc).\n-\n-%%\n-%% Merge two lists without duplicates while preserving order\n-%%\n-uo_merge(L1, L2) ->\n-    lists:foldl(fun(E, Acc) -> u_add_element(E, Acc) end, ulist(L1), L2).\n-\n-u_add_element(Elem, [Elem|_]=Set) -> Set;\n-u_add_element(Elem, [E1|Set])     -> [E1|u_add_element(Elem, Set)];\n-u_add_element(Elem, [])           -> [Elem].\n-\n--spec include_path(file:filename(),\n-                   rebar_state:t()) -> [file:filename(), ...].\n-include_path(Source, Config) ->\n-    ErlOpts = rebar_state:get(Config, erl_opts, []),\n-    Dir = filename:join(rebar_utils:droplast(filename:split(filename:dirname(Source)))),\n-    lists:usort([filename:join(Dir, \"include\"), filename:dirname(Source)]\n-                ++ proplists:get_all_values(i, ErlOpts)).\n-\n--spec needs_compile(file:filename(), file:filename(),\n-                    list(), [string()]) -> boolean().\n-needs_compile(Source, Target, Opts, Parents) ->\n-    TargetLastMod = filelib:last_modified(Target),\n-    F = fun(I) -> source_changed(TargetLastMod, I) end,\n-    lists:any(F, [Source] ++ Parents) orelse opts_changed(Opts, Target).\n-\n-source_changed(TargetLastMod, I) -> TargetLastMod < filelib:last_modified(I).\n-\n-opts_changed(NewOpts, Target) ->\n-    case compile_info(Target) of\n-        {ok, Opts} -> lists:sort(Opts) =/= lists:sort(NewOpts);\n-        _          -> true\n-    end.\n-\n-compile_info(Target) ->\n-    case beam_lib:chunks(Target, [compile_info]) of\n-        {ok, {_mod, Chunks}} ->\n-            CompileInfo = proplists:get_value(compile_info, Chunks, []),\n-            {ok, proplists:get_value(options, CompileInfo, [])};\n-        {error, beam_lib, Reason} ->\n-            ?WARN(\"Couldn't read debug info from ~p for reason: ~p\", [Target, Reason]),\n-            {error, Reason}\n+erl_first_files(Config, NeededErlFiles) ->\n+    %% NOTE: rebar_config:get_local perhaps?\n+    ErlFirstFilesConf = rebar_state:get(Config, erl_first_files, []),\n+    %% NOTE: order of files in ErlFirstFiles is important!\n+    [File || File <- ErlFirstFilesConf, lists:member(File, NeededErlFiles)].\n+\n+%% Get subset of SourceFiles which need to be recompiled, respecting\n+%% dependencies induced by given graph G.\n+needed_files(G, ErlOpts, Dir, OutDir, SourceFiles) ->\n+    lists:filter(fun(Source) ->\n+                         Target = target_base(OutDir, Source) ++ \".beam\",\n+                         Opts = [{outdir, filename:dirname(Target)}\n+                                ,{i, filename:join(Dir, \"include\")}] ++ ErlOpts,\n+                         digraph:vertex(G, Source) > {Source, filelib:last_modified(Target)}\n+                              orelse opts_changed(Opts, Target)\n+                 end, SourceFiles).\n+\n+opts_changed(Opts, Target) ->\n+    Basename = filename:basename(Target, \".beam\"),\n+    Dirname = filename:dirname(Target),\n+    ObjectFile = filename:join([Dirname, Basename]),\n+    case code:load_abs(ObjectFile) of\n+        {module, Mod} ->\n+            Compile = Mod:module_info(compile),\n+            lists:sort(Opts) =/= lists:sort(proplists:get_value(options,\n+                                                                Compile,\n+                                                                undefined));","path":"src/rebar_erlc_compiler.erl","position":212,"original_position":212,"commit_id":"39a4ca0c041543aba68740c8e92af1b2af7be883","original_commit_id":"39a4ca0c041543aba68740c8e92af1b2af7be883","user":{"login":"ferd","id":111141,"avatar_url":"https://avatars.githubusercontent.com/u/111141?v=3","gravatar_id":"","url":"https://api.github.com/users/ferd","html_url":"https://github.com/ferd","followers_url":"https://api.github.com/users/ferd/followers","following_url":"https://api.github.com/users/ferd/following{/other_user}","gists_url":"https://api.github.com/users/ferd/gists{/gist_id}","starred_url":"https://api.github.com/users/ferd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ferd/subscriptions","organizations_url":"https://api.github.com/users/ferd/orgs","repos_url":"https://api.github.com/users/ferd/repos","events_url":"https://api.github.com/users/ferd/events{/privacy}","received_events_url":"https://api.github.com/users/ferd/received_events","type":"User","site_admin":false},"body":"should we default to `[]` instead of `undefined` ?","created_at":"2015-04-09T15:11:14Z","updated_at":"2015-04-09T15:11:14Z","html_url":"https://github.com/rebar/rebar3/pull/323#discussion_r28070425","pull_request_url":"https://api.github.com/repos/rebar/rebar3/pulls/323","_links":{"self":{"href":"https://api.github.com/repos/rebar/rebar3/pulls/comments/28070425"},"html":{"href":"https://github.com/rebar/rebar3/pull/323#discussion_r28070425"},"pull_request":{"href":"https://api.github.com/repos/rebar/rebar3/pulls/323"}}},"pull_request":{"url":"https://api.github.com/repos/rebar/rebar3/pulls/323","id":32817491,"html_url":"https://github.com/rebar/rebar3/pull/323","diff_url":"https://github.com/rebar/rebar3/pull/323.diff","patch_url":"https://github.com/rebar/rebar3/pull/323.patch","issue_url":"https://api.github.com/repos/rebar/rebar3/issues/323","number":323,"state":"open","locked":false,"title":"merge rebar2's Refactor logic and optimizations in rebar_erlc_compiler:doterl_compile/4 #467","user":{"login":"tsloughter","id":36227,"avatar_url":"https://avatars.githubusercontent.com/u/36227?v=3","gravatar_id":"","url":"https://api.github.com/users/tsloughter","html_url":"https://github.com/tsloughter","followers_url":"https://api.github.com/users/tsloughter/followers","following_url":"https://api.github.com/users/tsloughter/following{/other_user}","gists_url":"https://api.github.com/users/tsloughter/gists{/gist_id}","starred_url":"https://api.github.com/users/tsloughter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tsloughter/subscriptions","organizations_url":"https://api.github.com/users/tsloughter/orgs","repos_url":"https://api.github.com/users/tsloughter/repos","events_url":"https://api.github.com/users/tsloughter/events{/privacy}","received_events_url":"https://api.github.com/users/tsloughter/received_events","type":"User","site_admin":false},"body":"In an attempt to keep up with shared code between rebar3 and rebar2 I've merged in https://github.com/rebar/rebar/pull/467. \r\n\r\n@kejv would be great if you took a look in case I got anything wrong :)","created_at":"2015-04-07T23:57:05Z","updated_at":"2015-04-09T15:11:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"cb24a82d6d9e756fd1679e8f972fd6a9d0eceae6","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/rebar/rebar3/pulls/323/commits","review_comments_url":"https://api.github.com/repos/rebar/rebar3/pulls/323/comments","review_comment_url":"https://api.github.com/repos/rebar/rebar3/pulls/comments{/number}","comments_url":"https://api.github.com/repos/rebar/rebar3/issues/323/comments","statuses_url":"https://api.github.com/repos/rebar/rebar3/statuses/39a4ca0c041543aba68740c8e92af1b2af7be883","head":{"label":"tsloughter:wip_erlc_rebar2","ref":"wip_erlc_rebar2","sha":"39a4ca0c041543aba68740c8e92af1b2af7be883","user":{"login":"tsloughter","id":36227,"avatar_url":"https://avatars.githubusercontent.com/u/36227?v=3","gravatar_id":"","url":"https://api.github.com/users/tsloughter","html_url":"https://github.com/tsloughter","followers_url":"https://api.github.com/users/tsloughter/followers","following_url":"https://api.github.com/users/tsloughter/following{/other_user}","gists_url":"https://api.github.com/users/tsloughter/gists{/gist_id}","starred_url":"https://api.github.com/users/tsloughter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tsloughter/subscriptions","organizations_url":"https://api.github.com/users/tsloughter/orgs","repos_url":"https://api.github.com/users/tsloughter/repos","events_url":"https://api.github.com/users/tsloughter/events{/privacy}","received_events_url":"https://api.github.com/users/tsloughter/received_events","type":"User","site_admin":false},"repo":{"id":26615042,"name":"rebar3","full_name":"tsloughter/rebar3","owner":{"login":"tsloughter","id":36227,"avatar_url":"https://avatars.githubusercontent.com/u/36227?v=3","gravatar_id":"","url":"https://api.github.com/users/tsloughter","html_url":"https://github.com/tsloughter","followers_url":"https://api.github.com/users/tsloughter/followers","following_url":"https://api.github.com/users/tsloughter/following{/other_user}","gists_url":"https://api.github.com/users/tsloughter/gists{/gist_id}","starred_url":"https://api.github.com/users/tsloughter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tsloughter/subscriptions","organizations_url":"https://api.github.com/users/tsloughter/orgs","repos_url":"https://api.github.com/users/tsloughter/repos","events_url":"https://api.github.com/users/tsloughter/events{/privacy}","received_events_url":"https://api.github.com/users/tsloughter/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/tsloughter/rebar3","description":"Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.","fork":true,"url":"https://api.github.com/repos/tsloughter/rebar3","forks_url":"https://api.github.com/repos/tsloughter/rebar3/forks","keys_url":"https://api.github.com/repos/tsloughter/rebar3/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tsloughter/rebar3/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tsloughter/rebar3/teams","hooks_url":"https://api.github.com/repos/tsloughter/rebar3/hooks","issue_events_url":"https://api.github.com/repos/tsloughter/rebar3/issues/events{/number}","events_url":"https://api.github.com/repos/tsloughter/rebar3/events","assignees_url":"https://api.github.com/repos/tsloughter/rebar3/assignees{/user}","branches_url":"https://api.github.com/repos/tsloughter/rebar3/branches{/branch}","tags_url":"https://api.github.com/repos/tsloughter/rebar3/tags","blobs_url":"https://api.github.com/repos/tsloughter/rebar3/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tsloughter/rebar3/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tsloughter/rebar3/git/refs{/sha}","trees_url":"https://api.github.com/repos/tsloughter/rebar3/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tsloughter/rebar3/statuses/{sha}","languages_url":"https://api.github.com/repos/tsloughter/rebar3/languages","stargazers_url":"https://api.github.com/repos/tsloughter/rebar3/stargazers","contributors_url":"https://api.github.com/repos/tsloughter/rebar3/contributors","subscribers_url":"https://api.github.com/repos/tsloughter/rebar3/subscribers","subscription_url":"https://api.github.com/repos/tsloughter/rebar3/subscription","commits_url":"https://api.github.com/repos/tsloughter/rebar3/commits{/sha}","git_commits_url":"https://api.github.com/repos/tsloughter/rebar3/git/commits{/sha}","comments_url":"https://api.github.com/repos/tsloughter/rebar3/comments{/number}","issue_comment_url":"https://api.github.com/repos/tsloughter/rebar3/issues/comments{/number}","contents_url":"https://api.github.com/repos/tsloughter/rebar3/contents/{+path}","compare_url":"https://api.github.com/repos/tsloughter/rebar3/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tsloughter/rebar3/merges","archive_url":"https://api.github.com/repos/tsloughter/rebar3/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tsloughter/rebar3/downloads","issues_url":"https://api.github.com/repos/tsloughter/rebar3/issues{/number}","pulls_url":"https://api.github.com/repos/tsloughter/rebar3/pulls{/number}","milestones_url":"https://api.github.com/repos/tsloughter/rebar3/milestones{/number}","notifications_url":"https://api.github.com/repos/tsloughter/rebar3/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tsloughter/rebar3/labels{/name}","releases_url":"https://api.github.com/repos/tsloughter/rebar3/releases{/id}","created_at":"2014-11-14T00:42:34Z","updated_at":"2015-04-02T18:29:15Z","pushed_at":"2015-04-09T14:48:38Z","git_url":"git://github.com/tsloughter/rebar3.git","ssh_url":"git@github.com:tsloughter/rebar3.git","clone_url":"https://github.com/tsloughter/rebar3.git","svn_url":"https://github.com/tsloughter/rebar3","homepage":"  http://www.rebar3.org","size":3910,"stargazers_count":0,"watchers_count":0,"language":"Erlang","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":"rebar:master","ref":"master","sha":"15a7ccfaab4af9da65dfed834a0762d835f6bd2c","user":{"login":"rebar","id":2651508,"avatar_url":"https://avatars.githubusercontent.com/u/2651508?v=3","gravatar_id":"","url":"https://api.github.com/users/rebar","html_url":"https://github.com/rebar","followers_url":"https://api.github.com/users/rebar/followers","following_url":"https://api.github.com/users/rebar/following{/other_user}","gists_url":"https://api.github.com/users/rebar/gists{/gist_id}","starred_url":"https://api.github.com/users/rebar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rebar/subscriptions","organizations_url":"https://api.github.com/users/rebar/orgs","repos_url":"https://api.github.com/users/rebar/repos","events_url":"https://api.github.com/users/rebar/events{/privacy}","received_events_url":"https://api.github.com/users/rebar/received_events","type":"Organization","site_admin":false},"repo":{"id":26610130,"name":"rebar3","full_name":"rebar/rebar3","owner":{"login":"rebar","id":2651508,"avatar_url":"https://avatars.githubusercontent.com/u/2651508?v=3","gravatar_id":"","url":"https://api.github.com/users/rebar","html_url":"https://github.com/rebar","followers_url":"https://api.github.com/users/rebar/followers","following_url":"https://api.github.com/users/rebar/following{/other_user}","gists_url":"https://api.github.com/users/rebar/gists{/gist_id}","starred_url":"https://api.github.com/users/rebar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rebar/subscriptions","organizations_url":"https://api.github.com/users/rebar/orgs","repos_url":"https://api.github.com/users/rebar/repos","events_url":"https://api.github.com/users/rebar/events{/privacy}","received_events_url":"https://api.github.com/users/rebar/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rebar/rebar3","description":"Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases.","fork":false,"url":"https://api.github.com/repos/rebar/rebar3","forks_url":"https://api.github.com/repos/rebar/rebar3/forks","keys_url":"https://api.github.com/repos/rebar/rebar3/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rebar/rebar3/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rebar/rebar3/teams","hooks_url":"https://api.github.com/repos/rebar/rebar3/hooks","issue_events_url":"https://api.github.com/repos/rebar/rebar3/issues/events{/number}","events_url":"https://api.github.com/repos/rebar/rebar3/events","assignees_url":"https://api.github.com/repos/rebar/rebar3/assignees{/user}","branches_url":"https://api.github.com/repos/rebar/rebar3/branches{/branch}","tags_url":"https://api.github.com/repos/rebar/rebar3/tags","blobs_url":"https://api.github.com/repos/rebar/rebar3/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rebar/rebar3/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rebar/rebar3/git/refs{/sha}","trees_url":"https://api.github.com/repos/rebar/rebar3/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rebar/rebar3/statuses/{sha}","languages_url":"https://api.github.com/repos/rebar/rebar3/languages","stargazers_url":"https://api.github.com/repos/rebar/rebar3/stargazers","contributors_url":"https://api.github.com/repos/rebar/rebar3/contributors","subscribers_url":"https://api.github.com/repos/rebar/rebar3/subscribers","subscription_url":"https://api.github.com/repos/rebar/rebar3/subscription","commits_url":"https://api.github.com/repos/rebar/rebar3/commits{/sha}","git_commits_url":"https://api.github.com/repos/rebar/rebar3/git/commits{/sha}","comments_url":"https://api.github.com/repos/rebar/rebar3/comments{/number}","issue_comment_url":"https://api.github.com/repos/rebar/rebar3/issues/comments{/number}","contents_url":"https://api.github.com/repos/rebar/rebar3/contents/{+path}","compare_url":"https://api.github.com/repos/rebar/rebar3/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rebar/rebar3/merges","archive_url":"https://api.github.com/repos/rebar/rebar3/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rebar/rebar3/downloads","issues_url":"https://api.github.com/repos/rebar/rebar3/issues{/number}","pulls_url":"https://api.github.com/repos/rebar/rebar3/pulls{/number}","milestones_url":"https://api.github.com/repos/rebar/rebar3/milestones{/number}","notifications_url":"https://api.github.com/repos/rebar/rebar3/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rebar/rebar3/labels{/name}","releases_url":"https://api.github.com/repos/rebar/rebar3/releases{/id}","created_at":"2014-11-13T22:02:03Z","updated_at":"2015-04-07T07:05:09Z","pushed_at":"2015-04-09T15:07:13Z","git_url":"git://github.com/rebar/rebar3.git","ssh_url":"git@github.com:rebar/rebar3.git","clone_url":"https://github.com/rebar/rebar3.git","svn_url":"https://github.com/rebar/rebar3","homepage":"  http://www.rebar3.org","size":6145,"stargazers_count":115,"watchers_count":115,"language":"Erlang","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":28,"mirror_url":null,"open_issues_count":14,"forks":28,"open_issues":14,"watchers":115,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rebar/rebar3/pulls/323"},"html":{"href":"https://github.com/rebar/rebar3/pull/323"},"issue":{"href":"https://api.github.com/repos/rebar/rebar3/issues/323"},"comments":{"href":"https://api.github.com/repos/rebar/rebar3/issues/323/comments"},"review_comments":{"href":"https://api.github.com/repos/rebar/rebar3/pulls/323/comments"},"review_comment":{"href":"https://api.github.com/repos/rebar/rebar3/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/rebar/rebar3/pulls/323/commits"},"statuses":{"href":"https://api.github.com/repos/rebar/rebar3/statuses/39a4ca0c041543aba68740c8e92af1b2af7be883"}}}}