diff options
Diffstat (limited to 'src/rebar_core.erl')
-rw-r--r-- | src/rebar_core.erl | 80 |
1 files changed, 49 insertions, 31 deletions
diff --git a/src/rebar_core.erl b/src/rebar_core.erl index 484b446..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 - ?FAIL; + 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). @@ -104,10 +120,12 @@ process_dir(Dir, ParentConfig, Command, DirSet) -> true -> AbsDir = filename:absname(Dir), - case processing_base_dir(Dir) of - false -> - ?CONSOLE("==> Entering directory `~s'\n", [AbsDir]); + ShouldPrintDir = not (is_skip_dir(Dir) orelse processing_base_dir(Dir)), + + case ShouldPrintDir of true -> + ?CONSOLE("==> Entering directory `~s'\n", [AbsDir]); + _ -> ok end, @@ -128,10 +146,10 @@ process_dir(Dir, ParentConfig, Command, DirSet) -> Res = maybe_process_dir(ModuleSet, Config, CurrentCodePath, Dir, Command, DirSet), - case processing_base_dir(Dir) of - false -> - ?CONSOLE("==> Leaving directory `~s'\n", [AbsDir]); + case ShouldPrintDir of true -> + ?CONSOLE("==> Leaving directory `~s'\n", [AbsDir]); + false -> ok end, @@ -360,7 +378,7 @@ execute(Command, Modules, Config, ModuleFile, Env) -> apply_hooks(post_hooks, Config, Command, Env), ok; {error, failed} -> - ?FAIL; + ?ABORT; {Module, {error, _} = Other} -> ?ABORT("~p failed while processing ~s in module ~s: ~s\n", [Command, Dir, Module, |