summaryrefslogtreecommitdiff
path: root/src/rebar_state.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/rebar_state.erl')
-rw-r--r--src/rebar_state.erl70
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]).
-