Skip to content

Commit 1dc6d10

Browse files
davydog187José Valim
authored andcommitted
mix help when theres a task and alias (#8020)
Signed-off-by: José Valim <[email protected]>
1 parent e7138fb commit 1dc6d10

File tree

2 files changed

+81
-14
lines changed

2 files changed

+81
-14
lines changed

lib/mix/lib/mix/tasks/help.ex

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,40 @@ defmodule Mix.Tasks.Help do
8686
def run([task]) do
8787
loadpaths!()
8888

89-
{doc, location} = verbose_doc(task)
9089
opts = Application.get_env(:mix, :colors)
9190

91+
opts =
92+
if ansi_docs?(opts) do
93+
[width: width()] ++ opts
94+
else
95+
opts
96+
end
97+
98+
case verbose_doc(task) do
99+
[single] ->
100+
print_doc(task, single, opts)
101+
102+
[alias_doc, task_doc] ->
103+
print_doc(task, alias_doc, opts)
104+
105+
note = "\nThere is also a task named \"#{task}\". The documentation is shown next.\n"
106+
107+
if ansi_docs?(opts) do
108+
IO.ANSI.Docs.print(note, opts)
109+
else
110+
IO.puts(note)
111+
end
112+
113+
print_doc(task, task_doc, opts)
114+
end
115+
end
116+
117+
def run(_) do
118+
Mix.raise("Unexpected arguments, expected \"mix help\" or \"mix help TASK\"")
119+
end
120+
121+
defp print_doc(task, {doc, location}, opts) do
92122
if ansi_docs?(opts) do
93-
opts = [width: width()] ++ opts
94123
IO.ANSI.Docs.print_heading("mix #{task}", opts)
95124
IO.ANSI.Docs.print(doc, opts)
96125
else
@@ -101,10 +130,6 @@ defmodule Mix.Tasks.Help do
101130
IO.puts("Location: #{location}")
102131
end
103132

104-
def run(_) do
105-
Mix.raise("Unexpected arguments, expected \"mix help\" or \"mix help TASK\"")
106-
end
107-
108133
# Loadpaths without checks because tasks may be defined in deps.
109134
defp loadpaths! do
110135
args = ["--no-elixir-version-check", "--no-deps-check", "--no-archives-check"]
@@ -194,14 +219,29 @@ defmodule Mix.Tasks.Help do
194219
defp verbose_doc(task) do
195220
aliases = load_aliases()
196221

197-
if Map.has_key?(aliases, task) do
198-
task_name = aliases[task]
199-
doc = "Alias for " <> inspect(task_name)
200-
{doc, "mix.exs"}
201-
else
202-
module = Mix.Task.get!(task)
203-
doc = Mix.Task.moduledoc(module) || "There is no documentation for this task"
204-
{doc, where_is_file(module)}
222+
has_alias? = Map.has_key?(aliases, task)
223+
has_task? = Mix.Task.get(task)
224+
225+
cond do
226+
has_alias? and has_task? ->
227+
[alias_doc(aliases[task]), task_doc(task)]
228+
229+
has_alias? ->
230+
[alias_doc(aliases[task])]
231+
232+
true ->
233+
[task_doc(task)]
205234
end
206235
end
236+
237+
defp alias_doc(task_name) do
238+
doc = "Alias for " <> inspect(task_name)
239+
{doc, "mix.exs"}
240+
end
241+
242+
defp task_doc(task) do
243+
module = Mix.Task.get!(task)
244+
doc = Mix.Task.moduledoc(module) || "There is no documentation for this task"
245+
{doc, where_is_file(module)}
246+
end
207247
end

lib/mix/test/mix/tasks/help_test.exs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,33 @@ defmodule Mix.Tasks.HelpTest do
136136
end)
137137
end
138138

139+
defmodule ShadowedAliases do
140+
def project do
141+
[aliases: [compile: "compile"]]
142+
end
143+
end
144+
145+
test "help TASK && ALIAS", context do
146+
Mix.Project.push(ShadowedAliases)
147+
148+
in_tmp(context.test, fn ->
149+
output =
150+
capture_io(fn ->
151+
Mix.Tasks.Help.run(["compile"])
152+
end)
153+
154+
assert output =~ "# mix compile\n\n"
155+
assert output =~ "Alias for \"compile\"\n"
156+
assert output =~ ~r/^Location: mix.exs/m
157+
158+
assert output =~
159+
"\nThere is also a task named \"compile\". The documentation is shown next.\n"
160+
161+
assert output =~ "## Command line options"
162+
assert output =~ ~r/^Location:/m
163+
end)
164+
end
165+
139166
test "help --search PATTERN", context do
140167
in_tmp(context.test, fn ->
141168
Mix.Tasks.Help.run(["--search", "deps"])

0 commit comments

Comments
 (0)