diff options
| author | Fred Hebert <mononcqc@ferd.ca> | 2015-02-02 19:31:53 -0500 | 
|---|---|---|
| committer | Fred Hebert <mononcqc@ferd.ca> | 2015-02-02 19:31:53 -0500 | 
| commit | d2cfe6a073d4d5d3092143c3925dacaab76ed472 (patch) | |
| tree | 7d09e4c1c90506717fc210ddc01fe6e7c05f464d | |
| parent | 89d3ef6e0d2225ea195b6ef1207c4c438792b2d1 (diff) | |
| parent | c8d0aa46c40832fcc5c0ae6d8ea2c8fd67c53690 (diff) | |
Merge pull request #115 from tsloughter/provider_hooks
support for provider_hooks in config
| -rw-r--r-- | rebar.config | 4 | ||||
| -rw-r--r-- | src/rebar_app_discover.erl | 10 | ||||
| -rw-r--r-- | src/rebar_app_info.erl | 8 | ||||
| -rw-r--r-- | src/rebar_core.erl | 23 | ||||
| -rw-r--r-- | src/rebar_prv_erlydtl_compiler.erl | 1 | ||||
| -rw-r--r-- | src/rebar_state.erl | 56 | ||||
| -rw-r--r-- | test/rebar_hooks_SUITE.erl | 38 | ||||
| -rw-r--r-- | test/rebar_test_utils.erl | 20 | 
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)) | 
