@@ -213,7 +213,8 @@ defmodule Mix.Dep.Converger do
213213 in_upper? && other_opts [ :override ] ->
214214 { other |> with_matching_only ( dep , in_upper? ) , true }
215215 converge? ( other , dep ) ->
216- { other |> with_matching_only ( dep , in_upper? ) |> with_matching_req ( dep ) |> merge_manager ( dep ) , true }
216+ { other |> with_matching_only ( dep , in_upper? )
217+ |> with_matching_req ( dep ) |> merge_manager ( dep , in_upper? ) , true }
217218 true ->
218219 tag = if in_upper? , do: :overridden , else: :diverged
219220 { % { other | status: { tag , dep } } , true }
@@ -276,19 +277,10 @@ defmodule Mix.Dep.Converger do
276277 end
277278 end
278279
279- defp converge? ( % Mix.Dep { scm: scm1 , manager: manager1 , opts: opts1 } ,
280- % Mix.Dep { scm: scm2 , manager: manager2 , opts: opts2 } ) do
281- scm1 == scm2 and
282- manager_equal? ( manager1 , manager2 ) and
283- opts_equal? ( opts1 , opts2 ) and
284- scm1 . equal? ( opts1 , opts2 )
280+ defp converge? ( % Mix.Dep { scm: scm1 , opts: opts1 } , % Mix.Dep { scm: scm2 , opts: opts2 } ) do
281+ scm1 == scm2 and opts_equal? ( opts1 , opts2 ) and scm1 . equal? ( opts1 , opts2 )
285282 end
286283
287- defp manager_equal? ( manager , manager ) , do: true
288- defp manager_equal? ( _ , nil ) , do: true
289- defp manager_equal? ( nil , _ ) , do: true
290- defp manager_equal? ( _ , _ ) , do: false
291-
292284 defp opts_equal? ( opts1 , opts2 ) do
293285 keys = ~w( app env compile) a
294286 Enum . all? ( keys , & ( Keyword . fetch ( opts1 , & 1 ) == Keyword . fetch ( opts2 , & 1 ) ) )
@@ -300,8 +292,18 @@ defmodule Mix.Dep.Converger do
300292 end
301293 end
302294
303- defp merge_manager ( other , dep ) do
304- % { other | manager: other . manager || dep . manager }
295+ defp merge_manager ( % { manager: other_manager } = other , % { manager: manager } , in_upper? ) do
296+ % { other | manager: sort_manager ( other_manager , manager , in_upper? ) }
297+ end
298+
299+ @ managers [ :mix , :rebar3 , :rebar , :make ]
300+
301+ defp sort_manager ( other_manager , manager , true ) do
302+ other_manager || manager
303+ end
304+ defp sort_manager ( other_manager , manager , false ) do
305+ priority = @ managers -- ( @ managers -- ( List . wrap ( other_manager ) ++ List . wrap ( manager ) ) )
306+ List . first ( priority ) || other_manager || manager
305307 end
306308
307309 defp with_matching_req ( % Mix.Dep { } = other , % Mix.Dep { } = dep ) do
0 commit comments