summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rebar_core.erl9
-rw-r--r--test/rebar_namespace_SUITE.erl93
2 files changed, 100 insertions, 2 deletions
diff --git a/src/rebar_core.erl b/src/rebar_core.erl
index cfe040a..c3a8951 100644
--- a/src/rebar_core.erl
+++ b/src/rebar_core.erl
@@ -54,8 +54,13 @@ process_command(State, Command) ->
undefined ->
%% On the first run (Namespace = undefined), we use the
%% unfound command name to be a namespace.
- do([{default, do} | TargetProviders],
- rebar_state:namespace(State, Command));
+ case providers:get_providers_by_namespace(Command, Providers) of
+ [] ->
+ {error, io_lib:format("Command ~p not found", [Command])};
+ _ ->
+ do([{default, do} | TargetProviders],
+ rebar_state:namespace(State, Command))
+ end;
default ->
{error, io_lib:format("Command ~p not found", [Command])};
_ ->
diff --git a/test/rebar_namespace_SUITE.erl b/test/rebar_namespace_SUITE.erl
new file mode 100644
index 0000000..40b7238
--- /dev/null
+++ b/test/rebar_namespace_SUITE.erl
@@ -0,0 +1,93 @@
+-module(rebar_namespace_SUITE).
+-compile(export_all).
+-include_lib("common_test/include/ct.hrl").
+-include_lib("eunit/include/eunit.hrl").
+
+all() -> [implicit_compile, default_compile, do_compile,
+ as_default_compile, as_do_compile,
+ notfound, do_notfound, default_notfound, ns_notfound].
+
+init_per_testcase(Case, Config0) ->
+ Config = rebar_test_utils:init_rebar_state(Config0),
+ AppDir = ?config(apps, Config),
+ Name = rebar_test_utils:create_random_name("app1_"++atom_to_list(Case)),
+ Vsn = rebar_test_utils:create_random_vsn(),
+ rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
+ [{name, Name} | Config].
+
+end_per_testcase(_, Config) ->
+ Config.
+
+implicit_compile(Config) ->
+ Name = ?config(name, Config),
+ rebar_test_utils:run_and_check(Config, [],
+ ["compile"],
+ {ok, [{app, Name}]}).
+
+default_compile(Config) ->
+ Name = ?config(name, Config),
+ rebar_test_utils:run_and_check(Config, [],
+ ["default","compile"],
+ {ok, [{app, Name}]}).
+
+do_compile(Config) ->
+ Name = ?config(name, Config),
+ rebar_test_utils:run_and_check(Config, [],
+ ["do", "compile"],
+ {ok, [{app, Name}]}).
+
+as_default_compile(Config) ->
+ Name = ?config(name, Config),
+ rebar_test_utils:run_and_check(Config, [],
+ ["as", "prod", "default", "compile"],
+ {ok, [{app, Name}]}).
+
+as_do_compile(Config) ->
+ Name = ?config(name, Config),
+ rebar_test_utils:run_and_check(Config, [],
+ ["as", "prod", "do", "compile"],
+ {ok, [{app, Name}]}).
+
+notfound(Config) ->
+ Command = ["fakecommand"],
+ rebar_test_utils:run_and_check(
+ Config, [], Command,
+ {error, io_lib:format("Command ~p not found", [fakecommand])}
+ ).
+
+do_notfound(Config) ->
+ Command = ["do", "fakecommand"],
+ rebar_test_utils:run_and_check(
+ Config, [], Command,
+ {error, io_lib:format("Command ~p not found", [fakecommand])}
+ ).
+
+default_notfound(Config) ->
+ Command = ["default", "fakecommand"],
+ rebar_test_utils:run_and_check(
+ Config, [], Command,
+ {error, io_lib:format("Command ~p not found", [fakecommand])}
+ ).
+
+ns_notfound(Config) ->
+ Command = ["ns", "fakecommand"],
+ rebar_test_utils:run_and_check(
+ add_fake_ns_provider(Config), [], Command,
+ {error, io_lib:format("Command ~p not found in namespace ~p",
+ [fakecommand, ns])}
+ ).
+
+%%% Helpers %%%
+add_fake_ns_provider(Config) ->
+ State = ?config(state, Config),
+ State1 = rebar_state:add_provider(
+ State,
+ providers:create(
+ [{name, fake_provider},
+ {module, fake_provider},
+ {namespace, ns},
+ {deps, []},
+ {opts, []}]
+ )
+ ),
+ [{state, State1} | Config].