Browse Source

Merge pull request #2335 from pablocostass/2334_improve_checkout_deps_warnings

Improve warnings about checkout dependencies when locking and upgrading
pull/2336/head
Tristan Sloughter 4 years ago
committed by GitHub
parent
commit
68dc4d271b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 36 additions and 11 deletions
  1. +9
    -1
      src/rebar_prv_lock.erl
  2. +19
    -10
      src/rebar_prv_upgrade.erl
  3. +4
    -0
      src/rebar_state.erl
  4. +4
    -0
      test/rebar_compile_SUITE.erl

+ 9
- 1
src/rebar_prv_lock.erl View File

@ -38,9 +38,13 @@ do(State) ->
rebar_config:maybe_write_lock_file(filename:join(Dir, ?LOCK_FILE), Locks, OldLocks), rebar_config:maybe_write_lock_file(filename:join(Dir, ?LOCK_FILE), Locks, OldLocks),
State1 = rebar_state:set(State, {locks, default}, Locks), State1 = rebar_state:set(State, {locks, default}, Locks),
OldLockNames = [element(1,L) || L <- OldLocks],
Checkouts = [rebar_app_info:name(Dep) || Dep <- rebar_state:all_checkout_deps(State)],
%% Remove the checkout dependencies from the old lock info
%% so that they do not appear in the rebar_utils:info_useless/1 warning.
OldLockNames = [element(1,L) || L <- OldLocks] -- Checkouts,
NewLockNames = [element(1,L) || L <- Locks], NewLockNames = [element(1,L) || L <- Locks],
rebar_utils:info_useless(OldLockNames, NewLockNames), rebar_utils:info_useless(OldLockNames, NewLockNames),
info_checkout_deps(Checkouts),
{ok, State1}; {ok, State1};
_ -> _ ->
@ -60,3 +64,7 @@ build_locks(State) ->
rebar_fetch:lock_source(Dep, State), rebar_fetch:lock_source(Dep, State),
rebar_app_info:dep_level(Dep)} rebar_app_info:dep_level(Dep)}
end || Dep <- AllDeps, not(rebar_app_info:is_checkout(Dep))]. end || Dep <- AllDeps, not(rebar_app_info:is_checkout(Dep))].
info_checkout_deps(Checkouts) ->
[?INFO("App ~ts is a checkout dependency and cannot be locked.", [CheckoutDep])
|| CheckoutDep <- Checkouts].

+ 19
- 10
src/rebar_prv_upgrade.erl View File

@ -86,7 +86,8 @@ do_(State) ->
DepsDict = deps_dict(rebar_state:all_deps(State)), DepsDict = deps_dict(rebar_state:all_deps(State)),
AltDeps = find_non_default_deps(Deps, State), AltDeps = find_non_default_deps(Deps, State),
FilteredNames = cull_default_names_if_profiles(Names, Deps, State), FilteredNames = cull_default_names_if_profiles(Names, Deps, State),
case prepare_locks(FilteredNames, Deps, Locks, [], DepsDict, AltDeps) of
Checkouts = [rebar_app_info:name(Dep) || Dep <- rebar_state:all_checkout_deps(State)],
case prepare_locks(FilteredNames, Deps, Locks, [], DepsDict, AltDeps, Checkouts) of
{error, Reason} -> {error, Reason} ->
{error, Reason}; {error, Reason};
{Locks0, Unlocks0} -> {Locks0, Unlocks0} ->
@ -123,6 +124,9 @@ format_error({transitive_dependency, Name}) ->
io_lib:format("Dependency ~ts is transitive and cannot be safely upgraded. " io_lib:format("Dependency ~ts is transitive and cannot be safely upgraded. "
"Promote it to your top-level rebar.config file to upgrade it.", "Promote it to your top-level rebar.config file to upgrade it.",
[Name]); [Name]);
format_error({checkout_dependency, Name}) ->
io_lib:format("Dependency ~ts is a checkout dependency under _checkouts/ and checkouts cannot be upgraded.",
[Name]);
format_error(Reason) -> format_error(Reason) ->
io_lib:format("~p", [Reason]). io_lib:format("~p", [Reason]).
@ -190,20 +194,20 @@ cull_default_names_if_profiles(Names, Deps, State) ->
end, Names) end, Names)
end. end.
prepare_locks([], _, Locks, Unlocks, _Dict, _AltDeps) ->
prepare_locks([], _, Locks, Unlocks, _Dict, _AltDeps, _Checkouts) ->
{Locks, Unlocks}; {Locks, Unlocks};
prepare_locks([Name|Names], Deps, Locks, Unlocks, Dict, AltDeps) ->
prepare_locks([Name|Names], Deps, Locks, Unlocks, Dict, AltDeps, Checkouts) ->
AtomName = binary_to_atom(Name, utf8), AtomName = binary_to_atom(Name, utf8),
case lists:keyfind(Name, 1, Locks) of case lists:keyfind(Name, 1, Locks) of
{_, _, 0} = Lock -> {_, _, 0} = Lock ->
case rebar_utils:tup_find(AtomName, Deps) of case rebar_utils:tup_find(AtomName, Deps) of
false -> false ->
?WARN("Dependency ~ts has been removed and will not be upgraded", [Name]), ?WARN("Dependency ~ts has been removed and will not be upgraded", [Name]),
prepare_locks(Names, Deps, Locks, Unlocks, Dict, AltDeps);
prepare_locks(Names, Deps, Locks, Unlocks, Dict, AltDeps, Checkouts);
Dep -> Dep ->
{Source, NewLocks, NewUnlocks} = prepare_lock(Dep, Lock, Locks, Dict), {Source, NewLocks, NewUnlocks} = prepare_lock(Dep, Lock, Locks, Dict),
prepare_locks(Names, Deps, NewLocks, prepare_locks(Names, Deps, NewLocks,
[{Name, Source, 0} | NewUnlocks ++ Unlocks], Dict, AltDeps)
[{Name, Source, 0} | NewUnlocks ++ Unlocks], Dict, AltDeps, Checkouts)
end; end;
{_, _, Level} = Lock when Level > 0 -> {_, _, Level} = Lock when Level > 0 ->
case rebar_utils:tup_find(AtomName, Deps) of case rebar_utils:tup_find(AtomName, Deps) of
@ -212,14 +216,19 @@ prepare_locks([Name|Names], Deps, Locks, Unlocks, Dict, AltDeps) ->
Dep -> % Dep has been promoted Dep -> % Dep has been promoted
{Source, NewLocks, NewUnlocks} = prepare_lock(Dep, Lock, Locks, Dict), {Source, NewLocks, NewUnlocks} = prepare_lock(Dep, Lock, Locks, Dict),
prepare_locks(Names, Deps, NewLocks, prepare_locks(Names, Deps, NewLocks,
[{Name, Source, 0} | NewUnlocks ++ Unlocks], Dict, AltDeps)
[{Name, Source, 0} | NewUnlocks ++ Unlocks], Dict, AltDeps, Checkouts)
end; end;
false -> false ->
case rebar_utils:tup_find(AtomName, AltDeps) of
case lists:member(atom_to_binary(AtomName, utf8), Checkouts) of
true ->
?PRV_ERROR({checkout_dependency, Name});
false -> false ->
?PRV_ERROR({unknown_dependency, Name});
_ -> % non-default profile dependency found, pass through
prepare_locks(Names, Deps, Locks, Unlocks, Dict, AltDeps)
case rebar_utils:tup_find(AtomName, AltDeps) of
false ->
?PRV_ERROR({unknown_dependency, Name});
_ -> % non-default profile dependency found, pass through
prepare_locks(Names, Deps, Locks, Unlocks, Dict, AltDeps, Checkouts)
end
end end
end. end.

+ 4
- 0
src/rebar_state.erl View File

@ -32,6 +32,7 @@
deps_to_build/1, deps_to_build/2, deps_to_build/1, deps_to_build/2,
all_plugin_deps/1, all_plugin_deps/2, update_all_plugin_deps/2, all_plugin_deps/1, all_plugin_deps/2, update_all_plugin_deps/2,
all_deps/1, all_deps/2, update_all_deps/2, merge_all_deps/2, all_deps/1, all_deps/2, update_all_deps/2, merge_all_deps/2,
all_checkout_deps/1,
namespace/1, namespace/2, namespace/1, namespace/2,
deps_names/1, deps_names/1,
@ -342,6 +343,9 @@ all_deps(#state_t{all_deps=Apps}) ->
all_deps(State=#state_t{}, NewApps) -> all_deps(State=#state_t{}, NewApps) ->
State#state_t{all_deps=NewApps}. State#state_t{all_deps=NewApps}.
all_checkout_deps(#state_t{all_deps=Apps}) ->
[App || App <- Apps, rebar_app_info:is_checkout(App)].
all_plugin_deps(#state_t{all_plugin_deps=Apps}) -> all_plugin_deps(#state_t{all_plugin_deps=Apps}) ->
Apps. Apps.

+ 4
- 0
test/rebar_compile_SUITE.erl View File

@ -461,6 +461,10 @@ paths_checkout_deps(Config) ->
{ok, State} = rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], return), {ok, State} = rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], return),
[AppName2] = rebar_state:all_checkout_deps(State),
Name2Bin = binary:list_to_bin(Name2),
Name2Bin = rebar_app_info:name(AppName2),
code:add_paths(rebar_state:code_paths(State, all_deps)), code:add_paths(rebar_state:code_paths(State, all_deps)),
ok = application:load(list_to_atom(Name2)), ok = application:load(list_to_atom(Name2)),
Loaded = application:loaded_applications(), Loaded = application:loaded_applications(),

Loading…
Cancel
Save