Browse Source

Merge pull request #1091 from tsloughter/all_hooks

Run all hooks
pull/1092/head
Fred Hebert 9 years ago
parent
commit
a0b2c74356
5 changed files with 37 additions and 10 deletions
  1. +6
    -0
      src/rebar_hooks.erl
  2. +5
    -4
      src/rebar_prv_common_test.erl
  3. +3
    -3
      src/rebar_prv_eunit.erl
  4. +2
    -2
      src/rebar_relx.erl
  5. +21
    -1
      test/rebar_hooks_SUITE.erl

+ 6
- 0
src/rebar_hooks.erl View File

@ -2,6 +2,7 @@
-export([run_all_hooks/5
,run_all_hooks/6
,run_project_and_app_hooks/5
,format_error/1]).
-include("rebar.hrl").
@ -20,6 +21,11 @@ run_all_hooks(Dir, Type, Command, Providers, State) ->
run_provider_hooks(Dir, Type, Command, Providers, rebar_state:opts(State), State),
run_hooks(Dir, Type, Command, rebar_state:opts(State), State).
run_project_and_app_hooks(Dir, Type, Command, Providers, State) ->
ProjectApps = rebar_state:project_apps(State),
[rebar_hooks:run_all_hooks(Dir, Type, Command, Providers, AppInfo, State) || AppInfo <- ProjectApps],
run_all_hooks(Dir, Type, Command, Providers, State).
run_provider_hooks(Dir, Type, Command, Providers, Opts, State) ->
case rebar_opts:get(Opts, provider_hooks, []) of
[] ->

+ 5
- 4
src/rebar_prv_common_test.erl View File

@ -52,14 +52,16 @@ do(State, Tests) ->
%% Run ct provider prehooks
Providers = rebar_state:providers(State),
Cwd = rebar_dir:get_cwd(),
rebar_hooks:run_all_hooks(Cwd, pre, ?PROVIDER, Providers, State),
%% Run ct provider pre hooks for all project apps and top level project hooks
rebar_hooks:run_project_and_app_hooks(Cwd, pre, ?PROVIDER, Providers, State),
case Tests of
{ok, T} ->
case run_tests(State, T) of
ok ->
%% Run ct provider posthooks
rebar_hooks:run_all_hooks(Cwd, post, ?PROVIDER, Providers, State),
%% Run ct provider post hooks for all project apps and top level project hooks
rebar_hooks:run_project_and_app_hooks(Cwd, post, ?PROVIDER, Providers, State),
rebar_utils:cleanup_code_path(rebar_state:code_paths(State, default)),
{ok, State};
Error ->
@ -653,4 +655,3 @@ help(verbose) ->
"Verbose output";
help(_) ->
"".

+ 3
- 3
src/rebar_prv_eunit.erl View File

@ -56,14 +56,14 @@ do(State, Tests) ->
%% Run eunit provider prehooks
Providers = rebar_state:providers(State),
Cwd = rebar_dir:get_cwd(),
rebar_hooks:run_all_hooks(Cwd, pre, ?PROVIDER, Providers, State),
rebar_hooks:run_project_and_app_hooks(Cwd, pre, ?PROVIDER, Providers, State),
case validate_tests(State, Tests) of
{ok, T} ->
case run_tests(State, T) of
{ok, State1} ->
%% Run eunit provider posthooks
rebar_hooks:run_all_hooks(Cwd, post, ?PROVIDER, Providers, State1),
rebar_hooks:run_project_and_app_hooks(Cwd, post, ?PROVIDER, Providers, State1),
rebar_utils:cleanup_code_path(rebar_state:code_paths(State, default)),
{ok, State1};
Error ->
@ -190,7 +190,7 @@ dedupe_tests({AppMods, TestMods}) ->
%% in AppMods that will trigger it
F = fun(Mod) ->
M = filename:basename(Mod, ".erl"),
MatchesTest = fun(Dir) -> filename:basename(Dir, ".erl") ++ "_tests" == M end,
MatchesTest = fun(Dir) -> filename:basename(Dir, ".erl") ++ "_tests" == M end,
case lists:any(MatchesTest, AppMods) of
false -> {true, {module, list_to_atom(M)}};
true -> false

+ 2
- 2
src/rebar_relx.erl View File

@ -25,7 +25,7 @@ do(Module, Command, Provider, State) ->
AllOptions = string:join([Command | Options], " "),
Cwd = rebar_state:dir(State),
Providers = rebar_state:providers(State),
rebar_hooks:run_all_hooks(Cwd, pre, Provider, Providers, State),
rebar_hooks:run_project_and_app_hooks(Cwd, pre, Provider, Providers, State),
try
case rebar_state:get(State, relx, []) of
[] ->
@ -37,7 +37,7 @@ do(Module, Command, Provider, State) ->
,{config, Config1}
,{caller, api} | output_dir(OutputDir, Options)], AllOptions)
end,
rebar_hooks:run_all_hooks(Cwd, post, Provider, Providers, State),
rebar_hooks:run_project_and_app_hooks(Cwd, post, Provider, Providers, State),
{ok, State}
catch
throw:T ->

+ 21
- 1
test/rebar_hooks_SUITE.erl View File

@ -10,6 +10,7 @@
escriptize_artifacts/1,
run_hooks_once/1,
run_hooks_for_plugins/1,
eunit_app_hooks/1,
deps_hook_namespace/1]).
-include_lib("common_test/include/ct.hrl").
@ -33,7 +34,7 @@ end_per_testcase(_, _Config) ->
all() ->
[build_and_clean_app, run_hooks_once, escriptize_artifacts,
run_hooks_for_plugins, deps_hook_namespace].
run_hooks_for_plugins, deps_hook_namespace, eunit_app_hooks].
%% Test post provider hook cleans compiled project app, leaving it invalid
build_and_clean_app(Config) ->
@ -119,6 +120,25 @@ deps_hook_namespace(Config) ->
{ok, [{dep, "some_dep"}]}
).
%% Checks that a hook that is defined on an app (not a top level hook of a project with subapps) is run
eunit_app_hooks(Config) ->
AppDir = ?config(apps, Config),
Name = rebar_test_utils:create_random_name("app1_"),
Vsn = rebar_test_utils:create_random_vsn(),
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
RConfFile =
rebar_test_utils:create_config(AppDir,
[
{escript_name, list_to_atom(Name)}
,{provider_hooks, [{post, [{eunit, escriptize}]}]}
]),
{ok, RConf} = file:consult(RConfFile),
rebar_test_utils:run_and_check(Config, RConf,
["eunit"], {ok, [{app, Name, valid}
,{file, filename:join([AppDir, "_build/test/bin", Name])}]}).
run_hooks_for_plugins(Config) ->
AppDir = ?config(apps, Config),

Loading…
Cancel
Save