diff options
-rw-r--r-- | src/rebar.erl | 8 | ||||
-rw-r--r-- | src/rebar_core.erl | 62 |
2 files changed, 45 insertions, 25 deletions
diff --git a/src/rebar.erl b/src/rebar.erl index f2ddeed..e11df3a 100644 --- a/src/rebar.erl +++ b/src/rebar.erl @@ -53,7 +53,7 @@ main(Args) -> case catch(run(Args)) of ok -> ok; - {error, failed} -> + rebar_abort -> rebar_utils:delayed_halt(1); Error -> %% Nothing should percolate up from rebar_core; @@ -162,6 +162,9 @@ parse_args(Args) -> rebar_config:set_global(enable_profiling, proplists:get_bool(profile, Options)), + %% Setup flag to keep running after a single command fails + rebar_config:set_global(keep_going, proplists:get_bool(keep_going, Options)), + %% Set global variables based on getopt options set_log_level(Options), set_global_flag(Options, force), @@ -304,7 +307,8 @@ option_spec_list() -> {defines, $D, undefined, string, "Define compiler macro"}, {jobs, $j, "jobs", integer, JobsHelp}, {config, $C, "config", string, "Rebar config file to use"}, - {profile, $p, "profile", undefined, "Profile this run of rebar"} + {profile, $p, "profile", undefined, "Profile this run of rebar"}, + {keep_going, $k, "keep-going", undefined, "Keep running after a command fails"} ]. %% diff --git a/src/rebar_core.erl b/src/rebar_core.erl index a53e4f9..14ff754 100644 --- a/src/rebar_core.erl +++ b/src/rebar_core.erl @@ -64,35 +64,51 @@ skip_dirs() -> %% =================================================================== process_commands([], _ParentConfig) -> - case erlang:get(operations) of - 0 -> - %% none of the commands had an effect + AbortTrapped = rebar_config:get_global(abort_trapped, false), + case {erlang:get(operations), AbortTrapped} of + {0, _} -> + %% None of the commands had any effect + ?ABORT; + {_, true} -> + %% An abort was previously trapped ?ABORT; _ -> ok end; process_commands([Command | Rest], ParentConfig) -> - %% Reset skip dirs - lists:foreach(fun (D) -> erlang:erase({skip_dir, D}) end, skip_dirs()), - Operations = erlang:get(operations), - - %% Convert the code path so that all the entries are absolute paths. - %% If not, code:set_path() may choke on invalid relative paths when trying - %% to restore the code path from inside a subdirectory. - true = rebar_utils:expand_code_path(), - _ = process_dir(rebar_utils:get_cwd(), ParentConfig, - Command, sets:new()), - case erlang:get(operations) of - Operations -> - %% This command didn't do anything - ?CONSOLE("Command '~p' not understood or not applicable~n", - [Command]); - _ -> - ok + try + %% Reset skip dirs + lists:foreach(fun (D) -> erlang:erase({skip_dir, D}) end, skip_dirs()), + Operations = erlang:get(operations), + + %% Convert the code path so that all the entries are absolute paths. + %% If not, code:set_path() may choke on invalid relative paths when trying + %% to restore the code path from inside a subdirectory. + true = rebar_utils:expand_code_path(), + _ = process_dir(rebar_utils:get_cwd(), ParentConfig, + Command, sets:new()), + case erlang:get(operations) of + Operations -> + %% This command didn't do anything + ?CONSOLE("Command '~p' not understood or not applicable~n", + [Command]); + _ -> + ok + end, + %% Wipe out vsn cache to avoid invalid hits when + %% dependencies are updated + ets:delete_all_objects(rebar_vsn_cache) + catch + throw:rebar_abort -> + case rebar_config:get_global(keep_going, false) of + false -> + ?ABORT; + true -> + ?WARN("Continuing on after abort: ~p\n", [Rest]), + rebar_config:set_global(abort_trapped, true), + ok + end end, - %% Wipe out vsn cache to avoid invalid hits when - %% dependencies are updated - ets:delete_all_objects(rebar_vsn_cache), process_commands(Rest, ParentConfig). |