Skip to content

Commit 3f3e987

Browse files
committed
Handle aliases with code recursion
It addresses a regression introduced in 97e8b02. Closes nerves-project/nerves#557.
1 parent 53c8b27 commit 3f3e987

File tree

3 files changed

+22
-9
lines changed

3 files changed

+22
-9
lines changed

lib/mix/lib/mix/task.ex

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -355,12 +355,12 @@ defmodule Mix.Task do
355355
alias = Mix.Project.config()[:aliases][String.to_atom(task)]
356356

357357
cond do
358-
is_nil(alias) ->
359-
run_task(proj, task, args)
360-
361-
Mix.TasksServer.run({:alias, task, proj}) ->
358+
alias && Mix.TasksServer.run({:alias, task, proj}) ->
362359
run_alias(List.wrap(alias), args, proj, task, :ok)
363360

361+
!Mix.TasksServer.get({:task, task, proj}) ->
362+
run_task(proj, task, args)
363+
364364
true ->
365365
:noop
366366
end
@@ -371,8 +371,8 @@ defmodule Mix.Task do
371371
# 2. Otherwise we compile and load dependencies
372372
# 3. Finally, we compile the current project in hope it is available.
373373
module =
374-
get_task_or_run(proj, task, fn -> Mix.Task.run("deps.loadpaths") end) ||
375-
get_task_or_run(proj, task, fn -> Mix.Task.run("compile", []) end) ||
374+
get_task_or_run(proj, task, fn -> run("deps.loadpaths") end) ||
375+
get_task_or_run(proj, task, fn -> run("compile", []) end) ||
376376
get!(task)
377377

378378
recursive = recursive(module)
@@ -450,7 +450,8 @@ defmodule Mix.Task do
450450
run_alias(t, alias_args, proj, original_task, res)
451451
end
452452

453-
defp run_alias([], _alias_task, _proj, _original_task, res) do
453+
defp run_alias([], _alias_args, proj, original_task, res) do
454+
Mix.TasksServer.put({:task, original_task, proj})
454455
res
455456
end
456457

lib/mix/lib/mix/tasks_server.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ defmodule Mix.TasksServer do
2121
Agent.update(@name, &Map.put(&1, tuple, true), @timeout)
2222
end
2323

24+
def get(tuple) do
25+
Agent.get(@name, &Map.get(&1, tuple), @timeout)
26+
end
27+
2428
def delete_many(many) do
2529
Agent.update(@name, &Map.drop(&1, many), @timeout)
2630
end

lib/mix/test/mix/aliases_test.exs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,14 @@ defmodule Mix.AliasesTest do
1010
h: "hello",
1111
p: &inspect/1,
1212
compile: "hello",
13+
cmd: &call_cmd/1,
1314
help: ["help", "hello"],
1415
"nested.h": [&Mix.shell().info(inspect(&1)), "h foo bar"]
1516
]
1617
]
1718
end
19+
20+
defp call_cmd(args), do: Mix.Task.run("cmd", args)
1821
end
1922

2023
setup do
@@ -50,13 +53,18 @@ defmodule Mix.AliasesTest do
5053
assert Mix.Task.run("compile", []) == :noop
5154
end
5255

53-
test "run alias override with recursion" do
56+
test "run alias override with name-recursion" do
5457
assert Mix.Task.rerun("help", []) == "Hello, World!"
5558
assert_received {:mix_shell, :info, ["mix test" <> _]}
5659

5760
# Arguments are passed to the recursive task and not the last one.
5861
assert ExUnit.CaptureIO.capture_io(fn ->
59-
Mix.Task.rerun("help", ["test"]) == "Hello, World!"
62+
Mix.Task.rerun("help", ["test"])
6063
end) =~ "mix test"
6164
end
65+
66+
test "run alias override with code-recursion" do
67+
assert Mix.Task.rerun("cmd", ["echo", "hello"]) == :ok
68+
assert_received {:mix_shell, :run, ["hello" <> _]}
69+
end
6270
end

0 commit comments

Comments
 (0)