diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/rebar_prv_as.erl | 50 | ||||
-rw-r--r-- | src/rebar_prv_do.erl | 1 | ||||
-rw-r--r-- | src/rebar_utils.erl | 4 |
3 files changed, 40 insertions, 15 deletions
diff --git a/src/rebar_prv_as.erl b/src/rebar_prv_as.erl index 1ad22ed..7ac5465 100644 --- a/src/rebar_prv_as.erl +++ b/src/rebar_prv_as.erl @@ -32,21 +32,45 @@ init(State) -> -spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}. do(State) -> - [Profile | Rest] = rebar_state:command_args(State), - Tasks = args_to_tasks(Rest), - Profiles = [list_to_atom(X) || X <- string:tokens(Profile, ",")], - State1 = rebar_state:apply_profiles(State, Profiles), - lists:foldl(fun(TaskArgs, {ok, StateAcc}) -> - [TaskStr | Args] = string:tokens(TaskArgs, " "), - Task = list_to_atom(TaskStr), - StateAcc1 = rebar_state:set(StateAcc, task, Task), - StateAcc2 = rebar_state:command_args(StateAcc1, Args), - rebar_core:process_command(StateAcc2, Task) - end, {ok, State1}, Tasks). + {Profiles, Tasks} = args_to_profiles_and_tasks(rebar_state:command_args(State)), + case Profiles of + [] -> + {error, "At least one profile must be specified when using `as`"}; + _ -> + State1 = rebar_state:apply_profiles(State, [list_to_atom(X) || X <- Profiles]), + rebar_prv_do:do_tasks(Tasks, State1) + end. -spec format_error(any()) -> iolist(). format_error(Reason) -> io_lib:format("~p", [Reason]). -args_to_tasks(Args) -> - [string:strip(T) || T <- string:tokens(string:join(Args, " "), ",")]. +args_to_profiles_and_tasks(Args) -> + first_profile(Args). + +first_profile([]) -> {[], []}; +first_profile([ProfileList|Rest]) -> + case re:split(ProfileList, ",", [{return, list}, {parts, 2}]) of + %% profile terminated by comma + [P, More] -> profiles([More] ++ Rest, [P]); + %% profile not terminated by comma + [P] -> comma_or_end(Rest, [P]) + end. + +profiles([], Acc) -> {lists:reverse(Acc), rebar_utils:args_to_tasks([])}; +profiles([ProfileList|Rest], Acc) -> + case re:split(ProfileList, ",", [{return, list}, {parts, 2}]) of + %% profile terminated by comma + [P, More] -> profiles([More] ++ Rest, [P|Acc]); + %% profile not terminated by comma + [P] -> comma_or_end(Rest, [P|Acc]) + end. + +%% `, foo...` +comma_or_end([","|Rest], Acc) -> + profiles(Rest, Acc); +%% `,foo...` +comma_or_end(["," ++ Profile|Rest], Acc) -> + profiles([Profile|Rest], Acc); +comma_or_end(Tasks, Acc) -> + {lists:reverse(Acc), rebar_utils:args_to_tasks(Tasks)}. diff --git a/src/rebar_prv_do.erl b/src/rebar_prv_do.erl index 8e6ee3a..5ecd987 100644 --- a/src/rebar_prv_do.erl +++ b/src/rebar_prv_do.erl @@ -7,6 +7,7 @@ -export([init/1, do/1, + do_tasks/2, format_error/1]). -include("rebar.hrl"). diff --git a/src/rebar_utils.erl b/src/rebar_utils.erl index 0c95c69..1a7bf98 100644 --- a/src/rebar_utils.erl +++ b/src/rebar_utils.erl @@ -477,8 +477,8 @@ new_task([], Acc) -> lists:reverse(Acc); new_task([TaskList|Rest], Acc) -> case re:split(TaskList, ",", [{return, list}, {parts, 2}]) of %% `do` consumes all remaining args - ["do" = Task|RestArgs] -> - lists:reverse([{Task, RestArgs ++ Rest}|Acc]); + ["do" = Task] -> + lists:reverse([{Task, Rest}|Acc]); %% single task terminated by a comma [Task, ""] -> new_task(Rest, [{Task, []}|Acc]); %% sequence of two or more tasks |