Skip to content

Commit b7da298

Browse files
author
José Valim
committed
Do not write manifest down if there was a compilation error, closes #1833
1 parent a75e70b commit b7da298

File tree

3 files changed

+32
-10
lines changed

3 files changed

+32
-10
lines changed

lib/mix/lib/mix/shell.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ defmodule Mix.Shell do
6161
command = command
6262
|> String.replace("\"", "\\\"")
6363
|> :binary.bin_to_list
64-
'sh -c ' ++ command
64+
'sh -c "' ++ command ++ '"'
6565

6666
{ :win32, osname } ->
6767
command = :binary.bin_to_list(command)

lib/mix/lib/mix/tasks/compile.elixir.ex

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@ defmodule Mix.Tasks.Compile.Elixir do
4242
Kernel.ParallelCompiler.files :lists.usort(stale),
4343
each_module: &each_module(pid, compile_path, cwd, &1, &2, &3),
4444
each_file: &each_file(&1)
45+
:gen_server.cast(pid, { :write, manifest })
4546
after
46-
:gen_server.call(pid, { :stop, manifest })
47+
:gen_server.call(pid, :stop)
4748
end
4849

4950
:ok
@@ -57,13 +58,12 @@ defmodule Mix.Tasks.Compile.Elixir do
5758
defp each_module(pid, compile_path, cwd, source, module, binary) do
5859
bin = atom_to_binary(module)
5960
beam = Path.join(compile_path, bin <> ".beam")
60-
File.write!(beam, binary)
6161

6262
deps = Kernel.LexicalTracker.remotes(module)
6363
|> :lists.usort |> Enum.map(&atom_to_binary(&1))
6464

6565
relative = if cwd, do: Path.relative_to(source, cwd), else: source
66-
:gen_server.cast(pid, { :store, beam, bin, relative, deps })
66+
:gen_server.cast(pid, { :store, beam, bin, relative, deps, binary })
6767
end
6868

6969
defp each_file(file) do
@@ -126,7 +126,8 @@ defmodule Mix.Tasks.Compile.Elixir do
126126

127127
defp write_manifest(manifest, entries) do
128128
lines = Enum.map(entries, fn
129-
{ beam, module, source, deps } ->
129+
{ beam, module, source, deps, binary } ->
130+
if binary, do: File.write!(beam, binary)
130131
[beam, module, source | deps] |> Enum.join("\t")
131132
end)
132133
Mix.Utils.write_manifest(manifest, lines)
@@ -135,20 +136,24 @@ defmodule Mix.Tasks.Compile.Elixir do
135136
# Callbacks
136137

137138
def init(entries) do
138-
{ :ok, entries }
139+
{ :ok, Enum.map(entries, &Tuple.insert_at(&1, 4, nil)) }
139140
end
140141

141-
def handle_call({ :stop, manifest }, _from, entries) do
142-
write_manifest(manifest, entries)
142+
def handle_call(:stop, _from, entries) do
143143
{ :stop, :normal, :ok, entries }
144144
end
145145

146146
def handle_call(msg, from, state) do
147147
super(msg, from, state)
148148
end
149149

150-
def handle_cast({ :store, beam, module, source, deps }, entries) do
151-
{ :noreply, :lists.keystore(beam, 1, entries, { beam, module, source, deps }) }
150+
def handle_cast({ :write, manifest }, entries) do
151+
write_manifest(manifest, entries)
152+
{ :noreply, entries }
153+
end
154+
155+
def handle_cast({ :store, beam, module, source, deps, binary }, entries) do
156+
{ :noreply, :lists.keystore(beam, 1, entries, { beam, module, source, deps, binary }) }
152157
end
153158

154159
def handle_cast(msg, state) do

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,23 @@ defmodule Mix.Tasks.Compile.ElixirTest do
1717
end
1818
end
1919

20+
test "does not write beam down on failures" do
21+
import ExUnit.CaptureIO
22+
23+
in_fixture "only_mixfile", fn ->
24+
File.mkdir_p!("lib")
25+
File.write!("lib/a.ex", "raise %s(oops)")
26+
27+
capture_io fn ->
28+
assert_raise RuntimeError, fn ->
29+
Mix.Tasks.Compile.Elixir.run []
30+
end
31+
end
32+
33+
refute File.regular?("ebin/Elixir.A.beam")
34+
end
35+
end
36+
2037
test "removes old artifact files" do
2138
in_fixture "no_mixfile", fn ->
2239
assert Mix.Tasks.Compile.Elixir.run([]) == :ok

0 commit comments

Comments
 (0)