summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFred Hebert <mononcqc@ferd.ca>2015-09-26 03:59:49 +0000
committerFred Hebert <mononcqc@ferd.ca>2015-09-26 03:59:49 +0000
commit6a4b5428b3fa67ba6b1fdb5dd6cc896128b331c0 (patch)
tree37dbe333db2fbbff64b043c8acaeaa6d07754546
parent4d45f27955eb0b05d4a5cd389e33edcf99831709 (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.erl33
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),