summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTristan Sloughter <tristan.sloughter@gmail.com>2015-03-07 15:09:50 -0600
committerTristan Sloughter <tristan.sloughter@gmail.com>2015-03-07 15:09:50 -0600
commita18ddc4c97c474bbf0f75984b77fa9e1e5fa5583 (patch)
tree6d4b692cb04efc09b4f990cc64ac42c6cd83c630
parentc6f069fe4793dc205c6db1411fe4163cf03af4c5 (diff)
parent8cfb4df3e055b4f1e323273faf9b5157994a583a (diff)
Merge pull request #242 from ferd/namespace-regression
Fix namespace regressions
-rw-r--r--src/rebar_core.erl38
-rw-r--r--test/rebar_namespace_SUITE.erl24
2 files changed, 56 insertions, 6 deletions
diff --git a/src/rebar_core.erl b/src/rebar_core.erl
index 36c428d..ab90961 100644
--- a/src/rebar_core.erl
+++ b/src/rebar_core.erl
@@ -74,7 +74,21 @@ process_command(State, Command) ->
%% properly exist for non-default namespaces outside of
%% dynamic dispatch calls for namespaces.
do(TargetProviders, rebar_state:namespace(State, default));
- Command when Command =:= do; Command =:= as ->
+ Command when Command =:= as, Namespace =:= undefined ->
+ %% Because of the possible forms such as:
+ %% 'rebar3 as profile task`, `rebar3 as profile do task`
+ %% and `rebar3 as profile namespace task`, we can only know
+ %% whether we're in the first 'as' or a namespace 'as' by
+ %% looking at profiles (as makes them non-default).
+ %% The namespace 'as' is banned. It also makes it impossible
+ %% to have both $REBAR_PROFILE set and use 'as' in a command
+ case rebar_state:current_profiles(State) of
+ [default] ->
+ do([{default, hd(TargetProviders)} | tl(TargetProviders)], State);
+ _ ->
+ {error, "Namespace 'as' is forbidden"}
+ end;
+ Command when Command =:= do ->
do(TargetProviders, State);
_ ->
Profiles = providers:profiles(CommandProvider),
@@ -83,7 +97,12 @@ process_command(State, Command) ->
case getopt:parse(Opts, rebar_state:command_args(State1)) of
{ok, Args} ->
State2 = rebar_state:command_parsed_args(State1, Args),
- do(TargetProviders, State2);
+ case Namespace of
+ undefined -> % we're executing commands, set the default namespace
+ do(TargetProviders, rebar_state:namespace(State2, default));
+ _ ->
+ do(TargetProviders, State2)
+ end;
{error, {invalid_option, Option}} ->
{error, io_lib:format("Invalid option ~s on task ~p", [Option, Command])}
end
@@ -94,8 +113,19 @@ process_command(State, Command) ->
do([], State) ->
{ok, State};
do([ProviderName | Rest], State) ->
- Provider = providers:get_provider(ProviderName
- ,rebar_state:providers(State)),
+ %% Special providers like 'as', 'do' or some hooks may be passed
+ %% as a tuple {Namespace, Name}, otherwise not. Handle them
+ %% on a per-need basis.
+ Provider = case ProviderName of
+ {Namespace, Name} ->
+ providers:get_provider(Name
+ ,rebar_state:providers(State)
+ ,Namespace);
+ _ ->
+ providers:get_provider(ProviderName
+ ,rebar_state:providers(State)
+ ,rebar_state:namespace(State))
+ end,
case providers:do(Provider, State) of
{ok, State1} ->
do(Rest, State1);
diff --git a/test/rebar_namespace_SUITE.erl b/test/rebar_namespace_SUITE.erl
index 40b7238..3a55573 100644
--- a/test/rebar_namespace_SUITE.erl
+++ b/test/rebar_namespace_SUITE.erl
@@ -5,7 +5,8 @@
all() -> [implicit_compile, default_compile, do_compile,
as_default_compile, as_do_compile,
- notfound, do_notfound, default_notfound, ns_notfound].
+ notfound, do_notfound, default_notfound, ns_notfound, ns_found,
+ as_ns_invalid].
init_per_testcase(Case, Config0) ->
Config = rebar_test_utils:init_rebar_state(Config0),
@@ -77,6 +78,22 @@ ns_notfound(Config) ->
[fakecommand, ns])}
).
+ns_found(Config) ->
+ Command = ["ns", "fake_provider"],
+ rebar_test_utils:run_and_check(
+ add_fake_ns_provider(Config), [], Command,
+ {ok, []}
+ ).
+
+as_ns_invalid(Config) ->
+ %% The as namespace is not valid
+ Command = ["as", "profile", "as", "task"],
+ rebar_test_utils:run_and_check(
+ add_fake_ns_provider(Config), [], Command,
+ {error, "Namespace 'as' is forbidden"}
+ ).
+
+
%%% Helpers %%%
add_fake_ns_provider(Config) ->
State = ?config(state, Config),
@@ -84,10 +101,13 @@ add_fake_ns_provider(Config) ->
State,
providers:create(
[{name, fake_provider},
- {module, fake_provider},
+ {module, ?MODULE},
{namespace, ns},
{deps, []},
{opts, []}]
)
),
[{state, State1} | Config].
+
+%% callback for the test suite.
+do(State) -> {ok, State}.