Skip to content

Commit d4cc6ff

Browse files
author
José Valim
committed
Nuke consolidated protocols when changing Elixir versions
1 parent 49e9d89 commit d4cc6ff

File tree

5 files changed

+31
-18
lines changed

5 files changed

+31
-18
lines changed

lib/mix/lib/mix/project.ex

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,13 @@ defmodule Mix.Project do
353353
Path.join(app_path(config), "ebin")
354354
end
355355

356+
@doc """
357+
The path where protocol consolidations are stored.
358+
"""
359+
def consolidation_path(config \\ config()) do
360+
Path.join(build_path(config), "consolidated")
361+
end
362+
356363
@doc """
357364
Compiles the given project.
358365

lib/mix/lib/mix/tasks/compile.protocols.ex

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ defmodule Mix.Tasks.Compile.Protocols do
4141
Mix.Task.run "compile", args
4242
{opts, _, _} = OptionParser.parse(args, switches: [force: :boolean, verbose: :boolean])
4343

44-
output = default_path(config)
44+
output = Mix.Project.consolidation_path(config)
4545
manifest = Path.join(output, @manifest)
4646

4747
protocols_and_impls =
@@ -50,7 +50,7 @@ defmodule Mix.Tasks.Compile.Protocols do
5050
end
5151

5252
cond do
53-
opts[:force] || Mix.Utils.stale?(Mix.Project.config_files, [manifest]) ->
53+
opts[:force] || Mix.Utils.stale?(Mix.Project.config_files(), [manifest]) ->
5454
clean()
5555
paths = consolidation_paths()
5656
paths
@@ -71,12 +71,7 @@ defmodule Mix.Tasks.Compile.Protocols do
7171
Cleans up consolidated protocols.
7272
"""
7373
def clean do
74-
File.rm_rf(default_path)
75-
end
76-
77-
@doc false
78-
def default_path(config \\ Mix.Project.config) do
79-
Path.join(Mix.Project.build_path(config), "consolidated")
74+
File.rm_rf(Mix.Project.consolidation_path)
8075
end
8176

8277
defp protocols_and_impls(config) do
@@ -136,10 +131,16 @@ defmodule Mix.Tasks.Compile.Protocols do
136131
:code.delete(module)
137132
end
138133

139-
defp read_manifest(manifest) do
134+
defp read_manifest(manifest, output) do
140135
case :file.consult(manifest) do
141-
{:ok, [@manifest_vsn | t]} -> t
142-
_ -> []
136+
{:ok, [@manifest_vsn | t]} ->
137+
t
138+
{:ok, _} ->
139+
# If manifest is out of date, remove old files
140+
_ = File.rm_rf(output)
141+
[]
142+
{:error, _} ->
143+
[]
143144
end
144145
end
145146

@@ -156,7 +157,7 @@ defmodule Mix.Tasks.Compile.Protocols do
156157

157158
defp diff_manifest(manifest, new_metadata, output) do
158159
modified = Mix.Utils.last_modified(manifest)
159-
old_metadata = read_manifest(manifest)
160+
old_metadata = read_manifest(manifest, output)
160161

161162
protocols =
162163
for {protocol, :protocol, beam} <- new_metadata,

lib/mix/lib/mix/tasks/escript.build.ex

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,9 +215,10 @@ defmodule Mix.Tasks.Escript.Build do
215215
end)
216216
end
217217

218-
defp consolidated_paths(project) do
219-
if project[:consolidate_protocols] do
220-
Mix.Tasks.Compile.Protocols.default_path <> "/*"
218+
defp consolidated_paths(config) do
219+
if config[:consolidate_protocols] do
220+
Mix.Project.consolidation_path(config)
221+
|> Path.join("*")
221222
|> Path.wildcard()
222223
|> prepare_beam_paths()
223224
else

lib/mix/lib/mix/tasks/loadpaths.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,5 +72,6 @@ defmodule Mix.Tasks.Loadpaths do
7272

7373
defp rm_rf_app(config) do
7474
File.rm_rf Mix.Project.app_path(config)
75+
File.rm_rf Mix.Project.consolidation_path(config)
7576
end
7677
end

lib/mix/test/mix/tasks/compile.elixir_test.exs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,22 @@ defmodule Mix.Tasks.Compile.ElixirTest do
3838

3939
test "recompiles project if elixir version changed" do
4040
in_fixture "no_mixfile", fn ->
41-
Mix.Tasks.Compile.run ["--verbose"]
41+
Mix.Tasks.Compile.run []
4242
purge [A, B]
4343

44-
assert_received {:mix_shell, :info, ["Compiled lib/a.ex"]}
44+
assert File.exists?("_build/dev/lib/sample")
45+
assert File.exists?("_build/dev/consolidated")
4546
assert Mix.Dep.ElixirSCM.read == {:ok, System.version, Mix.SCM.Path}
4647

4748
Mix.Task.clear
49+
File.write!("_build/dev/consolidated/.to_be_removed", "")
4850
File.write!("_build/dev/lib/sample/.compile.elixir_scm", ~s({v1, <<"0.0.0">>, nil}.))
4951
File.touch!("_build/dev/lib/sample/.compile.elixir_scm", {{2010, 1, 1}, {0, 0, 0}})
5052

51-
Mix.Tasks.Compile.run ["--verbose"]
53+
Mix.Tasks.Compile.run []
5254
assert Mix.Dep.ElixirSCM.read == {:ok, System.version, Mix.SCM.Path}
5355
assert File.stat!("_build/dev/lib/sample/.compile.elixir_scm").mtime > {{2010, 1, 1}, {0, 0, 0}}
56+
refute File.exists?("_build/dev/consolidated/.to_be_removed")
5457
end
5558
end
5659

0 commit comments

Comments
 (0)