Skip to content

Commit f978b57

Browse files
authored
Preserve argument quoting in mix cmd (#14181)
1 parent e2f0196 commit f978b57

File tree

3 files changed

+20
-23
lines changed

3 files changed

+20
-23
lines changed

lib/mix/lib/mix/tasks/cmd.ex

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ defmodule Mix.Tasks.Cmd do
5757
def run(args) do
5858
{opts, args} = OptionParser.parse_head!(args, strict: @switches)
5959

60+
if args == [] do
61+
Mix.raise("Expected at least one argument in mix cmd")
62+
end
63+
6064
apps =
6165
opts
6266
|> Keyword.get_values(:app)
@@ -69,7 +73,7 @@ defmodule Mix.Tasks.Cmd do
6973
if apps == [] or Mix.Project.config()[:app] in apps do
7074
cmd_opts = Keyword.take(opts, [:cd])
7175

72-
case Mix.shell().cmd(Enum.join(args, " "), cmd_opts) do
76+
case Mix.shell().cmd({hd(args), tl(args)}, cmd_opts) do
7377
0 -> :ok
7478
status -> exit(status)
7579
end

lib/mix/test/mix/tasks/cmd_test.exs

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,20 @@ defmodule Mix.Tasks.CmdTest do
44
use MixTest.Case
55

66
test "can be called multiple times" do
7-
nl = os_newline()
87
Mix.Task.run("cmd", ["echo", "hello"])
9-
assert_received {:mix_shell, :run, ["hello" <> ^nl]}
10-
Mix.Task.run("cmd", ["echo", "hello"])
11-
assert_received {:mix_shell, :run, ["hello" <> ^nl]}
8+
assert_received {:mix_shell, :run, ["hello\n"]}
9+
Mix.Task.run("cmd", ["echo", "hello world"])
10+
assert_received {:mix_shell, :run, ["hello world\n"]}
1211
end
1312

1413
test "runs the command for each app" do
1514
in_fixture("umbrella_dep/deps/umbrella", fn ->
1615
Mix.Project.in_project(:umbrella, ".", fn _ ->
1716
Mix.Task.run("cmd", ["echo", "hello"])
18-
nl = os_newline()
1917
assert_received {:mix_shell, :info, ["==> bar"]}
20-
assert_received {:mix_shell, :run, ["hello" <> ^nl]}
18+
assert_received {:mix_shell, :run, ["hello\n"]}
2119
assert_received {:mix_shell, :info, ["==> foo"]}
22-
assert_received {:mix_shell, :run, ["hello" <> ^nl]}
20+
assert_received {:mix_shell, :run, ["hello\n"]}
2321
end)
2422
end)
2523
end
@@ -29,11 +27,10 @@ defmodule Mix.Tasks.CmdTest do
2927
in_fixture("umbrella_dep/deps/umbrella", fn ->
3028
Mix.Project.in_project(:umbrella, ".", fn _ ->
3129
Mix.Task.run("cmd", ["--app", "bar", "echo", "hello"])
32-
nl = os_newline()
3330
assert_received {:mix_shell, :info, ["==> bar"]}
34-
assert_received {:mix_shell, :run, ["hello" <> ^nl]}
31+
assert_received {:mix_shell, :run, ["hello\n"]}
3532
refute_received {:mix_shell, :info, ["==> foo"]}
36-
refute_received {:mix_shell, :run, ["hello" <> ^nl]}
33+
refute_received {:mix_shell, :run, ["hello\n"]}
3734
end)
3835
end)
3936
end)
@@ -44,11 +41,10 @@ defmodule Mix.Tasks.CmdTest do
4441
in_fixture("umbrella_dep/deps/umbrella", fn ->
4542
Mix.Project.in_project(:umbrella, ".", fn _ ->
4643
Mix.Task.run("cmd", ["--app", "bar", "--app", "foo", "echo", "hello"])
47-
nl = os_newline()
4844
assert_received {:mix_shell, :info, ["==> bar"]}
49-
assert_received {:mix_shell, :run, ["hello" <> ^nl]}
45+
assert_received {:mix_shell, :run, ["hello\n"]}
5046
assert_received {:mix_shell, :info, ["==> foo"]}
51-
assert_received {:mix_shell, :run, ["hello" <> ^nl]}
47+
assert_received {:mix_shell, :run, ["hello\n"]}
5248
end)
5349
end)
5450
end)

lib/mix/test/mix/tasks/do_test.exs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,10 @@ defmodule Mix.Tasks.DoTest do
5252
Mix.Project.in_project(:umbrella, ".", fn _ ->
5353
Mix.Tasks.Do.run(~w(--app bar compile --list + cmd echo hello))
5454

55-
nl = os_newline()
5655
assert_received {:mix_shell, :info, ["==> bar"]}
57-
assert_received {:mix_shell, :run, ["hello" <> ^nl]}
56+
assert_received {:mix_shell, :run, ["hello\n"]}
5857
refute_received {:mix_shell, :info, ["==> foo"]}
59-
refute_received {:mix_shell, :run, ["hello" <> ^nl]}
58+
refute_received {:mix_shell, :run, ["hello\n"]}
6059
end)
6160
end)
6261
end
@@ -66,11 +65,10 @@ defmodule Mix.Tasks.DoTest do
6665
Mix.Project.in_project(:umbrella, ".", fn _ ->
6766
Mix.Tasks.Do.run(~w(--app bar --app foo compile --list + cmd echo hello))
6867

69-
nl = os_newline()
7068
assert_received {:mix_shell, :info, ["==> bar"]}
71-
assert_received {:mix_shell, :run, ["hello" <> ^nl]}
69+
assert_received {:mix_shell, :run, ["hello\n"]}
7270
assert_received {:mix_shell, :info, ["==> foo"]}
73-
assert_received {:mix_shell, :run, ["hello" <> ^nl]}
71+
assert_received {:mix_shell, :run, ["hello\n"]}
7472
end)
7573
end)
7674
end
@@ -105,13 +103,12 @@ defmodule Mix.Tasks.DoTest do
105103
Mix.Tasks.Do.run(["compile"])
106104
Mix.Tasks.Do.run(["--app", "bar", "--app", "foo", "e", "+", "p", "Foo"])
107105

108-
nl = os_newline()
109106
assert_received {:mix_shell, :info, ["==> bar"]}
110-
assert_received {:mix_shell, :run, ["hello" <> ^nl]}
107+
assert_received {:mix_shell, :run, ["hello\n"]}
111108
assert_received {:mix_shell, :info, ["[\"Foo\"]"]}
112109

113110
assert_received {:mix_shell, :info, ["==> foo"]}
114-
assert_received {:mix_shell, :run, ["hello" <> ^nl]}
111+
assert_received {:mix_shell, :run, ["hello\n"]}
115112
assert_received {:mix_shell, :info, ["[\"Foo\"]"]}
116113
end)
117114
end)

0 commit comments

Comments
 (0)