summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rebar_core.erl40
1 files changed, 39 insertions, 1 deletions
diff --git a/src/rebar_core.erl b/src/rebar_core.erl
index 8177c43..6a825d6 100644
--- a/src/rebar_core.erl
+++ b/src/rebar_core.erl
@@ -292,8 +292,12 @@ process_dir(Dir, ParentConfig, Command, DirSet) ->
%% caused it to change
ok = file:set_cwd(Dir),
+ %% Get the list of plug-in modules from rebar.config. These modules are
+ %% processed LAST and do not participate in preprocess.
+ {ok, PluginModules} = plugin_modules(Config),
+
%% Execute the current command on this directory
- execute(Command, Modules, Config, ModuleSetFile),
+ execute(Command, Modules ++ PluginModules, Config, ModuleSetFile),
%% Mark the current directory as processed
DirSet3 = sets:add_element(Dir, DirSet2),
@@ -317,6 +321,7 @@ process_dir(Dir, ParentConfig, Command, DirSet) ->
end.
+
%%
%% Given a list of directories and a set of previously processed directories,
%% process each one we haven't seen yet
@@ -443,3 +448,36 @@ acc_modules([], _Command, _Config, _File, Acc) ->
acc_modules([Module | Rest], Command, Config, File, Acc) ->
{ok, Dirs} = Module:Command(Config, File),
acc_modules(Rest, Command, Config, File, Acc ++ Dirs).
+
+%%
+%% Return a flat list of rebar plugin modules.
+%%
+plugin_modules(Config) ->
+ Modules = lists:flatten(rebar_config:get_all(Config, rebar_plugins)),
+ plugin_modules(Config, ulist(Modules)).
+
+ulist(L) ->
+ ulist(L, []).
+
+ulist([], Acc) ->
+ lists:reverse(Acc);
+ulist([H | T], Acc) ->
+ case lists:is_member(H, Acc) of
+ true ->
+ ulist(T, Acc);
+ false ->
+ ulist(T, [H | Acc])
+ end.
+
+plugin_modules(_Config, []) ->
+ {ok, []};
+plugin_modules(_Config, Modules) ->
+ FoundModules = [M || M <- Modules, code:which(M) =/= non_existing],
+ case (Modules =:= FoundModules) of
+ true ->
+ ok;
+ false ->
+ ?WARN("Missing plugins: ~p\n", [Modules -- FoundModules]),
+ ok
+ end,
+ {ok, FoundModules}.