Bläddra i källkod

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.
pull/838/head
Fred Hebert 9 år sedan
förälder
incheckning
6a4b5428b3
1 ändrade filer med 23 tillägg och 10 borttagningar
  1. +23
    -10
      src/rebar3.erl

+ 23
- 10
src/rebar3.erl Visa fil

@ -64,7 +64,7 @@ main(Args) ->
%% Erlang-API entry point %% Erlang-API entry point
run(BaseState, Commands) -> run(BaseState, Commands) ->
start_and_load_apps(),
start_and_load_apps(api),
BaseState1 = rebar_state:set(BaseState, task, Commands), BaseState1 = rebar_state:set(BaseState, task, Commands),
BaseState2 = rebar_state:set(BaseState1, caller, api), BaseState2 = rebar_state:set(BaseState1, caller, api),
@ -78,7 +78,7 @@ run(BaseState, Commands) ->
%% ==================================================================== %% ====================================================================
run(RawArgs) -> run(RawArgs) ->
start_and_load_apps(),
start_and_load_apps(command_line),
BaseState = init_config(), BaseState = init_config(),
BaseState1 = rebar_state:set(BaseState, caller, command_line), 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\"`", []), ?INFO("When submitting a bug report, please include the output of `rebar3 report \"your command\"`", []),
erlang:halt(1). erlang:halt(1).
start_and_load_apps() ->
start_and_load_apps(Caller) ->
_ = application:load(rebar), _ = application:load(rebar),
%% Make sure crypto is running %% 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(),
inets:start(httpc, [{profile, rebar}]). 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) -> state_from_global_config(Config, GlobalConfigFile) ->
rebar_utils:set_httpc_options(), rebar_utils:set_httpc_options(),
GlobalConfigTerms = rebar_config:consult_file(GlobalConfigFile), GlobalConfigTerms = rebar_config:consult_file(GlobalConfigFile),

Laddar…
Avbryt
Spara