소스 검색

Fix dupes in deps provider, support atom pkgs

Whenever files were being locked *and* provided in rebar.config
duplicates could be printed. This is taken care of.

Also whenever atom packages were being used, they would cause the merge
step to fail. The new format does proper name-based deduplication of
resources, giving priority to locks to work.

ModificatioN/needs-update support is still in.

This may also act as a fix for #341, if automation isn't required too
much.
pull/384/head
Fred Hebert 10 년 전
부모
커밋
b3c14675c1
1개의 변경된 파일45개의 추가작업 그리고 48개의 파일을 삭제
  1. +45
    -48
      src/rebar_prv_deps.erl

+ 45
- 48
src/rebar_prv_deps.erl 파일 보기

@ -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"}}]}
]).

불러오는 중...
취소
저장