Skip to content

Commit c05c1cf

Browse files
committed
Reload .app files for path deps in tracer, closes #10718
1 parent 80e180e commit c05c1cf

File tree

2 files changed

+58
-7
lines changed

2 files changed

+58
-7
lines changed

lib/mix/lib/mix/compilers/application_tracer.ex

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,22 @@ defmodule Mix.Compilers.ApplicationTracer do
77
def init({stale_deps, opts}) do
88
config = Mix.Project.config()
99
manifest = manifest(config)
10+
modified = Mix.Utils.last_modified(manifest)
1011

11-
if Mix.Utils.stale?([Mix.Project.config_mtime()], [manifest]) do
12-
build_manifest(config, manifest)
13-
else
14-
read_manifest(manifest, stale_deps) || build_manifest(config, manifest)
12+
cond do
13+
Mix.Utils.stale?([Mix.Project.config_mtime()], [modified]) ->
14+
build_manifest(config, manifest)
15+
16+
table = read_manifest(manifest, stale_deps) ->
17+
for %{app: app, scm: scm, opts: opts} <- Mix.Dep.cached(),
18+
not scm.fetchable?,
19+
Mix.Utils.last_modified(Path.join([opts[:build], "ebin", "#{app}.app"])) > modified do
20+
delete_app(table, app)
21+
store_app(table, app)
22+
end
23+
24+
true ->
25+
build_manifest(config, manifest)
1526
end
1627

1728
setup_warnings_table(config)
@@ -204,9 +215,7 @@ defmodule Mix.Compilers.ApplicationTracer do
204215
Map.has_key?(seen, app) ->
205216
seen
206217

207-
modules = Application.spec(app, :modules) ->
208-
:ets.insert(table, Enum.map(modules, &{&1}))
209-
218+
store_app(table, app) ->
210219
seen
211220
|> Map.put(app, true)
212221
|> store_apps(table, Application.spec(app, :applications))
@@ -216,4 +225,17 @@ defmodule Mix.Compilers.ApplicationTracer do
216225
seen
217226
end
218227
end
228+
229+
defp delete_app(table, app) do
230+
:ets.match_delete(table, {:"$_", app})
231+
end
232+
233+
defp store_app(table, app) do
234+
if modules = Application.spec(app, :modules) do
235+
:ets.insert(table, Enum.map(modules, &{&1, app}))
236+
true
237+
else
238+
false
239+
end
240+
end
219241
end

lib/mix/test/mix/umbrella_test.exs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,35 @@ defmodule Mix.UmbrellaTest do
474474
end)
475475
end
476476

477+
test "reloads app in app tracer if .app changes" do
478+
in_fixture("umbrella_dep/deps/umbrella/apps", fn ->
479+
deps = [{:foo, in_umbrella: true}]
480+
Mix.Project.in_project(:bar, "bar", [deps: deps], fn _ ->
481+
Mix.Task.run("compile", ["--verbose"])
482+
mtime = File.stat!("../foo/lib/foo.ex").mtime
483+
484+
File.write!("../foo/lib/foo.ex", """
485+
defmodule Foo.VeryNew do
486+
def hello, do: :ok
487+
end
488+
""")
489+
490+
File.write!("lib/bar.ex", """
491+
defmodule Bar.VeryNew do
492+
def hello, do: Foo.VeryNew.hello()
493+
end
494+
""")
495+
496+
Mix.Task.clear()
497+
Application.unload(:foo)
498+
ensure_touched("../foo/lib/foo.ex", mtime)
499+
500+
assert Mix.Task.run("compile", ["--verbose"]) == {:ok, []}
501+
assert_receive {:mix_shell, :info, ["Compiled lib/bar.ex"]}
502+
end)
503+
end)
504+
end
505+
477506
test "reconsolidates after path dependency changes" do
478507
in_fixture("umbrella_dep/deps/umbrella/apps", fn ->
479508
Mix.Project.in_project(:bar, "bar", fn _ ->

0 commit comments

Comments
 (0)