@@ -5,11 +5,11 @@ defmodule Mix.Tasks.Compile.Elixir do
55 use GenServer.Behaviour
66 @ moduledoc false
77
8- def files_to_path ( manifest , stale , all , compile_path ) do
9- entries = read_manifest ( manifest )
8+ def files_to_path ( manifest , stale , all , compile_path , on_start ) do
9+ all_entries = read_manifest ( manifest )
1010
1111 # Each entry that is not in all must be removed
12- entries = lc { beam , _m , source , _d } = entry inlist entries ,
12+ entries = lc { beam , _m , source , _d } = entry inlist all_entries ,
1313 is_in_list_or_remove ( source , all , beam ) ,
1414 do: entry
1515
@@ -21,15 +21,23 @@ defmodule Mix.Tasks.Compile.Elixir do
2121 not Enum . any? ( entries , fn { _b , _m , s , _d } -> s == i end ) ,
2222 do: i
2323
24- if stale != [ ] do
25- { :ok , pid } = :gen_server . start_link ( __MODULE__ , entries , [ ] )
26-
27- try do
28- files_to_path ( pid , entries , stale , compile_path , File . cwd )
29- :gen_server . cast ( pid , :merge )
30- after
31- :gen_server . call ( pid , { :stop , manifest } )
32- end
24+ cond do
25+ stale != [ ] ->
26+ on_start . ( )
27+ { :ok , pid } = :gen_server . start_link ( __MODULE__ , entries , [ ] )
28+
29+ try do
30+ do_files_to_path ( pid , entries , stale , compile_path , File . cwd )
31+ :gen_server . cast ( pid , :merge )
32+ after
33+ :gen_server . call ( pid , { :stop , manifest } )
34+ end
35+
36+ :ok
37+ all_entries != entries ->
38+ :ok
39+ true ->
40+ :noop
3341 end
3442 end
3543
@@ -42,14 +50,14 @@ defmodule Mix.Tasks.Compile.Elixir do
4250 end
4351 end
4452
45- defp files_to_path ( _pid , _entries , [ ] , _compile_path , _cwd ) , do: :ok
46- defp files_to_path ( pid , entries , files , compile_path , cwd ) do
53+ defp do_files_to_path ( _pid , _entries , [ ] , _compile_path , _cwd ) , do: :ok
54+ defp do_files_to_path ( pid , entries , files , compile_path , cwd ) do
4755 Kernel.ParallelCompiler . files :lists . usort ( files ) ,
4856 each_module: each_module ( pid , compile_path , cwd , & 1 , & 2 , & 3 ) ,
4957 each_file: each_file ( & 1 ) ,
5058 each_waiting: each_waiting ( entries , & 1 )
5159
52- files_to_path ( pid , entries , :gen_server . call ( pid , :next ) , compile_path , cwd )
60+ do_files_to_path ( pid , entries , :gen_server . call ( pid , :next ) , compile_path , cwd )
5361 end
5462
5563 defp each_module ( pid , compile_path , cwd , source , module , binary ) do
@@ -240,16 +248,11 @@ defmodule Mix.Tasks.Compile.Elixir do
240248 all = opts [ :force ] || Mix.Utils . stale? ( check_files , [ manifest ] ) || path_deps_changed? ( manifest )
241249 stale = if all , do: to_watch , else: Mix.Utils . extract_stale ( to_watch , [ manifest ] )
242250
243- if stale != [ ] do
251+ files_to_path ( manifest , stale , to_compile , compile_path , fn ->
244252 File . mkdir_p! ( compile_path )
245253 Code . prepend_path ( compile_path )
246-
247254 set_compiler_opts ( project , opts , [ ] )
248- files_to_path ( manifest , stale , to_compile , compile_path )
249- :ok
250- else
251- :noop
252- end
255+ end )
253256 end
254257
255258 @ doc """
@@ -271,7 +274,7 @@ defmodule Mix.Tasks.Compile.Elixir do
271274 in between modules, which helps it recompile only the modules that
272275 have changed at runtime.
273276 """
274- defdelegate files_to_path ( manifest , stale , all , path ) , to: ManifestCompiler
277+ defdelegate files_to_path ( manifest , stale , all , path , on_start ) , to: ManifestCompiler
275278
276279 defp set_compiler_opts ( project , opts , extra ) do
277280 opts = Dict . take ( opts , [ :docs , :debug_info , :ignore_module_conflict , :warnings_as_errors ] )
0 commit comments