summaryrefslogtreecommitdiff
path: root/src/r3.erl
blob: 60a585dc185f0b140ea2996aca45d0425ff85449 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
%%% @doc external alias for `rebar_agent' for more convenient
%%% calls from a shell.
-module(r3).
-export([do/1, do/2, async_do/1, async_do/2, break/0, resume/0]).
-export(['$handle_undefined_function'/2]).
-include("rebar.hrl").

%% @doc alias for `rebar_agent:do/1'
-spec do(atom()) -> ok | {error, term()}.
do(Command) -> rebar_agent:do(Command).

%% @doc alias for `rebar_agent:do/2'
-spec do(atom(), atom()) -> ok | {error, term()}.
do(Namespace, Command) -> rebar_agent:do(Namespace, Command).

%% @doc alias for `rebar_agent:async_do/1'
-spec async_do(atom()) -> ok | {error, term()}.
async_do(Command) -> rebar_agent:async_do(Command).

%% @doc alias for `rebar_agent:async_do/2'
-spec async_do(atom(), atom()) -> ok | {error, term()}.
async_do(Namespace, Command) -> rebar_agent:async_do(Namespace, Command).

break() ->
    case whereis(rebar_agent) of % is the shell running
        undefined ->
            ok;
        Pid ->
            {dictionary, Dict} = process_info(Pid, dictionary),
            case lists:keyfind(cmd_type, 1, Dict) of
                {cmd_type, async} ->
                    Self = self(),
                    Ref = make_ref(),
                    spawn_link(fun() ->
                            register(r3_breakpoint_handler, self()),
                            receive
                                resume ->
                                    Self ! Ref
                            end
                    end),
                    io:format(user, "~n=== BREAK ===~n", []),
                    receive
                        Ref -> ok
                    end;
                _ ->
                    ?DEBUG("ignoring breakpoint since command is not run "
                           "in async mode", []),
                    ok
            end
    end.

resume() ->
    r3_breakpoint_handler ! resume,
    ok.

%% @private defer to rebar_agent
'$handle_undefined_function'(Cmd, Args) ->
    rebar_agent:'$handle_undefined_function'(Cmd, Args).