|
|
@ -13,14 +13,18 @@ |
|
|
|
|
|
|
|
-spec init(rebar_state:t()) -> {ok, rebar_state:t()}. |
|
|
|
init(State) -> |
|
|
|
State1 = rebar_state:add_provider(State, providers:create([{name, ?PROVIDER}, |
|
|
|
{module, ?MODULE}, |
|
|
|
{bare, true}, |
|
|
|
{deps, ?DEPS}, |
|
|
|
{example, "rebar3 deps"}, |
|
|
|
{short_desc, "List dependencies"}, |
|
|
|
{desc, info("List dependencies")}, |
|
|
|
{opts, []}])), |
|
|
|
State1 = rebar_state:add_provider( |
|
|
|
State, |
|
|
|
providers:create([ |
|
|
|
{name, ?PROVIDER}, |
|
|
|
{module, ?MODULE}, |
|
|
|
{bare, true}, |
|
|
|
{deps, ?DEPS}, |
|
|
|
{example, "rebar3 deps"}, |
|
|
|
{short_desc, "List dependencies"}, |
|
|
|
{desc, "List dependencies. Those not matching lock files " |
|
|
|
"are followed by an asterisk (*)."}, |
|
|
|
{opts, []}])), |
|
|
|
{ok, State1}. |
|
|
|
|
|
|
|
-spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}. |
|
|
@ -44,21 +48,49 @@ display(State, Profile, Deps) -> |
|
|
|
display_deps(State, Deps), |
|
|
|
?CONSOLE("", []). |
|
|
|
|
|
|
|
merge(Deps, Deps) -> |
|
|
|
Deps; |
|
|
|
merge(Deps, SourceDeps) -> |
|
|
|
merge1(dedup([normalize(Dep) || Dep <- Deps]), |
|
|
|
[normalize(Dep) || Dep <- SourceDeps]). |
|
|
|
|
|
|
|
normalize(Name) when is_binary(Name) -> |
|
|
|
Name; |
|
|
|
normalize(Name) when is_atom(Name) -> |
|
|
|
ec_cnv:to_binary(Name); |
|
|
|
normalize(Dep) when is_tuple(Dep) -> |
|
|
|
Name = element(1, Dep), |
|
|
|
setelement(1, Dep, normalize(Name)). |
|
|
|
|
|
|
|
merge1(Deps, SourceDeps) -> |
|
|
|
Names = [name(Dep) || Dep <- Deps], |
|
|
|
ToAdd = [Dep || Dep <- SourceDeps, |
|
|
|
not lists:keymember(ec_cnv:to_binary(element(1,Dep)), 1, Deps)], |
|
|
|
not lists:member(name(Dep), Names)], |
|
|
|
Deps ++ ToAdd. |
|
|
|
|
|
|
|
%% Keep the latter one as locks come after regular deps in the list. |
|
|
|
%% This is totally not safe as an assumption, but it's what we got. |
|
|
|
%% We do this by comparing the current element and looking if a |
|
|
|
%% similar named one happens later. If so, drop the current one. |
|
|
|
dedup(Deps) -> dedup(Deps, [name(Dep) || Dep <- Deps]). |
|
|
|
|
|
|
|
dedup([], []) -> []; |
|
|
|
dedup([Dep|Deps], [Name|DepNames]) -> |
|
|
|
case lists:member(Name, DepNames) of |
|
|
|
true -> dedup(Deps, DepNames); |
|
|
|
false -> [Dep | dedup(Deps, DepNames)] |
|
|
|
end. |
|
|
|
|
|
|
|
name(T) when is_tuple(T) -> element(1, T); |
|
|
|
name(B) when is_binary(B) -> B. |
|
|
|
|
|
|
|
|
|
|
|
display_deps(State, Deps) -> |
|
|
|
lists:foreach(fun(Dep) -> display_dep(State, Dep) end, Deps). |
|
|
|
|
|
|
|
%% packages |
|
|
|
display_dep(_State, {Name, Vsn}) when is_list(Vsn) -> |
|
|
|
?CONSOLE("~s* (package ~s)", [ec_cnv:to_binary(Name), ec_cnv:to_binary(Vsn)]); |
|
|
|
display_dep(_State, Name) when is_atom(Name) -> |
|
|
|
?CONSOLE("~s* (package)", [ec_cnv:to_binary(Name)]); |
|
|
|
display_dep(_State, Name) when is_binary(Name) -> |
|
|
|
?CONSOLE("~s* (package)", [Name]); |
|
|
|
%% git source |
|
|
|
display_dep(_State, {Name, Source}) when is_tuple(Source), element(1, Source) =:= git -> |
|
|
|
?CONSOLE("~s* (git source)", [ec_cnv:to_binary(Name)]); |
|
|
@ -98,38 +130,3 @@ display_dep(State, {Name, Source, Level}) when is_tuple(Source), is_integer(Leve |
|
|
|
false -> "" |
|
|
|
end, |
|
|
|
?CONSOLE("~s~s (locked ~p)", [Name, NeedsUpdate, Source]). |
|
|
|
|
|
|
|
info(Description) -> |
|
|
|
io_lib:format("~s.~n" |
|
|
|
"~n" |
|
|
|
"Valid rebar.config options:~n" |
|
|
|
" ~p~n" |
|
|
|
" ~p~n" |
|
|
|
"Valid command line options:~n" |
|
|
|
" deps_dir=\"deps\" (override default or rebar.config deps_dir)~n", |
|
|
|
[ |
|
|
|
Description, |
|
|
|
{deps_dir, "deps"}, |
|
|
|
{deps, |
|
|
|
[app_name, |
|
|
|
{rebar, "1.0.*"}, |
|
|
|
{rebar, ".*", |
|
|
|
{git, "git://github.com/rebar/rebar.git"}}, |
|
|
|
{rebar, ".*", |
|
|
|
{git, "git://github.com/rebar/rebar.git", "Rev"}}, |
|
|
|
{rebar, "1.0.*", |
|
|
|
{git, "git://github.com/rebar/rebar.git", {branch, "master"}}}, |
|
|
|
{rebar, "1.0.0", |
|
|
|
{git, "git://github.com/rebar/rebar.git", {tag, "1.0.0"}}}, |
|
|
|
{rebar, "", |
|
|
|
{git, "git://github.com/rebar/rebar.git", {branch, "master"}}, |
|
|
|
[raw]}, |
|
|
|
{app_name, ".*", {hg, "https://www.example.org/url"}}, |
|
|
|
{app_name, ".*", {rsync, "Url"}}, |
|
|
|
{app_name, ".*", {svn, "https://www.example.org/url"}}, |
|
|
|
{app_name, ".*", {svn, "svn://svn.example.org/url"}}, |
|
|
|
{app_name, ".*", {bzr, "https://www.example.org/url", "Rev"}}, |
|
|
|
{app_name, ".*", {fossil, "https://www.example.org/url"}}, |
|
|
|
{app_name, ".*", {fossil, "https://www.example.org/url", "Vsn"}}, |
|
|
|
{app_name, ".*", {p4, "//depot/subdir/app_dir"}}]} |
|
|
|
]). |