summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Watson <watson.timothy@gmail.com>2011-05-23 12:46:03 +0100
committerTim Watson <watson.timothy@gmail.com>2011-05-23 12:46:03 +0100
commitc07b0954ebac6913dba82b3e81bca7f7a39d8293 (patch)
treeb663afe1773a0190318ea7185a6f6f8d119968a5
parent892dc48a860892b3eeb36e519287c26f09fff5b8 (diff)
Allow plugins to run before/after a rebar command.
This patch makes a small change in rebar_core that checks the list of valid plugins to see if any of them export a pre/post processing function for the current command. This logic is applied only to the plugins and allows plugin authors to hook into rebar's execution by using a naming convention that matches the one used for scripting hooks. Example: ```erlang -module(my_rebar_plugin). -export([pre_compile/2]). pre_compile(Config, AppFile) -> rebar_log:log(debug, "PRECOMPILE: ~p:~p~n", [AppFile, Config]), ok. ```
-rw-r--r--src/rebar_core.erl21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/rebar_core.erl b/src/rebar_core.erl
index f17ed0b..cb2c508 100644
--- a/src/rebar_core.erl
+++ b/src/rebar_core.erl
@@ -148,9 +148,17 @@ process_dir(Dir, ParentConfig, Command, DirSet) ->
%% in preprocess.
{ok, PluginModules} = plugin_modules(Config),
+ %% Execute any before_command plugins on this directory
+ execute_pre(Command, PluginModules,
+ Config, ModuleSetFile),
+
%% Execute the current command on this directory
execute(Command, Modules ++ PluginModules,
- Config, ModuleSetFile)
+ Config, ModuleSetFile),
+
+ %% Execute any after_command plugins on this directory
+ execute_post(Command, PluginModules,
+ Config, ModuleSetFile)
end,
%% Mark the current directory as processed
@@ -215,6 +223,17 @@ is_dir_type(rel_dir, Dir) ->
is_dir_type(_, _) ->
false.
+execute_pre(Command, Modules, Config, ModuleFile) ->
+ execute_plugin_hook("pre_", Command, Modules,
+ Config, ModuleFile).
+
+execute_post(Command, Modules, Config, ModuleFile) ->
+ execute_plugin_hook("post_", Command, Modules,
+ Config, ModuleFile).
+
+execute_plugin_hook(Hook, Command, Modules, Config, ModuleFile) ->
+ HookFunction = list_to_atom(Hook ++ atom_to_list(Command)),
+ execute(HookFunction, Modules, Config, ModuleFile).
%%
%% Execute a command across all applicable modules