summaryrefslogtreecommitdiff
path: root/src/rebar_prv_upgrade.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/rebar_prv_upgrade.erl')
-rw-r--r--src/rebar_prv_upgrade.erl32
1 files changed, 20 insertions, 12 deletions
diff --git a/src/rebar_prv_upgrade.erl b/src/rebar_prv_upgrade.erl
index 37914a7..05845e4 100644
--- a/src/rebar_prv_upgrade.erl
+++ b/src/rebar_prv_upgrade.erl
@@ -91,29 +91,38 @@ parse_names(Bin, Locks) ->
prepare_locks([], _, Locks, Unlocks) ->
{Locks, Unlocks};
prepare_locks([Name|Names], Deps, Locks, Unlocks) ->
+ AtomName = binary_to_atom(Name, utf8),
case lists:keyfind(Name, 1, Locks) of
{_, _, 0} = Lock ->
- AtomName = binary_to_atom(Name, utf8),
case lists:keyfind(AtomName, 1, Deps) of
false ->
?PRV_ERROR({unknown_dependency, Name});
Dep ->
- Source = case Dep of
- {_, Src} -> Src;
- {_, _, Src} -> Src
- end,
- {NewLocks, NewUnlocks} = unlock_higher_than(0, Locks -- [Lock]),
- prepare_locks(Names,
- Deps,
- NewLocks,
+ {Source, NewLocks, NewUnlocks} = prepare_lock(Dep, Lock, Locks),
+ prepare_locks(Names, Deps, NewLocks,
+ [{Name, Source, 0} | NewUnlocks ++ Unlocks])
+ end;
+ {_, _, Level} = Lock when Level > 0 ->
+ case lists:keyfind(AtomName, 1, Deps) of
+ false ->
+ ?PRV_ERROR({transitive_dependency, Name});
+ Dep -> % Dep has been promoted
+ {Source, NewLocks, NewUnlocks} = prepare_lock(Dep, Lock, Locks),
+ prepare_locks(Names, Deps, NewLocks,
[{Name, Source, 0} | NewUnlocks ++ Unlocks])
end;
- {_, _, Level} when Level > 0 ->
- ?PRV_ERROR({transitive_dependency, Name});
false ->
?PRV_ERROR({unknown_dependency, Name})
end.
+prepare_lock(Dep, Lock, Locks) ->
+ Source = Source = case Dep of
+ {_, Src} -> Src;
+ {_, _, Src} -> Src
+ end,
+ {NewLocks, NewUnlocks} = unlock_higher_than(0, Locks -- [Lock]),
+ {Source, NewLocks, NewUnlocks}.
+
top_level_deps(Deps, Locks) ->
[Dep || Dep <- Deps, lists:keymember(0, 3, Locks)].
@@ -131,4 +140,3 @@ info_useless(Old, New) ->
|| Name <- Old,
not lists:member(Name, New)],
ok.
-