diff options
-rw-r--r-- | rebar.config | 4 | ||||
-rw-r--r-- | rebar.lock | 8 | ||||
-rw-r--r-- | src/rebar_prv_alias.erl | 69 | ||||
-rw-r--r-- | test/rebar_alias_SUITE.erl | 27 |
4 files changed, 78 insertions, 30 deletions
diff --git a/rebar.config b/rebar.config index dda579d..89aea8a 100644 --- a/rebar.config +++ b/rebar.config @@ -1,13 +1,13 @@ %% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*- %% ex: ts=4 sw=4 ft=erlang et -{deps, [{erlware_commons, "1.0.4"}, +{deps, [{erlware_commons, "1.0.5"}, {ssl_verify_fun, "1.1.3"}, {certifi, "2.0.0"}, {providers, "1.7.0"}, {getopt, "1.0.1"}, {bbmustache, "1.3.0"}, - {relx, "3.24.3"}, + {relx, "3.24.4"}, {cf, "0.2.2"}, {cth_readable, "1.3.2"}, {eunit_formatters, "0.5.0"}]}. @@ -3,11 +3,11 @@ {<<"certifi">>,{pkg,<<"certifi">>,<<"2.0.0">>},0}, {<<"cf">>,{pkg,<<"cf">>,<<"0.2.2">>},0}, {<<"cth_readable">>,{pkg,<<"cth_readable">>,<<"1.3.2">>},0}, - {<<"erlware_commons">>,{pkg,<<"erlware_commons">>,<<"1.0.4">>},0}, + {<<"erlware_commons">>,{pkg,<<"erlware_commons">>,<<"1.0.5">>},0}, {<<"eunit_formatters">>,{pkg,<<"eunit_formatters">>,<<"0.5.0">>},0}, {<<"getopt">>,{pkg,<<"getopt">>,<<"1.0.1">>},0}, {<<"providers">>,{pkg,<<"providers">>,<<"1.7.0">>},0}, - {<<"relx">>,{pkg,<<"relx">>,<<"3.24.3">>},0}, + {<<"relx">>,{pkg,<<"relx">>,<<"3.24.4">>},0}, {<<"ssl_verify_fun">>,{pkg,<<"ssl_verify_fun">>,<<"1.1.3">>},0}]}. [ {pkg_hash,[ @@ -15,10 +15,10 @@ {<<"certifi">>, <<"A0C0E475107135F76B8C1D5BC7EFB33CD3815CB3CF3DEA7AEFDD174DABEAD064">>}, {<<"cf">>, <<"7F2913FFF90ABCABD0F489896CFEB0B0674F6C8DF6C10B17A83175448029896C">>}, {<<"cth_readable">>, <<"44F963C27027EBE92BECBE3194FD9A3798507C7352E2C6F36950DE61CB3C8146">>}, - {<<"erlware_commons">>, <<"8F215709CCB8A99BC0436405CD78A8A92B84AD08969C2B926E239CC3B08AC4DC">>}, + {<<"erlware_commons">>, <<"FC23D8E304140B65A811F653A76B2FB10B0CE744608CAF86E9125CEB349C9442">>}, {<<"eunit_formatters">>, <<"6A9133943D36A465D804C1C5B6E6839030434B8879C5600D7DDB5B3BAD4CCB59">>}, {<<"getopt">>, <<"C73A9FA687B217F2FF79F68A3B637711BB1936E712B521D8CE466B29CBF7808A">>}, {<<"providers">>, <<"BBF730563914328EC2511D205E6477A94831DB7297DE313B3872A2B26C562EAB">>}, - {<<"relx">>, <<"A7ADA05319D52791FC63BAC8027F464156B52A0453BA5DD09A9386BABF06AF26">>}, + {<<"relx">>, <<"2132F0ABFA93DB3177E66768DB5A3D4141D4683BB4864B9DD4452EE7123DED07">>}, {<<"ssl_verify_fun">>, <<"6C49665D4326E26CD4A5B7BD54AA442B33DADFB7C5D59A0D0CD0BF5534BBFBD7">>}]} ]. diff --git a/src/rebar_prv_alias.erl b/src/rebar_prv_alias.erl index 2a03668..736417b 100644 --- a/src/rebar_prv_alias.erl +++ b/src/rebar_prv_alias.erl @@ -70,33 +70,56 @@ example(Alias) -> "rebar3 " ++ atom_to_list(Alias). desc(Cmds) -> - "Equivalent to running: rebar3 do " ++ - rebar_string:join(lists:map(fun({Cmd, Args}) -> - atom_to_list(Cmd) ++ " " ++ Args; - (Cmd) -> - atom_to_list(Cmd) - end, Cmds), ","). + "Equivalent to running: rebar3 do " + ++ rebar_string:join(lists:map(fun to_desc/1, Cmds), ","). + +to_desc({Cmd, Args}) -> + atom_to_list(Cmd) ++ " " ++ Args; +to_desc(Cmd) -> + atom_to_list(Cmd). module(Name) -> - {attribute,1,module,Name}. + {attribute, 1, module, Name}. exports() -> - {attribute,1,export,[{do,1}]}. + {attribute, 1, export, [{do, 1}]}. do_func(Cmds) -> - {function,1,do,1, - [{clause,1, - [{var,1,'State'}], + {function, 1, do, 1, + [{clause, 1, + [{var, 1, 'State'}], [], - [{call,1, - {remote,1,{atom,1,rebar_prv_do},{atom,1,do_tasks}}, - [to_args(Cmds),{var,1,'State'}]}]}]}. - - -to_args([]) -> - {nil,1}; -to_args([{Cmd, Args} | Rest]) -> - {cons,1,{tuple,1,[{string,1,atom_to_list(Cmd)},{string,1,Args}]}, to_args(Rest)}; -to_args([Cmd | Rest]) -> - {cons,1,{tuple,1,[{string,1,atom_to_list(Cmd)},{nil,1}]}, to_args(Rest)}. - + [{call, 1, + {remote, 1, {atom, 1, rebar_prv_do}, {atom, 1, do_tasks}}, + [make_args(Cmds), {var, 1, 'State'}]}]}]}. + +make_args(Cmds) -> + make_list( + lists:map(fun make_tuple/1, + lists:map(fun make_arg/1, Cmds))). + +make_arg({Cmd, Args}) -> + {make_string(Cmd), make_list([make_string(A) || A <- split_args(Args)])}; +make_arg(Cmd) -> + {make_string(Cmd), make_list([])}. + +make_tuple(Tuple) -> + {tuple, 1, tuple_to_list(Tuple)}. + +make_list(List) -> + lists:foldr( + fun(Elem, Acc) -> {cons, 1, Elem, Acc} end, + {nil, 1}, + List). + +make_string(Atom) when is_atom(Atom) -> + make_string(atom_to_list(Atom)); +make_string(String) when is_list(String) -> + {string, 1, String}. + +%% In case someone used the long option format, the option needs to get +%% separated from its value. +split_args(Args) -> + rebar_string:lexemes( + lists:map(fun($=) -> 32; (C) -> C end, Args), + " "). diff --git a/test/rebar_alias_SUITE.erl b/test/rebar_alias_SUITE.erl index f889ae4..2544aac 100644 --- a/test/rebar_alias_SUITE.erl +++ b/test/rebar_alias_SUITE.erl @@ -13,7 +13,7 @@ init_per_testcase(_, Config) -> end_per_testcase(_, _Config) -> ok. -all() -> [command, args, many, override_default, no_circular]. +all() -> [command, args, many, override_default, no_circular, release]. %% namespaces: unsupported, untested. command() -> @@ -111,3 +111,28 @@ no_circular(Config) -> {error, [$C,$o,$m,$m,$a,$n,$d,$ ,"test",$ ,$n,$o,$t,$ , $f,$o,$u,$n,$d]}), ok. + +release() -> + [{doc, "An alias for a release command"}]. +release(Config) -> + AppDir = ?config(apps, Config), + + Name = rebar_test_utils:create_random_name("alias_release_"), + Vsn = rebar_test_utils:create_random_vsn(), + rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), + RebarConfig = [{relx, + [{release, {skipped_release, Vsn}, []}, + {release, {the_release, Vsn}, [list_to_atom(Name)]}, + {lib_dirs, [AppDir]}]}, + {alias, + [{the_rel1, [clean, {release, "-n the_release"}]}, + {the_rel2, [clean, {release, "--relname=the_release"}]}]}], + rebar_test_utils:run_and_check( + Config, RebarConfig, + ["the_rel1"], + {ok, [{release, the_release, Vsn, false}]}), + rebar_test_utils:run_and_check( + Config, RebarConfig, + ["the_rel2"], + {ok, [{release, the_release, Vsn, false}]}), + ok. |