Skip to content

Commit 42b0c24

Browse files
committed
Fix command-line arguments handling in Mix.Tasks.Run
1 parent c0bc64f commit 42b0c24

File tree

2 files changed

+41
-7
lines changed

2 files changed

+41
-7
lines changed

lib/mix/lib/mix/tasks/run.ex

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,20 @@ defmodule Mix.Tasks.Run do
3434
def run(args) do
3535
{opts, head, _} = OptionParser.parse_head(args,
3636
aliases: [r: :require, pr: :parallel_require, e: :eval],
37-
switches: [parallel_require: :keep, require: :keep])
37+
switches: [parallel_require: :keep, require: :keep, eval: :keep])
3838

3939
# Require the project to be available
4040
Mix.Project.get!
4141

42-
file =
43-
case head do
44-
["--"|t] -> System.argv(t); nil
45-
[h|t] -> System.argv(t); h
46-
[] -> System.argv([]); nil
42+
{file, argv} =
43+
case {Keyword.has_key?(opts, :eval), head} do
44+
{true, _} -> {nil, head}
45+
{_, [h|t]} -> {h, t}
46+
{_, []} -> {nil, []}
4747
end
4848

49+
System.argv(argv)
50+
4951
# Start app after rewriting System.argv,
5052
# but before requiring and evaling
5153
Mix.Task.run "app.start", args

lib/mix/test/mix/tasks/run_test.exs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@ defmodule Mix.Tasks.RunTest do
1313
end
1414
end
1515

16-
test "run requires files before evaling commands" do
16+
setup do
1717
Mix.Project.push MixTest.Case.Sample
18+
end
19+
20+
test "run requires files before evaling commands" do
1821
git_repo = fixture_path("git_repo/lib/git_repo.ex")
1922

2023
in_fixture "no_mixfile", fn ->
@@ -27,4 +30,33 @@ defmodule Mix.Tasks.RunTest do
2730
after
2831
purge [GitRepo]
2932
end
33+
34+
test "run rewrites System.argv" do
35+
in_fixture "no_mixfile", fn ->
36+
File.write! file = "argv.exs", "send self, {:system_argv, System.argv}"
37+
unload_file = fn ->
38+
Code.unload_files [Path.expand(file)]
39+
end
40+
41+
Mix.Tasks.Run.run [file]
42+
assert_received {:system_argv, []}
43+
44+
unload_file.()
45+
Mix.Tasks.Run.run [file, "foo", "-e", "bar"]
46+
assert_received {:system_argv, ["foo", "-e", "bar"]}
47+
48+
unload_file.()
49+
Mix.Tasks.Run.run ["-e", "send self, {:system_argv, System.argv}", file, "foo", "-x", "bar"]
50+
assert_received {:system_argv, [file, "foo", "-x", "bar"]}
51+
52+
unload_file.()
53+
Mix.Tasks.Run.run [
54+
"-e", "send self, :evaled",
55+
"-e", "send self, {:system_argv, System.argv}",
56+
"--no-compile", file, "-x", "bar"
57+
]
58+
assert_received :evaled
59+
assert_received {:system_argv, [file, "-x", "bar"]}
60+
end
61+
end
3062
end

0 commit comments

Comments
 (0)