@@ -13,9 +13,9 @@ defmodule Mix.Compilers.Elixir do
13
13
in between modules, which helps it recompile only the modules that
14
14
have changed at runtime.
15
15
"""
16
- def compile ( manifest , srcs , exts , dest , force , on_start ) do
17
- all = Mix.Utils . extract_files ( srcs , exts )
18
- all_entries = read_manifest ( manifest )
16
+ def compile ( manifest , srcs , skip , exts , dest , force , on_start ) do
17
+ all = Mix.Utils . extract_files ( srcs -- skip , exts )
18
+ { all_entries , skip_entries } = read_manifest ( manifest , skip )
19
19
20
20
removed =
21
21
for { _b , _m , source , _d , _f , _bin } <- all_entries , not ( source in all ) , do: source
@@ -41,15 +41,15 @@ defmodule Mix.Compilers.Elixir do
41
41
do: source )
42
42
end
43
43
44
- { entries , changed } = remove_stale_entries ( all_entries , removed ++ changed , [ ] , [ ] )
44
+ { entries , changed } = remove_stale_entries ( all_entries , removed ++ changed )
45
45
stale = changed -- removed
46
46
47
47
cond do
48
48
stale != [ ] ->
49
- compile_manifest ( manifest , entries , stale , dest , on_start )
49
+ compile_manifest ( manifest , entries ++ skip_entries , stale , dest , on_start )
50
50
:ok
51
51
removed != [ ] ->
52
- write_manifest ( manifest , entries )
52
+ write_manifest ( manifest , entries ++ skip_entries )
53
53
:ok
54
54
true ->
55
55
:noop
@@ -102,7 +102,7 @@ defmodule Mix.Compilers.Elixir do
102
102
entries
103
103
end
104
104
after
105
- Agent . stop pid
105
+ Agent . stop ( pid , :infinity )
106
106
end
107
107
108
108
:ok
@@ -144,7 +144,7 @@ defmodule Mix.Compilers.Elixir do
144
144
145
145
# This function receives the manifest entries and some source
146
146
# files that have changed. It then, recursively, figures out
147
- # all the files that changed (thanks to the dependencies) and
147
+ # all the files that changed (via the module dependencies) and
148
148
# return their sources as the remaining entries.
149
149
defp remove_stale_entries ( all , [ ] ) do
150
150
{ all , [ ] }
@@ -181,27 +181,40 @@ defmodule Mix.Compilers.Elixir do
181
181
182
182
# Reads the manifest returning the results as tuples.
183
183
# The beam files are read, removed and stored in memory.
184
- defp read_manifest ( manifest ) do
184
+ defp read_manifest ( manifest , skip_paths ) do
185
+ initial = { [ ] , [ ] }
186
+
185
187
case File . read ( manifest ) do
186
188
{ :ok , contents } ->
187
- Enum . reduce String . split ( contents , "\n " ) , [ ] , fn x , acc ->
188
- case String . split ( x , "\t " ) do
189
- [ beam , module , source | deps ] ->
190
- { deps , files } =
191
- case Enum . split_while ( deps , & ( & 1 != "Elixir" ) ) do
192
- { deps , [ "Elixir" | files ] } -> { deps , files }
193
- { deps , _ } -> { deps , [ ] }
194
- end
195
- [ { beam , module , source , deps , files , nil } | acc ]
196
- _ ->
197
- acc
198
- end
189
+ skip_paths = Enum . map ( skip_paths , & ( & 1 <> "/" ) )
190
+ Enum . reduce String . split ( contents , "\n " ) , initial , fn x , acc ->
191
+ read_manifest_entry ( String . split ( x , "\t " ) , acc , skip_paths )
199
192
end
200
193
{ :error , _ } ->
201
- [ ]
194
+ initial
202
195
end
203
196
end
204
197
198
+ defp read_manifest_entry ( [ beam , module , source | deps ] , { keep , skip } , skip_paths ) do
199
+ { deps , files } =
200
+ case Enum . split_while ( deps , & ( & 1 != "Elixir" ) ) do
201
+ { deps , [ "Elixir" | files ] } -> { deps , files }
202
+ { deps , _ } -> { deps , [ ] }
203
+ end
204
+
205
+ entry = { beam , module , source , deps , files , nil }
206
+
207
+ if String . starts_with? ( source , skip_paths ) do
208
+ { keep , [ entry | skip ] }
209
+ else
210
+ { [ entry | keep ] , skip }
211
+ end
212
+ end
213
+
214
+ defp read_manifest_entry ( _ , acc , _skip_paths ) do
215
+ acc
216
+ end
217
+
205
218
# Writes the manifest separating entries by tabs.
206
219
defp write_manifest ( _manifest , [ ] ) do
207
220
:ok
0 commit comments