summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFred Hebert <mononcqc@ferd.ca>2015-02-02 19:31:53 -0500
committerFred Hebert <mononcqc@ferd.ca>2015-02-02 19:31:53 -0500
commitd2cfe6a073d4d5d3092143c3925dacaab76ed472 (patch)
tree7d09e4c1c90506717fc210ddc01fe6e7c05f464d
parent89d3ef6e0d2225ea195b6ef1207c4c438792b2d1 (diff)
parentc8d0aa46c40832fcc5c0ae6d8ea2c8fd67c53690 (diff)
Merge pull request #115 from tsloughter/provider_hooks
support for provider_hooks in config
-rw-r--r--rebar.config4
-rw-r--r--src/rebar_app_discover.erl10
-rw-r--r--src/rebar_app_info.erl8
-rw-r--r--src/rebar_core.erl23
-rw-r--r--src/rebar_prv_erlydtl_compiler.erl1
-rw-r--r--src/rebar_state.erl56
-rw-r--r--test/rebar_hooks_SUITE.erl38
-rw-r--r--test/rebar_test_utils.erl20
8 files changed, 119 insertions, 41 deletions
diff --git a/rebar.config b/rebar.config
index 9df8d71..649de05 100644
--- a/rebar.config
+++ b/rebar.config
@@ -24,10 +24,10 @@
{branch, "master"}}},
{providers, "",
{git, "https://github.com/tsloughter/providers.git",
- {branch, "profiles"}}},
+ {branch, "hooks"}}},
{erlydtl, ".*",
{git, "https://github.com/erlydtl/erlydtl.git",
- {tag, "0.9.4"}}},
+ {tag, "0.10.0"}}},
{relx, "",
{git, "https://github.com/erlware/relx.git",
{branch, "master"}}},
diff --git a/src/rebar_app_discover.erl b/src/rebar_app_discover.erl
index 4d89c0d..21dbe1b 100644
--- a/src/rebar_app_discover.erl
+++ b/src/rebar_app_discover.erl
@@ -88,15 +88,15 @@ find_app(AppDir, Validate) ->
case validate_application_info(AppInfo2) of
true ->
{true, AppInfo2};
- false ->
+ _ ->
false
end;
invalid ->
case validate_application_info(AppInfo2) of
- false ->
- {true, AppInfo2};
true ->
- false
+ false;
+ _ ->
+ {true, AppInfo2}
end;
all ->
{true, AppInfo2}
@@ -177,7 +177,7 @@ has_all_beams(EbinDir, [Module | ModuleList]) ->
true ->
has_all_beams(EbinDir, ModuleList);
false ->
- throw(?PRV_ERROR({missing_module, Module}))
+ ?PRV_ERROR({missing_module, Module})
end;
has_all_beams(_, []) ->
true.
diff --git a/src/rebar_app_info.erl b/src/rebar_app_info.erl
index 23d118f..dca5aa8 100644
--- a/src/rebar_app_info.erl
+++ b/src/rebar_app_info.erl
@@ -224,10 +224,10 @@ state(#app_info_t{state=State}) ->
-spec valid(t()) -> boolean().
valid(AppInfo=#app_info_t{valid=undefined}) ->
- try
- rebar_app_discover:validate_application_info(AppInfo)
- catch
- _:_ ->
+ case rebar_app_discover:validate_application_info(AppInfo) of
+ true ->
+ true;
+ _ ->
false
end;
valid(#app_info_t{valid=Valid}) ->
diff --git a/src/rebar_core.erl b/src/rebar_core.erl
index 9d9262c..4497825 100644
--- a/src/rebar_core.erl
+++ b/src/rebar_core.erl
@@ -37,17 +37,18 @@ process_command(State, Command) ->
Providers = rebar_state:providers(State),
Namespace = rebar_state:namespace(State),
{TargetProviders, CommandProvider} =
- case Namespace of
- undefined ->
- %% undefined namespace means 'default', but on the first run;
- %% it is used as an implicit counter for the first vs. subsequent
- %% runs.
- {providers:get_target_providers(Command, Providers, default),
- providers:get_provider(Command, Providers, default)};
- _ ->
- {providers:get_target_providers(Command, Providers, Namespace),
- providers:get_provider(Command, Providers, Namespace)}
- end,
+ case Namespace of
+ undefined ->
+ %% undefined namespace means 'default', but on the first run;
+ %% it is used as an implicit counter for the first vs. subsequent
+ %% runs.
+ {providers:get_target_providers(Command, Providers, default),
+ providers:get_provider(Command, Providers, default)};
+ _ ->
+ {providers:get_target_providers(Command, Providers, Namespace),
+ providers:get_provider(Command, Providers, Namespace)}
+ end,
+
case CommandProvider of
not_found ->
case Namespace of
diff --git a/src/rebar_prv_erlydtl_compiler.erl b/src/rebar_prv_erlydtl_compiler.erl
index a922404..f4b4eb0 100644
--- a/src/rebar_prv_erlydtl_compiler.erl
+++ b/src/rebar_prv_erlydtl_compiler.erl
@@ -126,6 +126,7 @@ init(State) ->
{ok, State1}.
do(Config) ->
+ ?INFO("Running erlydtl...", []),
MultiDtlOpts = erlydtl_opts(Config),
Result = lists:foldl(fun(DtlOpts, _) ->
diff --git a/src/rebar_state.erl b/src/rebar_state.erl
index 0bf26e2..29b7c3f 100644
--- a/src/rebar_state.erl
+++ b/src/rebar_state.erl
@@ -30,7 +30,6 @@
overrides/1, overrides/2,
apply_overrides/2,
- prepend_hook/3, append_hook/3, hooks/2,
providers/1, providers/2, add_provider/2]).
-include("rebar.hrl").
@@ -279,15 +278,43 @@ add_provider(State=#state_t{providers=Providers}, Provider) ->
State#state_t{providers=[Provider | Providers]}.
create_logic_providers(ProviderModules, State0) ->
- lists:foldl(fun(ProviderMod, Acc) ->
- case providers:new(ProviderMod, Acc) of
- {error, Reason} ->
- ?ERROR(Reason++"~n", []),
- Acc;
- {ok, State1} ->
- State1
- end
- end, State0, ProviderModules).
+ try
+ State1 = lists:foldl(fun(ProviderMod, StateAcc) ->
+ case providers:new(ProviderMod, StateAcc) of
+ {error, Reason} ->
+ ?ERROR(Reason++"~n", []),
+ StateAcc;
+ {ok, StateAcc1} ->
+ StateAcc1
+ end
+ end, State0, ProviderModules),
+ apply_hooks(State1)
+ catch
+ C:T ->
+ ?DEBUG("~p: ~p ~p", [C, T, erlang:get_stacktrace()]),
+ throw({error, "Failed creating providers. Run with DEBUG=1 for stacktrace."})
+ end.
+
+apply_hooks(State0) ->
+ try
+ Hooks = rebar_state:get(State0, provider_hooks, []),
+ PreHooks = proplists:get_value(pre, Hooks, []),
+ PostHooks = proplists:get_value(post, Hooks, []),
+ State1 = lists:foldl(fun({Target, Hook}, StateAcc) ->
+ prepend_hook(StateAcc, Target, Hook)
+ end, State0, PreHooks),
+ lists:foldl(fun({Target, Hook}, StateAcc) ->
+ append_hook(StateAcc, Target, Hook)
+ end, State1, PostHooks)
+ catch
+ C:T ->
+ ?DEBUG("~p: ~p ~p", [C, T, erlang:get_stacktrace()]),
+ throw({error, "Failed parsing provider hooks. Run with DEBUG=1 for stacktrace."})
+ end.
+
+%% ===================================================================
+%% Internal functions
+%% ===================================================================
prepend_hook(State=#state_t{providers=Providers}, Target, Hook) ->
State#state_t{providers=add_hook(pre, Providers, Target, Hook)}.
@@ -295,15 +322,6 @@ prepend_hook(State=#state_t{providers=Providers}, Target, Hook) ->
append_hook(State=#state_t{providers=Providers}, Target, Hook) ->
State#state_t{providers=add_hook(post, Providers, Target, Hook)}.
--spec hooks(t(), atom()) -> {[providers:t()], [providers:t()]}.
-hooks(_State=#state_t{providers=Providers}, Target) ->
- Provider = providers:get_provider(Target, Providers),
- providers:hooks(Provider).
-
-%% ===================================================================
-%% Internal functions
-%% ===================================================================
-
add_hook(Which, Providers, Target, Hook) ->
Provider = providers:get_provider(Target, Providers),
Hooks = providers:hooks(Provider),
diff --git a/test/rebar_hooks_SUITE.erl b/test/rebar_hooks_SUITE.erl
new file mode 100644
index 0000000..642798f
--- /dev/null
+++ b/test/rebar_hooks_SUITE.erl
@@ -0,0 +1,38 @@
+-module(rebar_hooks_SUITE).
+
+-export([suite/0,
+ init_per_suite/1,
+ end_per_suite/1,
+ init_per_testcase/2,
+ all/0,
+ build_and_clean_app/1]).
+
+-include_lib("common_test/include/ct.hrl").
+-include_lib("eunit/include/eunit.hrl").
+-include_lib("kernel/include/file.hrl").
+
+suite() ->
+ [].
+
+init_per_suite(Config) ->
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_testcase(_, Config) ->
+ rebar_test_utils:init_rebar_state(Config).
+
+all() ->
+ [build_and_clean_app].
+
+%% Test post provider hook cleans compiled project app, leaving it invalid
+build_and_clean_app(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]),
+ rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name, valid}]}),
+ rebar_test_utils:run_and_check(Config, [{provider_hooks, [{post, [{compile, clean}]}]}],
+ ["compile"], {ok, [{app, Name, invalid}]}).
diff --git a/test/rebar_test_utils.erl b/test/rebar_test_utils.erl
index 0a74a5f..6095d6d 100644
--- a/test/rebar_test_utils.erl
+++ b/test/rebar_test_utils.erl
@@ -102,7 +102,11 @@ check_results(AppDir, Expected) ->
BuildDir = filename:join([AppDir, "_build", "lib"]),
CheckoutsDir = filename:join([AppDir, "_checkouts"]),
Apps = rebar_app_discover:find_apps([AppDir]),
+ InvalidApps = rebar_app_discover:find_apps([AppDir], invalid),
+ ValidApps = rebar_app_discover:find_apps([AppDir], valid),
AppsNames = [{ec_cnv:to_list(rebar_app_info:name(App)), App} || App <- Apps],
+ InvalidAppsNames = [{ec_cnv:to_list(rebar_app_info:name(App)), App} || App <- InvalidApps],
+ ValidAppsNames = [{ec_cnv:to_list(rebar_app_info:name(App)), App} || App <- ValidApps],
Deps = rebar_app_discover:find_apps([BuildDir], all),
DepsNames = [{ec_cnv:to_list(rebar_app_info:name(App)), App} || App <- Deps],
Checkouts = rebar_app_discover:find_apps([CheckoutsDir], all),
@@ -116,6 +120,22 @@ check_results(AppDir, Expected) ->
{Name, _App} ->
ok
end
+ ; ({app, Name, invalid}) ->
+ ct:pal("Name: ~p", [Name]),
+ case lists:keyfind(Name, 1, InvalidAppsNames) of
+ false ->
+ error({app_not_found, Name});
+ {Name, _App} ->
+ ok
+ end
+ ; ({app, Name, valid}) ->
+ ct:pal("Name: ~p", [Name]),
+ case lists:keyfind(Name, 1, ValidAppsNames) of
+ false ->
+ error({app_not_found, Name});
+ {Name, _App} ->
+ ok
+ end
; ({checkout, Name}) ->
ct:pal("Name: ~p", [Name]),
?assertNotEqual(false, lists:keyfind(Name, 1, CheckoutsNames))