summaryrefslogtreecommitdiff
path: root/src/rebar_prv_deps.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/rebar_prv_deps.erl')
-rw-r--r--src/rebar_prv_deps.erl35
1 files changed, 29 insertions, 6 deletions
diff --git a/src/rebar_prv_deps.erl b/src/rebar_prv_deps.erl
index be81c31..dc356a8 100644
--- a/src/rebar_prv_deps.erl
+++ b/src/rebar_prv_deps.erl
@@ -24,16 +24,25 @@ init(State) ->
{short_desc, "List dependencies"},
{desc, "List dependencies. Those not matching lock files "
"are followed by an asterisk (*)."},
- {opts, []}])),
+ {opts, [{tree, $t, "tree", undefined, "Display package dependencies in tree format (git and hg deps not supported)."}]}])),
{ok, State1}.
-spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}.
do(State) ->
- Profiles = rebar_state:current_profiles(State),
- List = [{Profile, rebar_state:get(State, {deps, Profile}, [])}
- || Profile <- Profiles],
- [display(State, Profile, Deps) || {Profile, Deps} <- List],
- {ok, State}.
+ case display_tree(State) of
+ true ->
+ {_Packages, Graph} = rebar_state:packages(State),
+ List = merge_deps_per_profile(State),
+ {_SrcDeps, PkgDeps} = rebar_prv_install_deps:parse_deps("", List, State, [], 0),
+ rebar_digraph:print_solution(Graph, PkgDeps),
+ {ok, State};
+ false ->
+ Profiles = rebar_state:current_profiles(State),
+ List = [{Profile, rebar_state:get(State, {deps, Profile}, [])}
+ || Profile <- Profiles],
+ [display(State, Profile, Deps) || {Profile, Deps} <- List],
+ {ok, State}
+ end.
-spec format_error(any()) -> iolist().
format_error(Reason) ->
@@ -116,3 +125,17 @@ display_dep(State, {Name, Source, Level}) when is_tuple(Source), is_integer(Leve
?CONSOLE("~s~s (locked ~s source)", [Name, NeedsUpdate, type(Source)]).
type(Source) when is_tuple(Source) -> element(1, Source).
+
+display_tree(State) ->
+ {Args, _} = rebar_state:command_parsed_args(State),
+ proplists:get_value(tree, Args, false).
+
+merge_deps_per_profile(State) ->
+ Profiles = rebar_state:current_profiles(State),
+ lists:foldl(fun(Profile, Deps) ->
+ D = rebar_utils:deps_to_binary(rebar_state:get(State, {deps, Profile}, [])),
+ D1 = rebar_utils:tup_sort(D),
+ rebar_utils:tup_dedup(
+ rebar_utils:tup_umerge(D1
+ ,Deps))
+ end, [], Profiles).