@@ -43,41 +43,60 @@ defmodule Mix.Dep.Converger do
4343 """
4444 def all ( acc , lock , opts , callback ) do
4545 main = Mix.Dep.Loader . children ( opts )
46+ main = Enum . map ( main , & ( % { & 1 | top_level: true } ) )
4647 apps = Enum . map ( main , & ( & 1 . app ) )
4748 converger = Mix.RemoteConverger . get
4849
4950 # Run converger for all dependencies not handled by remote
5051 # converger. If `rest` is not nil we know dependencies are
5152 # being updated or fetched for the first time (only then do
5253 # we want the remote converger to run)
53- result =
54+ { deps , rest , lock } =
5455 all ( main , [ ] , [ ] , apps , callback , acc , lock , fn dep ->
5556 if not nil? ( lock ) && converger && converger . remote? ( dep ) do
5657 { :loaded , dep }
5758 else
58- { :unloaded , dep }
59+ { :unloaded , dep , nil }
5960 end
6061 end )
6162
6263 # Run remote converger if one is available and rerun mix's
6364 # converger with the new information
64- case converger && result do
65- { deps , rest , lock } when not nil? ( lock ) ->
66- new_lock = converger . converge ( main , lock )
65+ if converger do
66+ Code . ensure_loaded? ( converger )
6767
68- deps = deps
69- |> Enum . reject ( & converger . remote? ( & 1 ) )
70- |> Enum . into ( HashDict . new , & { & 1 . app , & 1 } )
68+ unless function_exported? ( converger , :deps , 2 ) do
69+ raise Mix.Error , message: "Update Hex to the latest version"
70+ end
71+
72+ # If there is a lock, it means we are doing a get/update
73+ # and we need to hit the remote converger which do external
74+ # requests and what not. In case of deps.check, deps and so
75+ # on, there is no lock, so we won't hit this branch.
76+ if lock do
77+ lock = converger . converge ( deps , lock )
78+ end
7179
72- all ( main , [ ] , [ ] , apps , callback , rest , new_lock , fn dep ->
73- if cached = deps [ dep . app ] do
80+ deps = deps
81+ |> Enum . reject ( & converger . remote? ( & 1 ) )
82+ |> Enum . into ( HashDict . new , & { & 1 . app , & 1 } )
83+
84+ # In case there is no lock, we will read the current lock
85+ # which is potentially stale. So converger.deps needs to
86+ # always check if the data it finds on the lock is actually
87+ # valid.
88+ lock_for_converger = lock || Mix.Dep.Lock . read
89+
90+ all ( main , [ ] , [ ] , apps , callback , rest , lock , fn dep ->
91+ cond do
92+ cached = deps [ dep . app ] ->
7493 { :loaded , cached }
75- else
76- { :unloaded , dep }
77- end
78- end )
79- _ ->
80- result
94+ true ->
95+ { :unloaded , dep , converger . deps ( dep , lock_for_converger ) }
96+ end
97+ end )
98+ else
99+ { deps , rest , lock }
81100 end
82101 end
83102
@@ -129,13 +148,13 @@ defmodule Mix.Dep.Converger do
129148 case cache . ( dep ) do
130149 { :loaded , cached_dep } ->
131150 cached_dep
132- { :unloaded , dep } ->
151+ { :unloaded , dep , children } ->
133152 { dep , rest , lock } = callback . ( dep , rest , lock )
134153
135154 # After we invoke the callback (which may actually check out the
136155 # dependency), we load the dependency including its latest info
137156 # and children information.
138- Mix.Dep.Loader . load ( dep )
157+ Mix.Dep.Loader . load ( dep , children )
139158 end
140159
141160 dep = % { dep | deps: reject_non_fullfilled_optional ( dep . deps , current_breadths ) }
0 commit comments