From 6a4b5428b3fa67ba6b1fdb5dd6cc896128b331c0 Mon Sep 17 00:00:00 2001 From: Fred Hebert Date: Sat, 26 Sep 2015 03:59:49 +0000 Subject: 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. --- src/rebar3.erl | 33 +++++++++++++++++++++++---------- 1 file 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), -- cgit v1.1