diff options
Diffstat (limited to 'src/rebar_state.erl')
-rw-r--r-- | src/rebar_state.erl | 70 |
1 files changed, 23 insertions, 47 deletions
diff --git a/src/rebar_state.erl b/src/rebar_state.erl index cd127c0..68c71a9 100644 --- a/src/rebar_state.erl +++ b/src/rebar_state.erl @@ -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]). - |