diff options
author | Jose M Perez <jose.m.perez.ramos+git@gmail.com> | 2019-03-29 21:26:50 +0100 |
---|---|---|
committer | Jose M Perez <jose.m.perez.ramos+git@gmail.com> | 2019-04-01 22:06:33 +0200 |
commit | ff65877f84e09edf47a699c4556da8802d3665a7 (patch) | |
tree | 34a08d06cdf91d775b8bd92432932b30fd7e5df2 /src | |
parent | cbcaa5587948a01f4a3bdeaf1f92cec8327b77bf (diff) |
Refactor deps command to show lock vs config file
Deps command shows an * if the local state of the dependencies do not
match the config file, highlighting the differences between the lock
file and the config file if there are any.
Diffstat (limited to 'src')
-rw-r--r-- | src/rebar_app_utils.erl | 1 | ||||
-rw-r--r-- | src/rebar_prv_deps.erl | 141 |
2 files changed, 108 insertions, 34 deletions
diff --git a/src/rebar_app_utils.erl b/src/rebar_app_utils.erl index 5fe5ba6..0ea6ad8 100644 --- a/src/rebar_app_utils.erl +++ b/src/rebar_app_utils.erl @@ -34,6 +34,7 @@ validate_application_info/2, parse_deps/5, parse_deps/6, + parse_dep/6, expand_deps_sources/2, dep_to_app/7, format_error/1]). diff --git a/src/rebar_prv_deps.erl b/src/rebar_prv_deps.erl index d8f22d9..5443ab5 100644 --- a/src/rebar_prv_deps.erl +++ b/src/rebar_prv_deps.erl @@ -9,7 +9,7 @@ -include("rebar.hrl"). -define(PROVIDER, deps). --define(DEPS, [app_discovery]). +-define(DEPS, [install_deps]). -spec init(rebar_state:t()) -> {ok, rebar_state:t()}. init(State) -> @@ -22,54 +22,127 @@ init(State) -> {deps, ?DEPS}, {example, "rebar3 deps"}, {short_desc, "List dependencies"}, - {desc, "List dependencies. Those not matching lock files " - "are followed by an asterisk (*)."}, + {desc, "List dependencies. Those not matching " + "the config file are followed by " + "an asterisk (*)."}, {opts, []}])), {ok, State1}. + -spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}. do(State) -> Profiles = rebar_state:current_profiles(State), - [display(State, Profile, rebar_state:get(State, {parsed_deps, Profile}, [])) - || Profile <- Profiles], + [display(State, Profile) || Profile <- Profiles], {ok, State}. + -spec format_error(any()) -> iolist(). format_error(Reason) -> io_lib:format("~p", [Reason]). -display(State, default, Deps) -> - display_deps(State, Deps), + +display(State, Profile = default) -> + display_profile_deps(State, Profile), ?CONSOLE("", []); -display(State, Profile, Deps) -> +display(State, Profile) -> ?CONSOLE("-- ~p --", [Profile]), - display(State, default, Deps). - -display_deps(State, Deps) -> - lists:foreach(fun(Dep) -> display_dep(State, Dep) end, Deps). - -display_dep(State, Dep) -> - DepWithSource = rebar_app_utils:expand_deps_sources(Dep, State), - - Name = rebar_utils:to_binary(rebar_app_info:name(DepWithSource)), - NeedsUpdateSuffix = case rebar_fetch:needs_update(DepWithSource, State) of - true -> "*"; - false -> "" - end, - IsLockedPrefix = case rebar_app_info:is_lock(DepWithSource) of - true -> "locked "; - _ -> "" - end, - CommonConsoleArgs = [Name, NeedsUpdateSuffix, IsLockedPrefix], - - Source = rebar_app_info:source(DepWithSource), - case Source of - {pkg, _Name, Vsn, _Hash, _RepoConfig} -> - VsnBinary = rebar_utils:to_binary(Vsn), - ?CONSOLE("~ts~ts (~tspackage ~ts)", CommonConsoleArgs ++ [VsnBinary]); + display_profile_deps(State, Profile), + ?CONSOLE("", []). + + +display_profile_deps(State, Profile) -> + DepsDir = rebar_prv_install_deps:profile_dep_dir(State, Profile), + + ProfileDeps = rebar_state:get(State, {deps, Profile}, []), + % ProfileDeps include those deps from rebar.lock that have been + % removed from rebar.config + ConfiguredDeps = [parse_dep_without_locks(DepsDir, Dep, State) + || Dep <- ProfileDeps], + LockedDepsMap = locked_deps_map(State, Profile), + [display_dep(State, Dep, LockedDepsMap) || Dep <- ConfiguredDeps]. + + +parse_dep_without_locks(DepsDir, Dep, State) -> + ParsedDep = rebar_app_utils:parse_dep(Dep, root, DepsDir, State, [], 0), + case Dep of + {_Name, Src, Level} when is_tuple(Src), is_integer(Level) -> + % This Dep is not in rebar.config but in rebar.lock + rebar_app_info:source(ParsedDep, undefined); _ -> - ?CONSOLE("~ts~ts (~ts~ts source)", CommonConsoleArgs ++ [type(Source)]) + rebar_app_utils:expand_deps_sources(ParsedDep, State) end. -type(Source) when is_tuple(Source) -> element(1, Source). + +locked_deps_map(State, Profile) -> + ParsedDeps = rebar_state:get(State, {parsed_deps, Profile}, []), + lists:foldl(fun(Dep, DepsIn) -> + case rebar_app_info:is_lock(Dep) of + true -> + DepName = rebar_app_info:name(Dep), + DepsIn#{rebar_utils:to_binary(DepName) => Dep}; + _ -> + DepsIn + end + end, #{}, ParsedDeps). + + +display_dep(State, Dep, LockedDeps) -> + Name = rebar_utils:to_binary(rebar_app_info:name(Dep)), + NeedsUpdate = rebar_fetch:needs_update(Dep, State), + Source = rebar_app_info:source(Dep), + LockedSource = case maps:get(Name, LockedDeps, undefined) of + undefined -> undefined; + LockedDep -> rebar_app_info:source(LockedDep) + end, + + display_dep_line(Name, NeedsUpdate, source_text(LockedSource), source_text(Source)). + + +% Dep is a checkout +display_dep_line(Name, _NeedsUpdate, _LockedSource, Source = checkout) -> + ?CONSOLE("~ts* (~ts)", [Name, Source]); + +% Dep exists only in lock file +display_dep_line(Name, _NeedsUpdate, LockedSource, _Source = undefined) -> + ?CONSOLE("~ts* (locked ~ts <> none)", [Name, LockedSource]); + +% Dep not locked, report whether the disk copy matches the Source +display_dep_line(Name, true, undefined, Source) -> + ?CONSOLE("~ts* (~ts)", [Name, Source]); +display_dep_line(Name, _, undefined, Source) -> + ?CONSOLE("~ts (~ts)", [Name, Source]); + +% Dep locked, install_deps provider should have had updated the disk copy with +% the locked version +display_dep_line(Name, false, _LockedSource, Source) -> + % dep locked and no need to update (LockedSource and Source might not match + % because of one using {ref, X} and the other {tag, Y}) + ?CONSOLE("~ts (locked ~ts)", [Name, Source]); +display_dep_line(Name, _NeedsUpdate, LockedSource, Source) -> + % dep locked with mismatching lock and config files + ?CONSOLE("~ts* (locked ~ts <> ~ts)", [Name, LockedSource, Source]). + + +source_text(Source) when is_list(Source); is_atom(Source) -> + Source; +source_text({pkg, _Name, Vsn, _Hash, _RepoConfig}) -> + source_text({pkg, _Name, Vsn, _Hash}); +source_text({pkg, _Name, Vsn, _Hash}) -> + [<<"package">>, " ", rebar_utils:to_binary(Vsn)]; +source_text(Source) when is_tuple(Source), tuple_size(Source) < 3 -> + element(1, Source); +source_text(Source) when is_tuple(Source) -> + Type = element(1, Source), + case element(3, Source) of + {ref , Ref} -> + SmallRef = case rebar_utils:to_binary(Ref) of + <<R:7/binary, _/binary>> -> <<R/binary, "...">>; + R -> R + end, + [atom_to_binary(Type, unicode), " source ", SmallRef]; + {_ , Vsn} -> + [atom_to_binary(Type, unicode), " source ", rebar_utils:to_binary(Vsn)]; + _ -> + [atom_to_binary(Type, unicode), " source"] + end. |