diff --git a/apps/rebar/src/rebar_utils.erl b/apps/rebar/src/rebar_utils.erl index 0470bb940..9ed235192 100644 --- a/apps/rebar/src/rebar_utils.erl +++ b/apps/rebar/src/rebar_utils.erl @@ -900,9 +900,20 @@ arg_or_flag(["," ++ Task|Rest], Acc) -> new_task([Task|Rest], Acc); %% a flag arg_or_flag(["-" ++ _ = Flag|Rest], [{Task, Args}|Acc]) -> case maybe_ends_in_comma(Flag) of - false -> arg_or_flag(Rest, [{Task, [Flag|Args]}|Acc]); - NewFlag -> new_task(Rest, [{Task, - lists:reverse([NewFlag|Args])}|Acc]) + false -> + case rest_arg_self_contains_comma(Rest) of + false -> + arg_or_flag(Rest, [{Task, [Flag|Args]}|Acc]); + {ExtraArg,NewRest} -> + case maybe_ends_in_comma(ExtraArg) of + false -> + arg_or_flag(NewRest, [{Task, [ExtraArg,Flag|Args]}|Acc]); + TrimmedArg -> + new_task(NewRest, [{Task, [Flag,TrimmedArg|Args]}|Acc]) + end + end; + NewFlag -> + new_task(Rest, [{Task, lists:reverse([NewFlag|Args])}|Acc]) end; %% an argument or a sequence of arguments arg_or_flag([ArgList|Rest], [{Task, Args}|Acc]) -> @@ -923,6 +934,23 @@ maybe_ends_in_comma(H) -> _ -> false end. +%% looks whether a sequence of arguments comes with a comma inside of it. +%% For example `-a a,b' would match here, but `-a x' or `-a x,' wouldn't. +%% This is used by the caller to know whether to break up a task or assume +%% the comma is part of the argument itself. +rest_arg_self_contains_comma([]) -> false; +rest_arg_self_contains_comma([ArgList|Rest]) -> + case re:split(ArgList, ",", [{return, list}, {parts, 2}, unicode]) of + [_Arg, ""] -> + false; + [_Arg, _More] -> + {ArgList, Rest}; + [_Arg] -> + false + end. + + + get_http_vars(Scheme) -> OS = case os:getenv(atom_to_list(Scheme)) of Str when is_list(Str) -> Str; diff --git a/apps/rebar/test/rebar_utils_SUITE.erl b/apps/rebar/test/rebar_utils_SUITE.erl index 96417f8c8..1d20db30f 100644 --- a/apps/rebar/test/rebar_utils_SUITE.erl +++ b/apps/rebar/test/rebar_utils_SUITE.erl @@ -24,6 +24,7 @@ task_with_flag_with_commas/1, task_with_multiple_flags/1, special_task_do/1, + special_task_as_with_commas/1, valid_otp_version/1, valid_old_format_otp_version/1, valid_otp_version_equal/1, @@ -70,6 +71,7 @@ groups() -> task_with_flag_with_commas, task_with_multiple_flags, special_task_do, + special_task_as_with_commas, valid_otp_version, valid_old_format_otp_version, valid_otp_version_equal, @@ -145,6 +147,20 @@ special_task_do(_Config) -> "do", "bar,", "baz"]). +special_task_as_with_commas(_Config) -> + [{"as", ["profile"]}, {"bar", ["--x=y,z"]}, {"baz", ["--arg=a,b"]}] = + rebar_utils:args_to_tasks(["as", "profile,", + "bar", "--x=y,z,", + "baz", "--arg=a,b"]), + [{"as", ["profile"]}, {"bar", ["-x", "y,z"]}, {"baz", ["--a", "a,b"]}] = + rebar_utils:args_to_tasks(["as", "profile,", + "bar", "-x", "y,z,", + "baz", "--a", "a,b"]), + [{"as", ["profile"]}, {"bar", ["-x", "y"]}, {"z", []}, {"baz", ["--a", "a"]}, {"b",[]}] = + rebar_utils:args_to_tasks(["as", "profile,", + "bar", "-x", "y,", "z,", + "baz", "--a", "a,", "b"]), + ok. valid_otp_version(_Config) -> meck:new(rebar_utils, [passthrough]),