Skip to content

Commit 8b70e07

Browse files
committed
Merge pull request #2161 from ericmj/remote-converge-lock
Remote converger should receive and update lock
2 parents cc03382 + f6ca23c commit 8b70e07

File tree

5 files changed

+46
-50
lines changed

5 files changed

+46
-50
lines changed

lib/mix/lib/mix/dep.ex

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ defmodule Mix.Dep do
5757
provided in the project are in the wrong format.
5858
"""
5959
def loaded(opts) do
60-
{ deps, _ } = Mix.Dep.Converger.all(nil, opts, fn(dep, acc) -> { dep, acc } end)
60+
{ deps, _, _ } = Mix.Dep.Converger.all(nil, nil, opts, &{ &1, &2, &3 })
6161
Mix.Dep.Converger.topsort(deps)
6262
end
6363

@@ -106,9 +106,9 @@ defmodule Mix.Dep do
106106
This function raises an exception if any of the dependencies
107107
provided in the project are in the wrong format.
108108
"""
109-
def unloaded(acc, opts, callback) do
110-
{ deps, acc } = Mix.Dep.Converger.all(acc, opts, callback)
111-
{ Mix.Dep.Converger.topsort(deps), acc }
109+
def unloaded(acc, lock, opts, callback) do
110+
{ deps, acc, lock } = Mix.Dep.Converger.all(acc, lock, opts, callback)
111+
{ Mix.Dep.Converger.topsort(deps), acc, lock }
112112
end
113113

114114
@doc """
@@ -120,14 +120,14 @@ defmodule Mix.Dep do
120120
This function raises an exception if any of the dependencies
121121
provided in the project are in the wrong format.
122122
"""
123-
def unloaded_by_name(given, acc, opts, callback) do
123+
def unloaded_by_name(given, acc, lock, opts, callback) do
124124
names = to_app_names(given)
125125

126-
unloaded(acc, opts, fn(dep, acc) ->
126+
unloaded(acc, lock, opts, fn dep, acc, lock ->
127127
if dep.app in names do
128-
callback.(dep, acc)
128+
callback.(dep, acc, lock)
129129
else
130-
{ dep, acc }
130+
{ dep, acc, lock }
131131
end
132132
end)
133133
end

lib/mix/lib/mix/dep/converger.ex

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ defmodule Mix.Dep.Converger do
4141
4242
See `Mix.Dep.Loader.children/1` for options.
4343
"""
44-
def all(rest, opts, callback) do
44+
def all(acc, lock, opts, callback) do
4545
main = Mix.Dep.Loader.children(opts)
4646
apps = Enum.map(main, &(&1.app))
4747
converger = Mix.RemoteConverger.get
@@ -51,10 +51,8 @@ defmodule Mix.Dep.Converger do
5151
# being updated or fetched for the first time (only then do
5252
# we want the remote converger to run)
5353
result =
54-
all(main, [], [], apps, callback, rest, fn dep ->
55-
if not nil?(rest) &&
56-
converger &&
57-
converger.remote?(dep) do
54+
all(main, [], [], apps, callback, acc, lock, fn dep ->
55+
if not nil?(lock) && converger && converger.remote?(dep) do
5856
{ :loaded, dep }
5957
else
6058
{ :unloaded, dep }
@@ -64,20 +62,18 @@ defmodule Mix.Dep.Converger do
6462
# Run remote converger if one is available and rerun mix's
6563
# converger with the new information
6664
case converger && result do
67-
{ deps, rest } when not nil?(rest) ->
68-
to_dict = &{ &1.app, &1 }
65+
{ deps, rest, lock } when not nil?(lock) ->
66+
new_lock = converger.converge(main, lock)
6967

70-
converged_deps = converger.converge(deps)
71-
|> Enum.into(HashDict.new, to_dict)
7268
deps = deps
7369
|> Enum.reject(&converger.remote?(&1))
74-
|> Enum.into(HashDict.new, to_dict)
70+
|> Enum.into(HashDict.new, &{ &1.app, &1 })
7571

76-
all(main, [], [], apps, callback, rest, fn dep ->
77-
cond do
78-
cached = deps[dep.app] -> { :loaded, cached }
79-
cached = converged_deps[dep.app] -> { :unloaded, cached }
80-
true -> { :unloaded, dep }
72+
all(main, [], [], apps, callback, rest, new_lock, fn dep ->
73+
if cached = deps[dep.app] do
74+
{ :loaded, cached }
75+
else
76+
{ :unloaded, dep }
8177
end
8278
end)
8379
_ ->
@@ -124,17 +120,17 @@ defmodule Mix.Dep.Converger do
124120
# Now, since `d` was specified in a parent project, no
125121
# exception is going to be raised since d is considered
126122
# to be the authorative source.
127-
defp all([dep|t], acc, upper_breadths, current_breadths, callback, rest, cache) do
123+
defp all([dep|t], acc, upper_breadths, current_breadths, callback, rest, lock, cache) do
128124
cond do
129125
new_acc = diverged_deps(acc, upper_breadths, dep) ->
130-
all(t, new_acc, upper_breadths, current_breadths, callback, rest, cache)
126+
all(t, new_acc, upper_breadths, current_breadths, callback, rest, lock, cache)
131127
true ->
132128
dep =
133129
case cache.(dep) do
134130
{ :loaded, cached_dep } ->
135131
cached_dep
136132
{ :unloaded, dep } ->
137-
{ dep, rest } = callback.(dep, rest)
133+
{ dep, rest, lock } = callback.(dep, rest, lock)
138134

139135
# After we invoke the callback (which may actually check out the
140136
# dependency), we load the dependency including its latest info
@@ -143,13 +139,13 @@ defmodule Mix.Dep.Converger do
143139
end
144140

145141
dep = %{dep | deps: reject_non_fullfilled_optional(dep.deps, current_breadths)}
146-
{ acc, rest } = all(t, [dep|acc], upper_breadths, current_breadths, callback, rest, cache)
147-
all(dep.deps, acc, current_breadths, Enum.map(dep.deps, &(&1.app)) ++ current_breadths, callback, rest, cache)
142+
{ acc, rest, lock } = all(t, [dep|acc], upper_breadths, current_breadths, callback, rest, lock, cache)
143+
all(dep.deps, acc, current_breadths, Enum.map(dep.deps, &(&1.app)) ++ current_breadths, callback, rest, lock, cache)
148144
end
149145
end
150146

151-
defp all([], acc, _upper, _current, _callback, rest, _cache) do
152-
{ acc, rest }
147+
defp all([], acc, _upper, _current, _callback, rest, lock, _cache) do
148+
{ acc, rest, lock }
153149
end
154150

155151
# Look for divergence in dependencies.

lib/mix/lib/mix/dep/fetcher.ex

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ defmodule Mix.Dep.Fetcher do
1515
See `Mix.Dep.unloaded/3` for options.
1616
"""
1717
def all(old_lock, new_lock, opts) do
18-
deps = Mix.Dep.unloaded({ [], new_lock }, opts, &do_fetch/2)
19-
{ apps, _deps } = do_finalize(deps, old_lock, opts)
18+
result = Mix.Dep.unloaded([], new_lock, opts, &do_fetch/3)
19+
{ apps, _deps } = do_finalize(result, old_lock, opts)
2020
apps
2121
end
2222

@@ -26,19 +26,19 @@ defmodule Mix.Dep.Fetcher do
2626
See `Mix.Dep.unloaded_by_name/4` for options.
2727
"""
2828
def by_name(names, old_lock, new_lock, opts) do
29-
deps = Mix.Dep.unloaded_by_name(names, { [], new_lock }, opts, &do_fetch/2)
30-
{ apps, deps } = do_finalize(deps, old_lock, opts)
29+
result = Mix.Dep.unloaded_by_name(names, [], new_lock, opts, &do_fetch/3)
30+
{ apps, deps } = do_finalize(result, old_lock, opts)
3131
Mix.Dep.loaded_by_name(names, deps, opts) # Check all given dependencies are loaded or fail
3232
apps
3333
end
3434

35-
defp do_fetch(dep, { acc, lock }) do
35+
defp do_fetch(dep, acc, lock) do
3636
%Mix.Dep{app: app, scm: scm, opts: opts} = dep = check_lock(dep, lock)
3737

3838
cond do
3939
# Dependencies that cannot be fetched are always compiled afterwards
4040
not scm.fetchable? ->
41-
{ dep, { [app|acc], lock } }
41+
{ dep, [app|acc], lock }
4242

4343
# If the dependency is not available or we have a lock mismatch
4444
out_of_date?(dep) ->
@@ -52,14 +52,14 @@ defmodule Mix.Dep.Fetcher do
5252
end
5353

5454
if new do
55-
{ dep, { [app|acc], Map.put(lock, app, new) } }
55+
{ dep, [app|acc], Map.put(lock, app, new) }
5656
else
57-
{ dep, { acc, lock } }
57+
{ dep, acc, lock }
5858
end
5959

6060
# The dependency is ok or has some other error
6161
true ->
62-
{ dep, { acc, lock } }
62+
{ dep, acc, lock }
6363
end
6464
end
6565

@@ -69,7 +69,7 @@ defmodule Mix.Dep.Fetcher do
6969
defp out_of_date?(%Mix.Dep{status: { :unavailable, _ }}), do: true
7070
defp out_of_date?(%Mix.Dep{}), do: false
7171

72-
defp do_finalize({ all_deps, { apps, new_lock } }, old_lock, opts) do
72+
defp do_finalize({ all_deps, apps, new_lock }, old_lock, opts) do
7373
# Let's get the loaded versions of deps
7474
deps = Mix.Dep.loaded_by_name(apps, all_deps, opts)
7575

lib/mix/lib/mix/remote_converger.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ defmodule Mix.RemoteConverger do
1515
@doc """
1616
Run the remote converger.
1717
18-
Return the converged deps.
18+
Return updated lock.
1919
"""
20-
defcallback converge([Mix.Dep.t]) :: [Mix.Dep.t]
20+
defcallback converge([Mix.Dep.t], map) :: map
2121

2222
@doc """
2323
Get registered remote converger.

lib/mix/test/mix/dep_test.exs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,10 @@ defmodule Mix.DepTest do
7474
# the proper manager.
7575
Mix.Project.push DepsApp
7676

77-
{ _, true } =
78-
Mix.Dep.unloaded(false, [], fn dep, acc ->
77+
{ _, true, _ } =
78+
Mix.Dep.unloaded(false, [], nil, fn dep, acc, lock ->
7979
assert nil?(dep.manager)
80-
{ dep, acc or true }
80+
{ dep, acc or true, lock }
8181
end)
8282
end
8383

@@ -185,9 +185,9 @@ defmodule Mix.DepTest do
185185

186186
def remote?(_app), do: true
187187

188-
def converge(deps) do
188+
def converge(_deps, lock) do
189189
Process.put(:remote_converger, true)
190-
deps
190+
lock
191191
end
192192
end
193193

@@ -218,13 +218,13 @@ defmodule Mix.DepTest do
218218
Mix.Project.push OnlyDeps
219219

220220
in_fixture "deps_status", fn ->
221-
{ deps, _acc } = Mix.Dep.unloaded([], [env: :other_env], &{ &1, &2 })
221+
{ deps, _acc, _lock } = Mix.Dep.unloaded([], nil, [env: :other_env], &{ &1, &2, &3 })
222222
assert length(deps) == 2
223223

224-
{ deps, _acc } = Mix.Dep.unloaded([], [], &{ &1, &2 })
224+
{ deps, _acc, _lock } = Mix.Dep.unloaded([], nil, [], &{ &1, &2, &3 })
225225
assert length(deps) == 2
226226

227-
{ deps, _acc } = Mix.Dep.unloaded([], [env: :prod], &{ &1, &2 })
227+
{ deps, _acc, _lock } = Mix.Dep.unloaded([], nil, [env: :prod], &{ &1, &2, &3 })
228228
assert length(deps) == 1
229229
assert Enum.find deps, &match?(%Mix.Dep{app: :foo}, &1)
230230
end

0 commit comments

Comments
 (0)