Skip to content

Commit 4c12bfc

Browse files
committed
Ensure included deps transitive from path deps can be loaded, closes #12682
1 parent fde96ce commit 4c12bfc

File tree

3 files changed

+40
-35
lines changed

3 files changed

+40
-35
lines changed

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

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,31 @@ defmodule Mix.Dep.Converger do
7272
"""
7373
def converge(acc, lock, opts, callback) do
7474
{deps, acc, lock} = all(acc, lock, opts, callback)
75-
if remote = Mix.RemoteConverger.get(), do: remote.post_converge
76-
{topological_sort(deps), acc, lock}
75+
if remote = Mix.RemoteConverger.get(), do: remote.post_converge()
76+
77+
deps =
78+
for %{app: app, opts: opts} = dep <- topological_sort(deps) do
79+
case Keyword.pop(opts, :app_properties) do
80+
{nil, _opts} ->
81+
dep
82+
83+
{app_properties, opts} ->
84+
case :application.load({:application, app, app_properties}) do
85+
:ok ->
86+
:ok
87+
88+
{:error, {:already_loaded, _}} ->
89+
:ok
90+
91+
{:error, error} ->
92+
Mix.raise("Could not load application #{inspect(app)}: #{inspect(error)}")
93+
end
94+
95+
%{dep | opts: opts}
96+
end
97+
end
98+
99+
{deps, acc, lock}
77100
end
78101

79102
defp all(acc, lock, opts, callback) do
@@ -205,21 +228,20 @@ defmodule Mix.Dep.Converger do
205228
all(t, [dep | acc], upper, breadths, optional, rest, lock, state)
206229

207230
:nomatch ->
208-
{%{app: app, deps: deps, opts: opts} = dep, app_properties, rest, lock} =
231+
{%{app: app, deps: deps, opts: opts} = dep, rest, lock} =
209232
case state.cache.(dep) do
210233
{:loaded, cached_dep} ->
211-
{cached_dep, nil, rest, lock}
234+
{cached_dep, rest, lock}
212235

213236
{:unloaded, dep, children} ->
214237
{dep, rest, lock} = state.callback.(put_lock(dep, lock), rest, lock)
215238

216-
Mix.Dep.Loader.with_system_env(dep, fn ->
217-
# After we invoke the callback (which may actually check out the
218-
# dependency), we load the dependency including its latest info
219-
# and children information.
220-
{dep, app_properties} = Mix.Dep.Loader.load(dep, children, state.locked?)
221-
{dep, app_properties, rest, lock}
222-
end)
239+
dep =
240+
Mix.Dep.Loader.with_system_env(dep, fn ->
241+
Mix.Dep.Loader.load(dep, children, state.locked?)
242+
end)
243+
244+
{dep, rest, lock}
223245
end
224246

225247
# Something that we previously ruled out as an optional dependency is
@@ -234,24 +256,7 @@ defmodule Mix.Dep.Converger do
234256
split_non_fulfilled_optional(deps, Enum.map(acc, & &1.app), opts[:from_umbrella])
235257

236258
new_breadths = Enum.map(deps, & &1.app) ++ breadths
237-
res = all(deps, acc, breadths, new_breadths, discarded ++ optional, rest, lock, state)
238-
239-
# After we traverse all of our children, we can load ourselves.
240-
# This is important in case of included application.
241-
if app_properties do
242-
case :application.load({:application, app, app_properties}) do
243-
:ok ->
244-
:ok
245-
246-
{:error, {:already_loaded, _}} ->
247-
:ok
248-
249-
{:error, error} ->
250-
Mix.raise("Could not start application #{inspect(app)}: #{inspect(error)}")
251-
end
252-
end
253-
254-
res
259+
all(deps, acc, breadths, new_breadths, discarded ++ optional, rest, lock, state)
255260
end
256261
end
257262

lib/mix/lib/mix/dep/loader.ex

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -383,21 +383,21 @@ defmodule Mix.Dep.Loader do
383383

384384
cond do
385385
not ok?(dep) ->
386-
{dep, nil}
386+
dep
387387

388388
recently_fetched?(dep) ->
389-
{%{dep | status: :compile}, nil}
389+
%{dep | status: :compile}
390390

391391
opts_app == false ->
392-
{dep, nil}
392+
dep
393393

394394
true ->
395395
path = if is_binary(opts_app), do: opts_app, else: "ebin/#{app}.app"
396396
path = Path.expand(path, opts[:build])
397397

398398
case app_status(path, app, req) do
399-
{:ok, vsn, app} -> {%{dep | status: {:ok, vsn}}, app}
400-
status -> {%{dep | status: status}, nil}
399+
{:ok, vsn, app} -> %{dep | status: {:ok, vsn}, opts: [app_properties: app] ++ opts}
400+
status -> %{dep | status: status}
401401
end
402402
end
403403
end

lib/mix/lib/mix/dep/umbrella.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ defmodule Mix.Dep.Umbrella do
5959
apps = Enum.map(deps, & &1.app)
6060

6161
Enum.map(deps, fn umbrella_dep ->
62-
{umbrella_dep, _} = Mix.Dep.Loader.load(umbrella_dep, nil, false)
62+
umbrella_dep = Mix.Dep.Loader.load(umbrella_dep, nil, false)
6363

6464
deps =
6565
Enum.filter(umbrella_dep.deps, fn dep ->

0 commit comments

Comments
 (0)