Skip to content

Commit 9feda91

Browse files
committed
Simplify reading of apps from deps
1 parent 62e1d71 commit 9feda91

File tree

1 file changed

+23
-23
lines changed

1 file changed

+23
-23
lines changed

lib/mix/lib/mix/tasks/compile.all.ex

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ defmodule Mix.Tasks.Compile.All do
4242

4343
app = config[:app]
4444
_ = Code.prepend_path(Mix.Project.compile_path())
45-
load_app(app, %{app => true}, lib_path, validate_compile_env?)
45+
load_app(app, lib_path, validate_compile_env?)
4646
result
4747
end
4848

@@ -99,16 +99,16 @@ defmodule Mix.Tasks.Compile.All do
9999
{runtime, optional} = Mix.Tasks.Compile.App.project_apps(config)
100100
parent = self()
101101
opts = [ordered: false, timeout: :infinity]
102-
deps = for dep <- Mix.Dep.cached(), into: %{}, do: {dep.app, true}
102+
deps = for dep <- Mix.Dep.cached(), into: %{}, do: {dep.app, lib_path}
103103

104-
stream_apps(runtime ++ optional)
105-
|> Task.async_stream(&load_app(&1, parent, deps, lib_path, validate_compile_env?), opts)
104+
stream_apps(runtime ++ optional, deps)
105+
|> Task.async_stream(&load_stream_app(&1, parent, validate_compile_env?), opts)
106106
|> Stream.run()
107107
end
108108

109-
defp load_app(app, parent, deps, lib_path, validate_compile_env?) do
109+
defp load_stream_app({app, lib_path}, parent, validate_compile_env?) do
110110
children =
111-
case load_app(app, deps, lib_path, validate_compile_env?) do
111+
case load_app(app, lib_path, validate_compile_env?) do
112112
:ok ->
113113
Application.spec(app, :applications) ++ Application.spec(app, :included_applications)
114114

@@ -120,37 +120,37 @@ defmodule Mix.Tasks.Compile.All do
120120
:ok
121121
end
122122

123-
defp stream_apps(initial) do
124-
Stream.unfold({initial, %{}, %{}}, &stream_app/1)
123+
defp stream_apps(initial, deps) do
124+
Stream.unfold({initial, %{}, %{}, deps}, &stream_app/1)
125125
end
126126

127127
# We already processed this app, skip it.
128-
defp stream_app({[app | apps], seen, done}) when is_map_key(seen, app) do
129-
stream_app({apps, seen, done})
128+
defp stream_app({[app | apps], seen, done, deps}) when is_map_key(seen, app) do
129+
stream_app({apps, seen, done, deps})
130130
end
131131

132132
# We haven't processed this app, emit it.
133-
defp stream_app({[app | apps], seen, done}) do
134-
{app, {apps, Map.put(seen, app, true), done}}
133+
defp stream_app({[app | apps], seen, done, deps}) do
134+
{{app, deps[app]}, {apps, Map.put(seen, app, true), done, deps}}
135135
end
136136

137137
# We have processed all apps and all seen have been done.
138-
defp stream_app({[], seen, done}) when map_size(seen) == map_size(done) do
138+
defp stream_app({[], seen, done, _deps}) when map_size(seen) == map_size(done) do
139139
nil
140140
end
141141

142142
# We have processed all apps but there is work being done.
143-
defp stream_app({[], seen, done}) do
143+
defp stream_app({[], seen, done, deps}) do
144144
receive do
145-
{:done, app, children} -> stream_app({children, seen, Map.put(done, app, true)})
145+
{:done, app, children} -> stream_app({children, seen, Map.put(done, app, true), deps})
146146
end
147147
end
148148

149-
defp load_app(app, deps, lib_path, validate_compile_env?) do
149+
defp load_app(app, lib_path, validate_compile_env?) do
150150
if Application.spec(app, :vsn) do
151151
:ok
152152
else
153-
with {:ok, bin} <- read_app(app, deps, lib_path),
153+
with {:ok, bin} <- read_app(app, lib_path),
154154
{:ok, {:application, _, properties} = application_data} <- consult_app_file(bin),
155155
:ok <- :application.load(application_data) do
156156
if compile_env = validate_compile_env? && properties[:compile_env] do
@@ -164,19 +164,19 @@ defmodule Mix.Tasks.Compile.All do
164164
end
165165
end
166166

167-
# Optimize the ones coming from deps by avoiding code/erl_prim_loader
168-
defp read_app(app, deps, lib_path) when is_map_key(deps, app) do
169-
File.read("#{lib_path}/#{app}/ebin/#{app}.app")
170-
end
171-
172-
defp read_app(app, _deps, _lib_path) do
167+
# The app didn't come from a dep, go through the slow path (code/erl_prim_loader)
168+
defp read_app(app, nil) do
173169
name = Atom.to_charlist(app) ++ '.app'
174170

175171
with [_ | _] = path <- :code.where_is_file(name),
176172
{:ok, bin, _full_name} <- :erl_prim_loader.get_file(path),
177173
do: {:ok, bin}
178174
end
179175

176+
defp read_app(app, lib_path) do
177+
File.read("#{lib_path}/#{app}/ebin/#{app}.app")
178+
end
179+
180180
defp consult_app_file(bin) do
181181
# The path could be located in an .ez archive, so we use the prim loader.
182182
with {:ok, tokens, _} <- :erl_scan.string(String.to_charlist(bin)) do

0 commit comments

Comments
 (0)