Skip to content

Commit a38e6b7

Browse files
author
José Valim
committed
Ensure aliases are invoked for recursive tasks
Closes #2650
1 parent 72199ca commit a38e6b7

File tree

2 files changed

+49
-27
lines changed

2 files changed

+49
-27
lines changed

lib/mix/lib/mix/task.ex

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -205,10 +205,14 @@ defmodule Mix.Task do
205205
information.
206206
"""
207207
@spec run(task_name, [any]) :: any
208-
def run(task, args \\ []) when is_binary(task) or is_atom(task) do
209-
task = to_string(task)
210-
proj = Mix.Project.get
208+
def run(task, args \\ [])
211209

210+
def run(task, args) when is_atom(task) do
211+
run(Atom.to_string(task), args)
212+
end
213+
214+
def run(task, args) when is_binary(task) do
215+
proj = Mix.Project.get
212216
alias = Mix.Project.config[:aliases][String.to_atom(task)]
213217

214218
cond do
@@ -217,26 +221,22 @@ defmodule Mix.Task do
217221
Mix.TasksServer.put({:task, task, proj})
218222
res
219223
Mix.TasksServer.run({:task, task, proj}) ->
220-
run_task(task, args)
224+
run_task(proj, task, args)
221225
true ->
222226
:noop
223227
end
224228
end
225229

226-
defp run_task(task, args) do
230+
defp run_task(proj, task, args) do
227231
module = get!(task)
228232

229-
fun = fn proj ->
230-
Mix.TasksServer.put({:task, task, proj})
231-
module.run(args)
232-
end
233-
234233
if recursive(module) and Mix.Project.umbrella? and Mix.ProjectStack.enable_recursion do
235-
res = recur(fun)
234+
res = recur(fn _ -> run(task, args) end)
236235
Mix.ProjectStack.disable_recursion
237236
res
238237
else
239-
fun.(Mix.Project.get)
238+
Mix.TasksServer.put({:task, task, proj})
239+
module.run(args)
240240
end
241241
end
242242

lib/mix/test/mix/umbrella_test.exs

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,25 @@ defmodule Mix.UmbrellaTest do
5555
end
5656
end
5757

58+
test "list deps for umbrella as dependency" do
59+
in_fixture("umbrella_dep", fn ->
60+
Mix.Project.in_project(:umbrella_dep, ".", fn _ ->
61+
Mix.Task.run "deps"
62+
assert_received {:mix_shell, :info, ["* umbrella (deps/umbrella)"]}
63+
assert_received {:mix_shell, :info, ["* foo (apps/foo)"]}
64+
end)
65+
end)
66+
end
67+
68+
test "compile for umbrella as dependency" do
69+
in_fixture "umbrella_dep", fn ->
70+
Mix.Project.in_project(:umbrella_dep, ".", fn _ ->
71+
Mix.Task.run "deps.compile"
72+
assert Bar.bar == "hello world"
73+
end)
74+
end
75+
end
76+
5877
defmodule CycleDeps do
5978
def project do
6079
[app: :umbrella_dep,
@@ -112,22 +131,25 @@ defmodule Mix.UmbrellaTest do
112131
end
113132
end
114133

115-
test "list deps for umbrella as dependency" do
116-
in_fixture("umbrella_dep", fn ->
117-
Mix.Project.in_project(:umbrella_dep, ".", fn _ ->
118-
Mix.Task.run "deps"
119-
assert_received {:mix_shell, :info, ["* umbrella (deps/umbrella)"]}
120-
assert_received {:mix_shell, :info, ["* foo (apps/foo)"]}
121-
end)
122-
end)
123-
end
134+
test "uses dependency aliases" do
135+
in_fixture "umbrella_dep/deps/umbrella", fn ->
136+
Mix.Project.in_project :umbrella, ".", fn _ ->
137+
File.write! "apps/bar/mix.exs", """
138+
defmodule Bar.Mix do
139+
use Mix.Project
124140
125-
test "compile for umbrella as dependency" do
126-
in_fixture "umbrella_dep", fn ->
127-
Mix.Project.in_project(:umbrella_dep, ".", fn _ ->
128-
Mix.Task.run "deps.compile"
129-
assert "hello world" == Bar.bar
130-
end)
141+
def project do
142+
[app: :bar,
143+
version: "0.1.0",
144+
aliases: [compile: fn _ -> Mix.shell.info "no compile bar" end]]
145+
end
146+
end
147+
"""
148+
149+
Mix.Task.run "compile"
150+
assert_receive {:mix_shell, :info, ["no compile bar"]}
151+
refute_receive {:mix_shell, :info, ["Compiled lib/bar.ex"]}
152+
end
131153
end
132154
end
133155

0 commit comments

Comments
 (0)