|
|
@ -47,12 +47,12 @@ |
|
|
|
%% =================================================================== |
|
|
|
|
|
|
|
run(["help"]) -> |
|
|
|
help(), |
|
|
|
rebar:help(), |
|
|
|
ok; |
|
|
|
run(["version"]) -> |
|
|
|
%% Load application spec and display vsn and build time info |
|
|
|
ok = application:load(rebar), |
|
|
|
version(), |
|
|
|
rebar:version(), |
|
|
|
ok; |
|
|
|
run(RawArgs) -> |
|
|
|
%% Pre-load the rebar app so that we get default configuration |
|
|
@ -60,7 +60,7 @@ run(RawArgs) -> |
|
|
|
|
|
|
|
%% Parse out command line arguments -- what's left is a list of commands to |
|
|
|
%% run |
|
|
|
Commands = parse_args(RawArgs), |
|
|
|
Commands = rebar:parse_args(RawArgs), |
|
|
|
|
|
|
|
%% Make sure crypto is running |
|
|
|
ok = crypto:start(), |
|
|
@ -110,175 +110,6 @@ skip_dirs() -> |
|
|
|
%% Internal functions |
|
|
|
%% =================================================================== |
|
|
|
|
|
|
|
%% |
|
|
|
%% Parse command line arguments using getopt and also filtering out any |
|
|
|
%% key=value pairs. What's left is the list of commands to run |
|
|
|
%% |
|
|
|
parse_args(Args) -> |
|
|
|
%% Parse getopt options |
|
|
|
OptSpecList = option_spec_list(), |
|
|
|
case getopt:parse(OptSpecList, Args) of |
|
|
|
{ok, {Options, NonOptArgs}} -> |
|
|
|
%% Check options and maybe halt execution |
|
|
|
ok = show_info_maybe_halt(Options, NonOptArgs), |
|
|
|
|
|
|
|
%% Set global variables based on getopt options |
|
|
|
set_global_flag(Options, verbose), |
|
|
|
set_global_flag(Options, force), |
|
|
|
DefJobs = rebar_config:get_jobs(), |
|
|
|
case proplists:get_value(jobs, Options, DefJobs) of |
|
|
|
DefJobs -> |
|
|
|
ok; |
|
|
|
Jobs -> |
|
|
|
rebar_config:set_global(jobs, Jobs) |
|
|
|
end, |
|
|
|
|
|
|
|
%% Set the rebar config to use |
|
|
|
case proplists:get_value(config, Options) of |
|
|
|
undefined -> ok; |
|
|
|
Conf -> rebar_config:set_global(config, Conf) |
|
|
|
end, |
|
|
|
|
|
|
|
%% Filter all the flags (i.e. strings of form key=value) from the |
|
|
|
%% command line arguments. What's left will be the commands to run. |
|
|
|
filter_flags(NonOptArgs, []); |
|
|
|
|
|
|
|
{error, {Reason, Data}} -> |
|
|
|
?ERROR("Error: ~s ~p~n~n", [Reason, Data]), |
|
|
|
help(), |
|
|
|
halt(1) |
|
|
|
end. |
|
|
|
|
|
|
|
%% |
|
|
|
%% set global flag based on getopt option boolean value |
|
|
|
%% |
|
|
|
set_global_flag(Options, Flag) -> |
|
|
|
Value = case proplists:get_bool(Flag, Options) of |
|
|
|
true -> |
|
|
|
"1"; |
|
|
|
false -> |
|
|
|
"0" |
|
|
|
end, |
|
|
|
rebar_config:set_global(Flag, Value). |
|
|
|
|
|
|
|
%% |
|
|
|
%% show info and maybe halt execution |
|
|
|
%% |
|
|
|
show_info_maybe_halt(Opts, NonOptArgs) -> |
|
|
|
false = show_info_maybe_halt(help, Opts, fun help/0), |
|
|
|
false = show_info_maybe_halt(commands, Opts, fun commands/0), |
|
|
|
false = show_info_maybe_halt(version, Opts, fun version/0), |
|
|
|
case NonOptArgs of |
|
|
|
[] -> |
|
|
|
?CONSOLE("No command to run specified!~n",[]), |
|
|
|
help(), |
|
|
|
halt(1); |
|
|
|
_ -> |
|
|
|
ok |
|
|
|
end. |
|
|
|
|
|
|
|
show_info_maybe_halt(O, Opts, F) -> |
|
|
|
case proplists:get_bool(O, Opts) of |
|
|
|
true -> |
|
|
|
F(), |
|
|
|
halt(0); |
|
|
|
false -> |
|
|
|
false |
|
|
|
end. |
|
|
|
|
|
|
|
%% |
|
|
|
%% print help/usage string |
|
|
|
%% |
|
|
|
help() -> |
|
|
|
OptSpecList = option_spec_list(), |
|
|
|
getopt:usage(OptSpecList, "rebar", |
|
|
|
"[var=value,...] <command,...>", |
|
|
|
[{"var=value", "rebar global variables (e.g. force=1)"}, |
|
|
|
{"command", "Command to run (e.g. compile)"}]). |
|
|
|
|
|
|
|
%% |
|
|
|
%% print known commands |
|
|
|
%% |
|
|
|
commands() -> |
|
|
|
S = <<" |
|
|
|
dialyze Analyze with Dialyzer |
|
|
|
build-plt Build Dialyzer PLT |
|
|
|
check-plt Check Dialyzer PLT |
|
|
|
|
|
|
|
clean Clean |
|
|
|
compile Compile sources |
|
|
|
|
|
|
|
create template= [var=foo,...] Create skel based on template and vars |
|
|
|
create-app [appid=myapp] Create simple app skel |
|
|
|
create-node [nodeid=mynode] Create simple node skel |
|
|
|
list-templates List available templates |
|
|
|
|
|
|
|
doc Generate Erlang program documentation |
|
|
|
|
|
|
|
check-deps Display to be fetched dependencies |
|
|
|
get-deps Fetch dependencies |
|
|
|
update-deps Update fetched dependencies |
|
|
|
delete-deps Delete fetched dependencies |
|
|
|
|
|
|
|
generate [dump_spec=0/1] Build release with reltool |
|
|
|
|
|
|
|
eunit [suite=foo] Run eunit [test/foo_tests.erl] tests |
|
|
|
ct [suite=] [case=] Run common_test suites in ./test |
|
|
|
|
|
|
|
xref Run cross reference analysis |
|
|
|
|
|
|
|
help Show the program options |
|
|
|
version Show version information |
|
|
|
">>, |
|
|
|
io:put_chars(S), |
|
|
|
%% workaround to delay exit until all output is written |
|
|
|
timer:sleep(300). |
|
|
|
|
|
|
|
%% |
|
|
|
%% show version information and halt |
|
|
|
%% |
|
|
|
version() -> |
|
|
|
{ok, Vsn} = application:get_key(rebar, vsn), |
|
|
|
?CONSOLE("rebar version: ~s date: ~s vcs: ~s\n", [Vsn, ?BUILD_TIME, ?VCS_INFO]). |
|
|
|
|
|
|
|
%% |
|
|
|
%% options accepted via getopt |
|
|
|
%% |
|
|
|
option_spec_list() -> |
|
|
|
Jobs = rebar_config:get_jobs(), |
|
|
|
JobsHelp = io_lib:format( |
|
|
|
"Number of concurrent workers a command may use. Default: ~B", |
|
|
|
[Jobs]), |
|
|
|
[ |
|
|
|
%% {Name, ShortOpt, LongOpt, ArgSpec, HelpMsg} |
|
|
|
{help, $h, "help", undefined, "Show the program options"}, |
|
|
|
{commands, $c, "commands", undefined, "Show available commands"}, |
|
|
|
{verbose, $v, "verbose", undefined, "Be verbose about what gets done"}, |
|
|
|
{version, $V, "version", undefined, "Show version information"}, |
|
|
|
{force, $f, "force", undefined, "Force"}, |
|
|
|
{jobs, $j, "jobs", integer, JobsHelp}, |
|
|
|
{config, $C, "config", string, "Rebar config file to use"} |
|
|
|
]. |
|
|
|
|
|
|
|
%% |
|
|
|
%% Seperate all commands (single-words) from flags (key=value) and store |
|
|
|
%% values into the rebar_config global storage. |
|
|
|
%% |
|
|
|
filter_flags([], Commands) -> |
|
|
|
lists:reverse(Commands); |
|
|
|
filter_flags([Item | Rest], Commands) -> |
|
|
|
case string:tokens(Item, "=") of |
|
|
|
[Command] -> |
|
|
|
filter_flags(Rest, [Command | Commands]); |
|
|
|
[KeyStr, Value] -> |
|
|
|
Key = list_to_atom(KeyStr), |
|
|
|
rebar_config:set_global(Key, Value), |
|
|
|
filter_flags(Rest, Commands); |
|
|
|
Other -> |
|
|
|
?CONSOLE("Ignoring command line argument: ~p\n", [Other]), |
|
|
|
filter_flags(Rest, Commands) |
|
|
|
end. |
|
|
|
|
|
|
|
process_commands([]) -> |
|
|
|
case erlang:get(operations) of |
|
|
|
0 -> |
|
|
|