summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFred Hebert <mononcqc@ferd.ca>2014-12-06 18:56:47 -0500
committerFred Hebert <mononcqc@ferd.ca>2014-12-06 18:56:47 -0500
commitfb98dde7ecb894fe74055449dcaea77aa237115b (patch)
tree95feb148cd7c33f46b15ec7fa60edd02ae46cfa0 /src
parentd5907ad9b932feaf7fdf1cdbb4319226ef22ea78 (diff)
parentbe39ab9e7bd1553132def2a1e89f1ce38f6f2fcc (diff)
Merge pull request #44 from rebar/fix-circular-deps
Partial fix to circular deps (#40)
Diffstat (limited to 'src')
-rw-r--r--src/rebar_digraph.erl10
-rw-r--r--src/rebar_prv_install_deps.erl14
2 files changed, 20 insertions, 4 deletions
diff --git a/src/rebar_digraph.erl b/src/rebar_digraph.erl
index bb031cb..dbcf649 100644
--- a/src/rebar_digraph.erl
+++ b/src/rebar_digraph.erl
@@ -18,7 +18,15 @@ compile_order(Apps) ->
end, Apps),
case digraph_utils:topsort(Graph) of
false ->
- {error, no_sort};
+ case digraph_utils:is_acyclic(Graph) of
+ true ->
+ {error, no_sort};
+ false ->
+ Cycles = lists:sort(
+ [lists:sort(Comp) || Comp <- digraph_utils:strong_components(Graph),
+ length(Comp)>1]),
+ {error, {cycles, Cycles}}
+ end;
V ->
{ok, names_to_apps(lists:reverse(V), Apps)}
end.
diff --git a/src/rebar_prv_install_deps.erl b/src/rebar_prv_install_deps.erl
index a3ffc66..1be094c 100644
--- a/src/rebar_prv_install_deps.erl
+++ b/src/rebar_prv_install_deps.erl
@@ -81,6 +81,8 @@ do(State) ->
{ok, rebar_state:deps_to_build(State1,
lists:dropwhile(fun rebar_app_info:valid/1
, Sort -- ProjectApps))};
+ {error, {cycles, Cycles}} ->
+ {error, {?MODULE, {cycles, Cycles}}};
{error, Error} ->
{error, Error}
end
@@ -91,6 +93,12 @@ do(State) ->
end.
-spec format_error(any()) -> iolist().
+format_error({cycles, Cycles}) ->
+ Prints = [["applications: ",
+ [io_lib:format("~s ", [Dep]) || Dep <- Cycle],
+ "depend on each other~n"]
+ || Cycle <- Cycles],
+ ["Dependency cycle(s) detected:~n", Prints];
format_error(Reason) ->
io_lib:format("~p", [Reason]).
@@ -151,7 +159,7 @@ update_pkg_deps(Pkgs, Packages, Update, Seen, State) ->
,Packages
,Pkg),
{SeenAcc1, StateAcc1} = maybe_lock(AppInfo, SeenAcc, StateAcc),
- case maybe_fetch(StateAcc1, AppInfo, Update, SeenAcc) of
+ case maybe_fetch(StateAcc1, AppInfo, Update, SeenAcc1) of
true ->
{[AppInfo | Acc], SeenAcc1, StateAcc1};
false ->
@@ -167,7 +175,7 @@ maybe_lock(AppInfo, Seen, State) ->
{sets:add_element(Name, Seen),
rebar_state:lock(State, AppInfo)};
true ->
- {sets:add_element(Name, Seen), State}
+ {Seen, State}
end.
package_to_app(DepsDir, Packages, {Name, Vsn}) ->
@@ -204,7 +212,7 @@ update_src_deps(Level, SrcDeps, PkgDeps, SrcApps, State, Update, Seen) ->
,Level
,StateAcc1);
_ ->
- maybe_fetch(StateAcc, AppInfo, false, SeenAcc),
+ maybe_fetch(StateAcc, AppInfo, false, SeenAcc1),
handle_dep(AppInfo
,SrcDepsAcc
,PkgDepsAcc