From acd118bbcb830e23cd86914f8f9ee64b266ea6c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Mon, 13 Jan 2025 08:16:34 +0100 Subject: [PATCH 1/2] Preserve argument quoting in mix cmd --- lib/mix/lib/mix/tasks/cmd.ex | 6 +++++- lib/mix/test/mix/tasks/cmd_test.exs | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/mix/lib/mix/tasks/cmd.ex b/lib/mix/lib/mix/tasks/cmd.ex index cfe43466db2..1af11727c27 100644 --- a/lib/mix/lib/mix/tasks/cmd.ex +++ b/lib/mix/lib/mix/tasks/cmd.ex @@ -57,6 +57,10 @@ defmodule Mix.Tasks.Cmd do def run(args) do {opts, args} = OptionParser.parse_head!(args, strict: @switches) + if args == [] do + Mix.raise("Expected at least one argument in mix cmd") + end + apps = opts |> Keyword.get_values(:app) @@ -69,7 +73,7 @@ defmodule Mix.Tasks.Cmd do if apps == [] or Mix.Project.config()[:app] in apps do cmd_opts = Keyword.take(opts, [:cd]) - case Mix.shell().cmd(Enum.join(args, " "), cmd_opts) do + case Mix.shell().cmd({hd(args), tl(args)}, cmd_opts) do 0 -> :ok status -> exit(status) end diff --git a/lib/mix/test/mix/tasks/cmd_test.exs b/lib/mix/test/mix/tasks/cmd_test.exs index be437998539..fae686f1a77 100644 --- a/lib/mix/test/mix/tasks/cmd_test.exs +++ b/lib/mix/test/mix/tasks/cmd_test.exs @@ -7,8 +7,8 @@ defmodule Mix.Tasks.CmdTest do nl = os_newline() Mix.Task.run("cmd", ["echo", "hello"]) assert_received {:mix_shell, :run, ["hello" <> ^nl]} - Mix.Task.run("cmd", ["echo", "hello"]) - assert_received {:mix_shell, :run, ["hello" <> ^nl]} + Mix.Task.run("cmd", ["echo", "hello world"]) + assert_received {:mix_shell, :run, ["hello world" <> ^nl]} end test "runs the command for each app" do From b73e02e33ae8fdd16171d090d9401b6ad90b87f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Mon, 13 Jan 2025 08:38:04 +0100 Subject: [PATCH 2/2] Fix CI --- lib/mix/test/mix/tasks/cmd_test.exs | 20 ++++++++------------ lib/mix/test/mix/tasks/do_test.exs | 15 ++++++--------- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/lib/mix/test/mix/tasks/cmd_test.exs b/lib/mix/test/mix/tasks/cmd_test.exs index fae686f1a77..6c738f2120a 100644 --- a/lib/mix/test/mix/tasks/cmd_test.exs +++ b/lib/mix/test/mix/tasks/cmd_test.exs @@ -4,22 +4,20 @@ defmodule Mix.Tasks.CmdTest do use MixTest.Case test "can be called multiple times" do - nl = os_newline() Mix.Task.run("cmd", ["echo", "hello"]) - assert_received {:mix_shell, :run, ["hello" <> ^nl]} + assert_received {:mix_shell, :run, ["hello\n"]} Mix.Task.run("cmd", ["echo", "hello world"]) - assert_received {:mix_shell, :run, ["hello world" <> ^nl]} + assert_received {:mix_shell, :run, ["hello world\n"]} end test "runs the command for each app" do in_fixture("umbrella_dep/deps/umbrella", fn -> Mix.Project.in_project(:umbrella, ".", fn _ -> Mix.Task.run("cmd", ["echo", "hello"]) - nl = os_newline() assert_received {:mix_shell, :info, ["==> bar"]} - assert_received {:mix_shell, :run, ["hello" <> ^nl]} + assert_received {:mix_shell, :run, ["hello\n"]} assert_received {:mix_shell, :info, ["==> foo"]} - assert_received {:mix_shell, :run, ["hello" <> ^nl]} + assert_received {:mix_shell, :run, ["hello\n"]} end) end) end @@ -29,11 +27,10 @@ defmodule Mix.Tasks.CmdTest do in_fixture("umbrella_dep/deps/umbrella", fn -> Mix.Project.in_project(:umbrella, ".", fn _ -> Mix.Task.run("cmd", ["--app", "bar", "echo", "hello"]) - nl = os_newline() assert_received {:mix_shell, :info, ["==> bar"]} - assert_received {:mix_shell, :run, ["hello" <> ^nl]} + assert_received {:mix_shell, :run, ["hello\n"]} refute_received {:mix_shell, :info, ["==> foo"]} - refute_received {:mix_shell, :run, ["hello" <> ^nl]} + refute_received {:mix_shell, :run, ["hello\n"]} end) end) end) @@ -44,11 +41,10 @@ defmodule Mix.Tasks.CmdTest do in_fixture("umbrella_dep/deps/umbrella", fn -> Mix.Project.in_project(:umbrella, ".", fn _ -> Mix.Task.run("cmd", ["--app", "bar", "--app", "foo", "echo", "hello"]) - nl = os_newline() assert_received {:mix_shell, :info, ["==> bar"]} - assert_received {:mix_shell, :run, ["hello" <> ^nl]} + assert_received {:mix_shell, :run, ["hello\n"]} assert_received {:mix_shell, :info, ["==> foo"]} - assert_received {:mix_shell, :run, ["hello" <> ^nl]} + assert_received {:mix_shell, :run, ["hello\n"]} end) end) end) diff --git a/lib/mix/test/mix/tasks/do_test.exs b/lib/mix/test/mix/tasks/do_test.exs index 00b89af4e9d..8dd83f8205c 100644 --- a/lib/mix/test/mix/tasks/do_test.exs +++ b/lib/mix/test/mix/tasks/do_test.exs @@ -52,11 +52,10 @@ defmodule Mix.Tasks.DoTest do Mix.Project.in_project(:umbrella, ".", fn _ -> Mix.Tasks.Do.run(~w(--app bar compile --list + cmd echo hello)) - nl = os_newline() assert_received {:mix_shell, :info, ["==> bar"]} - assert_received {:mix_shell, :run, ["hello" <> ^nl]} + assert_received {:mix_shell, :run, ["hello\n"]} refute_received {:mix_shell, :info, ["==> foo"]} - refute_received {:mix_shell, :run, ["hello" <> ^nl]} + refute_received {:mix_shell, :run, ["hello\n"]} end) end) end @@ -66,11 +65,10 @@ defmodule Mix.Tasks.DoTest do Mix.Project.in_project(:umbrella, ".", fn _ -> Mix.Tasks.Do.run(~w(--app bar --app foo compile --list + cmd echo hello)) - nl = os_newline() assert_received {:mix_shell, :info, ["==> bar"]} - assert_received {:mix_shell, :run, ["hello" <> ^nl]} + assert_received {:mix_shell, :run, ["hello\n"]} assert_received {:mix_shell, :info, ["==> foo"]} - assert_received {:mix_shell, :run, ["hello" <> ^nl]} + assert_received {:mix_shell, :run, ["hello\n"]} end) end) end @@ -105,13 +103,12 @@ defmodule Mix.Tasks.DoTest do Mix.Tasks.Do.run(["compile"]) Mix.Tasks.Do.run(["--app", "bar", "--app", "foo", "e", "+", "p", "Foo"]) - nl = os_newline() assert_received {:mix_shell, :info, ["==> bar"]} - assert_received {:mix_shell, :run, ["hello" <> ^nl]} + assert_received {:mix_shell, :run, ["hello\n"]} assert_received {:mix_shell, :info, ["[\"Foo\"]"]} assert_received {:mix_shell, :info, ["==> foo"]} - assert_received {:mix_shell, :run, ["hello" <> ^nl]} + assert_received {:mix_shell, :run, ["hello\n"]} assert_received {:mix_shell, :info, ["[\"Foo\"]"]} end) end)