diff options
author | Fred Hebert <mononcqc@ferd.ca> | 2015-09-26 03:59:49 +0000 |
---|---|---|
committer | Fred Hebert <mononcqc@ferd.ca> | 2015-09-26 03:59:49 +0000 |
commit | 6a4b5428b3fa67ba6b1fdb5dd6cc896128b331c0 (patch) | |
tree | 37dbe333db2fbbff64b043c8acaeaa6d07754546 | |
parent | 4d45f27955eb0b05d4a5cd389e33edcf99831709 (diff) |
Properly warn on missing rebar3 deps
The current code could not cope with missing dependencies, as they would
prevent the rebar3 app from loading or properly building its config,
which prevented the log state from being carried along with default
values. This in turn would turn in an escript-level error that
obfuscated the true source of failure.
This patch bypasses the whole state setup and logging macros and logs an
error message manually when a dependency such as crypto or SSL is
missing from the Erlang install.
-rw-r--r-- | src/rebar3.erl | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/src/rebar3.erl b/src/rebar3.erl index aae9ec0..9aad909 100644 --- a/src/rebar3.erl +++ b/src/rebar3.erl @@ -64,7 +64,7 @@ main(Args) -> %% Erlang-API entry point run(BaseState, Commands) -> - start_and_load_apps(), + start_and_load_apps(api), BaseState1 = rebar_state:set(BaseState, task, Commands), BaseState2 = rebar_state:set(BaseState1, caller, api), @@ -78,7 +78,7 @@ run(BaseState, Commands) -> %% ==================================================================== run(RawArgs) -> - start_and_load_apps(), + start_and_load_apps(command_line), BaseState = init_config(), BaseState1 = rebar_state:set(BaseState, caller, command_line), @@ -272,19 +272,32 @@ handle_error(Error) -> ?INFO("When submitting a bug report, please include the output of `rebar3 report \"your command\"`", []), erlang:halt(1). -start_and_load_apps() -> +start_and_load_apps(Caller) -> _ = application:load(rebar), %% Make sure crypto is running - case crypto:start() of - ok -> ok; - {error,{already_started,crypto}} -> ok - end, - application:start(asn1), - application:start(public_key), - application:start(ssl), + ensure_running(crypto, Caller), + ensure_running(asn1, Caller), + ensure_running(public_key, Caller), + ensure_running(ssl, Caller), inets:start(), inets:start(httpc, [{profile, rebar}]). +ensure_running(App, Caller) -> + case application:start(App) of + ok -> ok; + {error, {already_started, App}} -> ok; + {error, Reason} -> + %% These errors keep rebar3's own configuration to be loaded, + %% which disables the log level and causes a failure without + %% showing the error message. Bypass this entirely by overriding + %% the default value (which allows logging to take place) + %% and shut things down manually. + Log = ec_cmd_log:new(warn, Caller), + ec_cmd_log:error(Log, "Rebar dependency ~p could not be loaded " + "for reason ~p~n", [App, Reason]), + throw(rebar_abort) + end. + state_from_global_config(Config, GlobalConfigFile) -> rebar_utils:set_httpc_options(), GlobalConfigTerms = rebar_config:consult_file(GlobalConfigFile), |