summaryrefslogtreecommitdiff
path: root/src/rebar_prv_shell.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/rebar_prv_shell.erl')
-rw-r--r--src/rebar_prv_shell.erl60
1 files changed, 35 insertions, 25 deletions
diff --git a/src/rebar_prv_shell.erl b/src/rebar_prv_shell.erl
index ea759fc..0ede495 100644
--- a/src/rebar_prv_shell.erl
+++ b/src/rebar_prv_shell.erl
@@ -64,6 +64,8 @@ init(State) ->
"Gives a long name to the node."},
{sname, undefined, "sname", atom,
"Gives a short name to the node."},
+ {setcookie, undefined, "setcookie", atom,
+ "Sets the cookie if the node is distributed."},
{script_file, undefined, "script", string,
"Path to an escript file to run before "
"starting the project apps. Defaults to "
@@ -131,11 +133,25 @@ kill_old_user() ->
%% fully die
[P] = [P || P <- element(2,process_info(whereis(user), links)), is_port(P)],
user ! {'EXIT', P, normal}, % pretend the port died, then the port can die!
+ exit(P, kill),
+ wait_for_port_death(1000, P),
OldUser.
+wait_for_port_death(N, _) when N < 0 ->
+ %% This risks displaying a warning!
+ whatever;
+wait_for_port_death(N, P) ->
+ case erlang:port_info(P) of
+ undefined ->
+ ok;
+ _ ->
+ timer:sleep(10),
+ wait_for_port_death(N-10, P)
+ end.
+
setup_new_shell() ->
- %% terminate the current user supervision structure
- ok = supervisor:terminate_child(kernel_sup, user),
+ %% terminate the current user supervision structure, if any
+ _ = supervisor:terminate_child(kernel_sup, user),
%% start a new shell (this also starts a new user under the correct group)
_ = user_drv:start(),
%% wait until user_drv and user have been registered (max 3 seconds)
@@ -176,7 +192,9 @@ rewrite_leaders(OldUser, NewUser) ->
%% disable the simple error_logger (which may have been added multiple
%% times). removes at most the error_logger added by init and the
%% error_logger added by the tty handler
- remove_error_handler(3)
+ remove_error_handler(3),
+ %% reset the tty handler once more for remote shells
+ error_logger:swap_handler(tty)
catch
E:R -> % may fail with custom loggers
?DEBUG("Logger changes failed for ~p:~p (~p)", [E,R,erlang:get_stacktrace()]),
@@ -253,23 +271,8 @@ simulate_proc_lib() ->
put('$initial_call', {rebar_agent, init, 1}).
setup_name(State) ->
- {Opts, _} = rebar_state:command_parsed_args(State),
- case {proplists:get_value(name, Opts), proplists:get_value(sname, Opts)} of
- {undefined, undefined} ->
- ok;
- {Name, undefined} ->
- check_epmd(net_kernel:start([Name, longnames]));
- {undefined, SName} ->
- check_epmd(net_kernel:start([SName, shortnames]));
- {_, _} ->
- ?ABORT("Cannot have both short and long node names defined", [])
- end.
-
-check_epmd({error,{{shutdown, {_,net_kernel,{'EXIT',nodistribution}}},_}}) ->
- ?ERROR("Erlang Distribution failed, falling back to nonode@nohost. "
- "Verify that epmd is running and try again.",[]);
-check_epmd(_) ->
- ok.
+ {Long, Short, Opts} = rebar_dist_utils:find_options(State),
+ rebar_dist_utils:either(Long, Short, Opts).
find_apps_to_boot(State) ->
%% Try the shell_apps option
@@ -327,7 +330,8 @@ reread_config(State) ->
ConfigList ->
try
[application:set_env(Application, Key, Val)
- || {Application, Items} <- ConfigList,
+ || Config <- ConfigList,
+ {Application, Items} <- Config,
{Key, Val} <- Items]
catch _:_ ->
?ERROR("The configuration file submitted could not be read "
@@ -390,7 +394,7 @@ add_test_paths(State) ->
ok.
% First try the --config flag, then try the relx sys_config
--spec find_config(rebar_state:t()) -> [tuple()] | no_config.
+-spec find_config(rebar_state:t()) -> [[tuple()]] | no_config.
find_config(State) ->
case first_value([fun find_config_option/1,
fun find_config_rebar/1,
@@ -438,11 +442,17 @@ find_config_relx(State) ->
debug_get_value(sys_config, rebar_state:get(State, relx, []), no_value,
"Found config from relx.").
--spec consult_config(rebar_state:t(), string()) -> [tuple()].
+-spec consult_config(rebar_state:t(), string()) -> [[tuple()]].
consult_config(State, Filename) ->
Fullpath = filename:join(rebar_dir:root_dir(State), Filename),
?DEBUG("Loading configuration from ~p", [Fullpath]),
- case rebar_file_utils:try_consult(Fullpath) of
+ Config = case rebar_file_utils:try_consult(Fullpath) of
[T] -> T;
[] -> []
- end.
+ end,
+ SubConfigs = [consult_config(State, Entry ++ ".config") ||
+ Entry <- Config, is_list(Entry)
+ ],
+
+ [Config | lists:merge(SubConfigs)].
+