@@ -5,11 +5,11 @@ defmodule Mix.Tasks.Compile.Elixir do
5
5
use GenServer.Behaviour
6
6
@ moduledoc false
7
7
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 )
10
10
11
11
# 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 ,
13
13
is_in_list_or_remove ( source , all , beam ) ,
14
14
do: entry
15
15
@@ -21,15 +21,23 @@ defmodule Mix.Tasks.Compile.Elixir do
21
21
not Enum . any? ( entries , fn { _b , _m , s , _d } -> s == i end ) ,
22
22
do: i
23
23
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
33
41
end
34
42
end
35
43
@@ -42,14 +50,14 @@ defmodule Mix.Tasks.Compile.Elixir do
42
50
end
43
51
end
44
52
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
47
55
Kernel.ParallelCompiler . files :lists . usort ( files ) ,
48
56
each_module: each_module ( pid , compile_path , cwd , & 1 , & 2 , & 3 ) ,
49
57
each_file: each_file ( & 1 ) ,
50
58
each_waiting: each_waiting ( entries , & 1 )
51
59
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 )
53
61
end
54
62
55
63
defp each_module ( pid , compile_path , cwd , source , module , binary ) do
@@ -240,16 +248,11 @@ defmodule Mix.Tasks.Compile.Elixir do
240
248
all = opts [ :force ] || Mix.Utils . stale? ( check_files , [ manifest ] ) || path_deps_changed? ( manifest )
241
249
stale = if all , do: to_watch , else: Mix.Utils . extract_stale ( to_watch , [ manifest ] )
242
250
243
- if stale != [ ] do
251
+ files_to_path ( manifest , stale , to_compile , compile_path , fn ->
244
252
File . mkdir_p! ( compile_path )
245
253
Code . prepend_path ( compile_path )
246
-
247
254
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 )
253
256
end
254
257
255
258
@ doc """
@@ -271,7 +274,7 @@ defmodule Mix.Tasks.Compile.Elixir do
271
274
in between modules, which helps it recompile only the modules that
272
275
have changed at runtime.
273
276
"""
274
- defdelegate files_to_path ( manifest , stale , all , path ) , to: ManifestCompiler
277
+ defdelegate files_to_path ( manifest , stale , all , path , on_start ) , to: ManifestCompiler
275
278
276
279
defp set_compiler_opts ( project , opts , extra ) do
277
280
opts = Dict . take ( opts , [ :docs , :debug_info , :ignore_module_conflict , :warnings_as_errors ] )
0 commit comments