diff options
| -rw-r--r-- | src/rebar_prv_do.erl | 43 | ||||
| -rw-r--r-- | test/rebar_namespace_SUITE.erl | 38 | 
2 files changed, 75 insertions, 6 deletions
| diff --git a/src/rebar_prv_do.erl b/src/rebar_prv_do.erl index 5ecd987..fd1767a 100644 --- a/src/rebar_prv_do.erl +++ b/src/rebar_prv_do.erl @@ -42,13 +42,46 @@ do_tasks([{TaskStr, Args}|Tail], State) ->      Task = list_to_atom(TaskStr),      State1 = rebar_state:set(State, task, Task),      State2 = rebar_state:command_args(State1, Args), -    case rebar_core:process_command(State2, Task) of -        {ok, _} -> -            do_tasks(Tail, State); -        Error -> -            Error +    Namespace = rebar_state:namespace(State2), +    case Namespace of +        default -> +            %% The first task we hit might be a namespace! +            case maybe_namespace(State2, Task, Args) of +                {ok, _} -> +                    do_tasks(Tail, State); +                {error, Reason} -> +                    {error, Reason} +            end; +        _ -> +            %% We're already in a non-default namespace, check the +            %% task directly. +            case rebar_core:process_command(State2, Task) of +                {ok, _} -> +                    do_tasks(Tail, State); +                {error, Reason} -> +                    {error, Reason} +            end      end. +  -spec format_error(any()) -> iolist().  format_error(Reason) ->      io_lib:format("~p", [Reason]). + +maybe_namespace(State, Task, Args) -> +    case rebar_core:process_namespace(State, Task) of +        {ok, State2, Task} -> +            %% The task exists after all. +            rebar_core:process_command(State2, Task); +        {ok, State2, do} when Args =/= [] -> +            %% We are in 'do' so we can't apply it directly. +            [NewTaskStr | NewArgs] = Args, +            NewTask = list_to_atom(NewTaskStr), +            State3 = rebar_state:command_args(State2, NewArgs), +            rebar_core:process_command(State3, NewTask); +        {ok, _, _} -> +            %% No arguments to consider as a command. Woops. +            {error, io_lib:format("Command ~p not found", [Task])}; +        {error, Reason} -> +            {error, Reason} +    end. diff --git a/test/rebar_namespace_SUITE.erl b/test/rebar_namespace_SUITE.erl index 3a55573..c267e7f 100644 --- a/test/rebar_namespace_SUITE.erl +++ b/test/rebar_namespace_SUITE.erl @@ -6,7 +6,8 @@  all() -> [implicit_compile, default_compile, do_compile,            as_default_compile, as_do_compile,            notfound, do_notfound, default_notfound, ns_notfound, ns_found, -          as_ns_invalid]. +          as_ns_invalid, +          do_ns_chain, do_ns_chain2, do_ns_noarg, do_ns_badcmd].  init_per_testcase(Case, Config0) ->      Config = rebar_test_utils:init_rebar_state(Config0), @@ -93,6 +94,41 @@ as_ns_invalid(Config) ->        {error, "Namespace 'as' is forbidden"}      ). +do_ns_chain(Config) -> +    %% `do` is also able to resolve namespaces on +    %% commands not found +    Command = ["do", "deps,", "ns", "fake_provider,", "deps"], +    rebar_test_utils:run_and_check( +      add_fake_ns_provider(Config), [], Command, +      {ok, []} +    ). + +do_ns_chain2(Config) -> +    %% `do` is also able to resolve namespaces on +    %% commands not found +    Command = ["do", "ns", "fake_provider,", "deps,", "ns", "fake_provider"], +    rebar_test_utils:run_and_check( +      add_fake_ns_provider(Config), [], Command, +      {ok, []} +    ). + +do_ns_noarg(Config) -> +    %% `do` is also able to resolve namespaces on +    %% commands not found +    Command = ["do", "ns"], +    rebar_test_utils:run_and_check( +      add_fake_ns_provider(Config), [], Command, +      {error, io_lib:format("Command ~p not found", [ns])} +    ). + +do_ns_badcmd(Config) -> +    %% `do` is also able to resolve namespaces on +    %% commands not found +    Command = ["do", "ns", "badcmd"], +    rebar_test_utils:run_and_check( +      add_fake_ns_provider(Config), [], Command, +      {error, io_lib:format("Command ~p not found in namespace ~p", [badcmd, ns])} +    ).  %%% Helpers %%%  add_fake_ns_provider(Config) -> | 
