summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Meadows-Jönsson <eric.meadows.jonsson@gmail.com>2019-03-20 20:21:36 +0100
committerEric Meadows-Jönsson <eric.meadows.jonsson@gmail.com>2019-03-20 20:23:24 +0100
commitee57f0e61b66cda3413376ea4a4b8df860e735dc (patch)
treed88c98e296471185a4d34b71c7e2e39c8882687f
parentfa64e8c78c4c951eb9f1d1503193816c61cacf01 (diff)
downloadelixir-emj/dep-misspell.tar.gz
Improve error message if dependency name is misspelledemj/dep-misspell
-rw-r--r--lib/mix/lib/mix/dep.ex16
-rw-r--r--lib/mix/lib/mix/dep/loader.ex5
-rw-r--r--lib/mix/test/mix/dep_test.exs54
-rw-r--r--lib/mix/test/mix/tasks/deps_test.exs21
4 files changed, 64 insertions, 32 deletions
diff --git a/lib/mix/lib/mix/dep.ex b/lib/mix/lib/mix/dep.ex
index a915e1a1f..82e11de1b 100644
--- a/lib/mix/lib/mix/dep.ex
+++ b/lib/mix/lib/mix/dep.ex
@@ -276,13 +276,21 @@ defmodule Mix.Dep do
"ok"
end
- def format_status(%Mix.Dep{status: {:noappfile, path}}) do
+ def format_status(%Mix.Dep{status: {:noappfile, {path, nil}}}) do
"could not find an app file at #{inspect(Path.relative_to_cwd(path))}. " <>
- "This may happen if the dependency was not yet compiled, " <>
- "or you specified the wrong application name in your deps, " <>
+ "This may happen if the dependency was not yet compiled " <>
"or the dependency indeed has no app file (then you can pass app: false as option)"
end
+ def format_status(%Mix.Dep{status: {:noappfile, {path, other_path}}}) do
+ other_app = Path.rootname(Path.basename(other_path))
+
+ "could not find an app file at #{inspect(Path.relative_to_cwd(path))}. " <>
+ "Another app file was found in the same directory " <>
+ "#{inspect(Path.relative_to_cwd(other_path))}, " <>
+ "try changing the dependency name to :#{other_app}"
+ end
+
def format_status(%Mix.Dep{status: {:invalidapp, path}}) do
"the app file at #{inspect(Path.relative_to_cwd(path))} is invalid"
end
@@ -468,7 +476,7 @@ defmodule Mix.Dep do
Returns `true` if the dependency is compilable.
"""
def compilable?(%Mix.Dep{status: {:elixirlock, _}}), do: true
- def compilable?(%Mix.Dep{status: {:noappfile, _}}), do: true
+ def compilable?(%Mix.Dep{status: {:noappfile, {_, _}}}), do: true
def compilable?(%Mix.Dep{status: {:scmlock, _}}), do: true
def compilable?(%Mix.Dep{status: :compile}), do: true
def compilable?(_), do: false
diff --git a/lib/mix/lib/mix/dep/loader.ex b/lib/mix/lib/mix/dep/loader.ex
index 62aa6feca..2ff597f37 100644
--- a/lib/mix/lib/mix/dep/loader.ex
+++ b/lib/mix/lib/mix/dep/loader.ex
@@ -422,7 +422,10 @@ defmodule Mix.Dep.Loader do
{:invalidapp, app_path}
{:error, _} ->
- {:noappfile, app_path}
+ case Path.wildcard(Path.join(Path.dirname(app_path), "*.app")) do
+ [other_app_path] -> {:noappfile, {app_path, other_app_path}}
+ _ -> {:noappfile, {app_path, nil}}
+ end
end
end
end
diff --git a/lib/mix/test/mix/dep_test.exs b/lib/mix/test/mix/dep_test.exs
index 921d5ae6b..4c9061bb1 100644
--- a/lib/mix/test/mix/dep_test.exs
+++ b/lib/mix/test/mix/dep_test.exs
@@ -63,7 +63,7 @@ defmodule Mix.DepTest do
assert Enum.find(deps, &match?(%Mix.Dep{app: :ok, status: {:ok, _}}, &1))
assert Enum.find(deps, &match?(%Mix.Dep{app: :invalidvsn, status: {:invalidvsn, :ok}}, &1))
assert Enum.find(deps, &match?(%Mix.Dep{app: :invalidapp, status: {:invalidapp, _}}, &1))
- assert Enum.find(deps, &match?(%Mix.Dep{app: :noappfile, status: {:noappfile, _}}, &1))
+ assert Enum.find(deps, &match?(%Mix.Dep{app: :noappfile, status: {:noappfile, {_, _}}}, &1))
assert Enum.find(deps, &match?(%Mix.Dep{app: :uncloned, status: {:unavailable, _}}, &1))
assert Enum.find(deps, &match?(%Mix.Dep{app: :optional, status: {:unavailable, _}}, &1))
end)
@@ -582,15 +582,15 @@ defmodule Mix.DepTest do
in_fixture("deps_status", fn ->
loaded = Mix.Dep.load_on_environment([])
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [divergedonly: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [divergedonly: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(env: :dev)
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [divergedonly: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [divergedonly: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(env: :test)
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [divergedonly: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [divergedonly: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
Mix.Tasks.Deps.run([])
assert_received {:mix_shell, :info, ["* git_repo" <> _]}
@@ -613,15 +613,15 @@ defmodule Mix.DepTest do
in_fixture("deps_status", fn ->
loaded = Mix.Dep.load_on_environment([])
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(env: :dev)
assert [:deps_repo] = Enum.map(loaded, & &1.app)
- assert [noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(env: :test)
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
end)
end)
end
@@ -637,7 +637,7 @@ defmodule Mix.DepTest do
in_fixture("deps_status", fn ->
loaded = Mix.Dep.load_on_environment([])
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(env: :dev)
assert [] = Enum.map(loaded, & &1.app)
@@ -648,7 +648,7 @@ defmodule Mix.DepTest do
loaded = Mix.Dep.load_on_environment(env: :prod)
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
end)
end)
end
@@ -664,11 +664,11 @@ defmodule Mix.DepTest do
in_fixture("deps_status", fn ->
loaded = Mix.Dep.load_on_environment([])
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [divergedonly: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [divergedonly: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(env: :dev)
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [divergedonly: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [divergedonly: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(env: :test)
assert [:git_repo] = Enum.map(loaded, & &1.app)
@@ -695,15 +695,15 @@ defmodule Mix.DepTest do
in_fixture("deps_status", fn ->
loaded = Mix.Dep.load_on_environment([])
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(env: :dev)
assert [:deps_repo] = Enum.map(loaded, & &1.app)
- assert [noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(env: :test)
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(env: :prod)
assert [] = Enum.map(loaded, & &1.app)
@@ -857,15 +857,15 @@ defmodule Mix.DepTest do
in_fixture("deps_status", fn ->
loaded = Mix.Dep.load_on_environment([])
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [divergedtargets: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [divergedtargets: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(target: :host)
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [divergedtargets: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [divergedtargets: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(target: :rpi3)
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [divergedtargets: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [divergedtargets: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
Mix.Tasks.Deps.run([])
assert_received {:mix_shell, :info, ["* git_repo" <> _]}
@@ -888,15 +888,15 @@ defmodule Mix.DepTest do
in_fixture("deps_status", fn ->
loaded = Mix.Dep.load_on_environment([])
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(target: :host)
assert [:deps_repo] = Enum.map(loaded, & &1.app)
- assert [noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(target: :rpi3)
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
end)
end)
end
@@ -912,7 +912,7 @@ defmodule Mix.DepTest do
in_fixture("deps_status", fn ->
loaded = Mix.Dep.load_on_environment([])
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(target: :host)
assert [] = Enum.map(loaded, & &1.app)
@@ -923,7 +923,7 @@ defmodule Mix.DepTest do
loaded = Mix.Dep.load_on_environment(target: :rpi3)
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
end)
end)
end
@@ -939,11 +939,11 @@ defmodule Mix.DepTest do
in_fixture("deps_status", fn ->
loaded = Mix.Dep.load_on_environment([])
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [divergedtargets: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [divergedtargets: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(target: :host)
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [divergedtargets: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [divergedtargets: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(target: :rpi3)
assert [:git_repo] = Enum.map(loaded, & &1.app)
@@ -970,15 +970,15 @@ defmodule Mix.DepTest do
in_fixture("deps_status", fn ->
loaded = Mix.Dep.load_on_environment([])
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(target: :host)
assert [:deps_repo] = Enum.map(loaded, & &1.app)
- assert [noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(target: :bbb)
assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app)
- assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status)
+ assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status)
loaded = Mix.Dep.load_on_environment(target: :rpi3)
assert [] = Enum.map(loaded, & &1.app)
diff --git a/lib/mix/test/mix/tasks/deps_test.exs b/lib/mix/test/mix/tasks/deps_test.exs
index 467d4af72..d701ce6c1 100644
--- a/lib/mix/test/mix/tasks/deps_test.exs
+++ b/lib/mix/test/mix/tasks/deps_test.exs
@@ -90,6 +90,27 @@ defmodule Mix.Tasks.DepsTest do
end)
end
+ test "prints misspelled dependency name hint" do
+ Mix.Project.push(DepsApp)
+
+ in_fixture("deps_status", fn ->
+ other_app_path = Path.join(Mix.Project.build_path(), "lib/noappfile/ebin/other_app.app")
+ File.mkdir_p!(Path.dirname(other_app_path))
+ File.write!(other_app_path, "")
+
+ Mix.Tasks.Deps.run([])
+
+ message =
+ " could not find an app file at \"_build/dev/lib/noappfile/ebin/noappfile.app\". " <>
+ "Another app file was found in the same directory " <>
+ "\"_build/dev/lib/noappfile/ebin/other_app.app\", " <>
+ "try changing the dependency name to :other_app"
+
+ assert_received {:mix_shell, :info, ["* noappfile (deps/noappfile)"]}
+ assert_received {:mix_shell, :info, [^message]}
+ end)
+ end
+
test "prints Elixir req mismatches" do
Mix.Project.push(ReqDepsApp)