|
|
@ -30,6 +30,7 @@ |
|
|
|
overrides/1, overrides/2, |
|
|
|
apply_overrides/2, |
|
|
|
|
|
|
|
resources/1, resources/2, add_resource/2, |
|
|
|
providers/1, providers/2, add_provider/2]). |
|
|
|
|
|
|
|
-include("rebar.hrl"). |
|
|
@ -51,6 +52,7 @@ |
|
|
|
all_deps = [] :: [rebar_app_info:t()], |
|
|
|
|
|
|
|
overrides = [], |
|
|
|
resources = [], |
|
|
|
providers = []}). |
|
|
|
|
|
|
|
-export_type([t/0]). |
|
|
@ -296,6 +298,18 @@ namespace(#state_t{namespace=Namespace}) -> |
|
|
|
namespace(State=#state_t{}, Namespace) -> |
|
|
|
State#state_t{namespace=Namespace}. |
|
|
|
|
|
|
|
-spec resources(t()) -> rebar_resource:resource(). |
|
|
|
resources(#state_t{resources=Resources}) -> |
|
|
|
Resources. |
|
|
|
|
|
|
|
-spec resources(t(), [rebar_resource:resource()]) -> t(). |
|
|
|
resources(State, NewResources) -> |
|
|
|
State#state_t{resources=NewResources}. |
|
|
|
|
|
|
|
-spec add_resource(t(), rebar_resource:resource()) -> t(). |
|
|
|
add_resource(State=#state_t{resources=Resources}, Resource) -> |
|
|
|
State#state_t{resources=[Resource | Resources]}. |
|
|
|
|
|
|
|
providers(#state_t{providers=Providers}) -> |
|
|
|
Providers. |
|
|
|
|
|
|
@ -308,62 +322,25 @@ add_provider(State=#state_t{providers=Providers}, Provider) -> |
|
|
|
|
|
|
|
create_logic_providers(ProviderModules, State0) -> |
|
|
|
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) |
|
|
|
lists:foldl(fun(ProviderMod, StateAcc) -> |
|
|
|
case providers:new(ProviderMod, StateAcc) of |
|
|
|
{error, Reason} -> |
|
|
|
?ERROR(Reason++"~n", []), |
|
|
|
StateAcc; |
|
|
|
{ok, StateAcc1} -> |
|
|
|
StateAcc1 |
|
|
|
end |
|
|
|
end, State0, ProviderModules) |
|
|
|
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)}. |
|
|
|
|
|
|
|
append_hook(State=#state_t{providers=Providers}, Target, Hook) -> |
|
|
|
State#state_t{providers=add_hook(post, Providers, Target, Hook)}. |
|
|
|
|
|
|
|
add_hook(Which, Providers, Target, Hook) -> |
|
|
|
Provider = providers:get_provider(Target, Providers), |
|
|
|
Hooks = providers:hooks(Provider), |
|
|
|
NewHooks = add_hook(Which, Hooks, Hook), |
|
|
|
NewProvider = providers:hooks(Provider, NewHooks), |
|
|
|
[NewProvider | lists:delete(Provider, Providers)]. |
|
|
|
|
|
|
|
add_hook(pre, {PreHooks, PostHooks}, Hook) -> |
|
|
|
{[Hook | PreHooks], PostHooks}; |
|
|
|
add_hook(post, {PreHooks, PostHooks}, Hook) -> |
|
|
|
{PreHooks, [Hook | PostHooks]}. |
|
|
|
|
|
|
|
|
|
|
|
%% Sort the list in proplist-order, meaning that `{a,b}' and `{a,c}' |
|
|
|
%% both compare as usual, and `a' and `b' do the same, but `a' and `{a,b}' will |
|
|
|
%% compare based on the first element of the key, and in order. So the following |
|
|
@ -425,4 +402,3 @@ umerge([], Olds, Merged, CmpMerged, Cmp) when CmpMerged == Cmp -> |
|
|
|
lists:reverse(Olds, Merged); |
|
|
|
umerge([], Olds, Merged, _CmpMerged, Cmp) -> |
|
|
|
lists:reverse(Olds, [Cmp | Merged]). |
|
|
|
|