summaryrefslogtreecommitdiff
path: root/src/r3.erl
diff options
context:
space:
mode:
authorFred Hebert <mononcqc@ferd.ca>2017-04-24 19:43:44 -0400
committerFred Hebert <mononcqc@ferd.ca>2017-04-24 20:35:59 -0400
commit03425c788c0e1ac38a3172f6c13a42cd1ffa4b4a (patch)
tree9f54fdb69bf4c37e5a6888bab5a4d8f17e9267cd /src/r3.erl
parentd284b72c615bcccaea7d2c48b801a67962ccfe17 (diff)
Abuse error_handler to get free metacalls in r3
This uses the very risky '$handle_undefined_function'/2 export from the r3 and rebar_agent modules to allow meta-calls that can support plugins and all other rebar3 extensions. This is nasty but very tempting. Currently we only support: - r3:do(Command) - r3:do(Namespace, Command) There is currently no way to pass arguments to the function such that we can, for example, run cover analysis or tests on a subset of suites. With the new abuse of '$handle_undefined_function'/2, we can detect the unused commands (since they are not exported) and re-route them: - r3:Command() - r3:Command("--args=as a string") - r3:Command(Namespace, "--args=as a string") Of course, in doing so, we make it impossible to use the 'do' provider (as in 'rebar3 do ct -c, cover') since the 'do' function is already required for things to work. Since the previous function had very strict guards, we can, without conflict, add manual overrides that simulate the meta-calls fine. Sample run: https://gist.github.com/ferd/2c06d59c7083c146d25e4ee301de0073
Diffstat (limited to 'src/r3.erl')
-rw-r--r--src/r3.erl5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/r3.erl b/src/r3.erl
index d0d6c47..bbf9eea 100644
--- a/src/r3.erl
+++ b/src/r3.erl
@@ -2,6 +2,7 @@
%%% calls from a shell.
-module(r3).
-export([do/1, do/2]).
+-export(['$handle_undefined_function'/2]).
%% @doc alias for `rebar_agent:do/1'
-spec do(atom()) -> ok | {error, term()}.
@@ -10,3 +11,7 @@ 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).
+
+%% @private defer to rebar_agent
+'$handle_undefined_function'(Cmd, Args) ->
+ rebar_agent:'$handle_undefined_function'(Cmd, Args).