Skip to content
Permalink
Browse files
Merge pull request #280 from talentdeficit/bettershell
improve output when using `rebar shell`
  • Loading branch information
ferd committed May 27, 2014
2 parents 755c602 + 89cd249 commit 763f5dc9ef9f418bdc146c17dac7ac4d611f0768
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 21 deletions.
1 THANKS
@@ -123,3 +123,4 @@ Dave Thomas
Evgeniy Khramtsov
YeJun Su
Yuki Ito
alisdair sullivan
@@ -409,6 +409,9 @@ qc Test QuickCheck properties
xref Run cross reference analysis
shell Start a shell similar to
'erl -pa ebin -pa deps/*/ebin'
help Show the program options
version Show version information
">>,
@@ -30,27 +30,40 @@

-include("rebar.hrl").

-export([shell/2]).
-export([shell/2, info/2]).

%% NOTE:
%% this is an attempt to replicate `erl -pa ./ebin -pa deps/*/ebin`. it is
%% mostly successful but does stop and then restart the user io system to get
%% around issues with rebar being an escript and starting in `noshell` mode.
%% it also lacks the ctrl-c interrupt handler that `erl` features. ctrl-c will
%% immediately kill the script. ctrl-g, however, works fine

shell(_Config, _AppFile) ->
?CONSOLE("NOTICE: Using experimental 'shell' command~n", []),
%% backwards way to say we only want this executed
%% for the "top level" directory
case is_deps_dir(rebar_utils:get_cwd()) of
false ->
true = code:add_pathz(rebar_utils:ebin_dir()),
user_drv:start(),
%% this call never returns (until user quits shell)
shell:server(false, false);
true ->
ok
end,
ok.
true = code:add_pathz(rebar_utils:ebin_dir()),
%% terminate the current user
ok = supervisor:terminate_child(kernel_sup, user),
%% start a new shell (this also starts a new user under the correct group)
user_drv:start(),
%% enable error_logger's tty output
ok = error_logger:swap_handler(tty),
%% 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
ok = remove_error_handler(3),
%% this call never returns (until user quits shell)
timer:sleep(infinity).

info(help, shell) ->
?CONSOLE(
"Start a shell with project and deps preloaded similar to~n"
"'erl -pa ebin -pa deps/*/ebin'.~n",
[]).

is_deps_dir(Dir) ->
case lists:reverse(filename:split(Dir)) of
[_, "deps" | _] ->
true;
_V ->
false
end.
remove_error_handler(0) ->
?WARN("Unable to remove simple error_logger handler~n", []);
remove_error_handler(N) ->
case gen_event:delete_handler(error_logger, error_logger, []) of
{error, module_not_found} -> ok;
{error_logger, _} -> remove_error_handler(N-1)
end.

0 comments on commit 763f5dc

Please sign in to comment.