Browse Source

Merge pull request #233 from tsloughter/base_opts

apply profiles and overrides for an app's opts to the base opts
pull/237/head
Fred Hebert 10 years ago
parent
commit
bc5d1cb155
5 changed files with 103 additions and 15 deletions
  1. +6
    -3
      src/rebar3.erl
  2. +5
    -4
      src/rebar_app_discover.erl
  3. +5
    -4
      src/rebar_core.erl
  4. +5
    -2
      src/rebar_state.erl
  5. +82
    -2
      test/rebar_profiles_SUITE.erl

+ 6
- 3
src/rebar3.erl View File

@ -115,8 +115,7 @@ run_aux(State, GlobalPluginProviders, RawArgs) ->
false -> false ->
State; State;
Profile -> Profile ->
State1 = rebar_state:apply_profiles(State, [list_to_atom(Profile)]),
rebar_state:default(State1, rebar_state:opts(State1))
rebar_state:apply_profiles(State, [list_to_atom(Profile)])
end, end,
%% Process each command, resetting any state between each one %% Process each command, resetting any state between each one
@ -127,11 +126,15 @@ run_aux(State, GlobalPluginProviders, RawArgs) ->
{ok, Providers} = application:get_env(rebar, providers), {ok, Providers} = application:get_env(rebar, providers),
{ok, PluginProviders, State4} = rebar_plugins:install(State3), {ok, PluginProviders, State4} = rebar_plugins:install(State3),
rebar_core:update_code_path(State4), rebar_core:update_code_path(State4),
%% Providers can modify profiles stored in opts, so set default after initializing providers
AllProviders = Providers++PluginProviders++GlobalPluginProviders, AllProviders = Providers++PluginProviders++GlobalPluginProviders,
State5 = rebar_state:create_logic_providers(AllProviders, State4), State5 = rebar_state:create_logic_providers(AllProviders, State4),
State6 = rebar_state:default(State5, rebar_state:opts(State5)),
{Task, Args} = parse_args(RawArgs), {Task, Args} = parse_args(RawArgs),
rebar_core:process_command(rebar_state:command_args(State5, Args), Task).
rebar_core:process_command(rebar_state:command_args(State6, Args), Task).
init_config() -> init_config() ->
%% Initialize logging system %% Initialize logging system

+ 5
- 4
src/rebar_app_discover.erl View File

@ -34,13 +34,15 @@ format_error({missing_module, Module}) ->
io_lib:format("Module defined in app file missing: ~p~n", [Module]). io_lib:format("Module defined in app file missing: ~p~n", [Module]).
merge_deps(AppInfo, State) -> merge_deps(AppInfo, State) ->
Profiles = rebar_state:current_profiles(State),
Default = rebar_state:default(State),
CurrentProfiles = rebar_state:current_profiles(State),
Name = rebar_app_info:name(AppInfo), Name = rebar_app_info:name(AppInfo),
C = rebar_config:consult(rebar_app_info:dir(AppInfo)), C = rebar_config:consult(rebar_app_info:dir(AppInfo)),
%% We reset the opts here to default so no profiles are applied multiple times
AppState = rebar_state:apply_overrides( AppState = rebar_state:apply_overrides(
rebar_state:apply_profiles( rebar_state:apply_profiles(
rebar_state:new(State, C, rebar_app_info:dir(AppInfo)), Profiles), Name),
rebar_state:new(rebar_state:opts(State, Default), C, rebar_app_info:dir(AppInfo)), CurrentProfiles), Name),
AppInfo1 = rebar_app_info:state(AppInfo, AppState), AppInfo1 = rebar_app_info:state(AppInfo, AppState),
State1 = lists:foldl(fun(Profile, StateAcc) -> State1 = lists:foldl(fun(Profile, StateAcc) ->
@ -48,8 +50,7 @@ merge_deps(AppInfo, State) ->
TopLevelProfDeps = rebar_state:get(StateAcc, {deps, Profile}, []), TopLevelProfDeps = rebar_state:get(StateAcc, {deps, Profile}, []),
ProfDeps2 = lists:keymerge(1, TopLevelProfDeps, AppProfDeps), ProfDeps2 = lists:keymerge(1, TopLevelProfDeps, AppProfDeps),
rebar_state:set(StateAcc, {deps, Profile}, ProfDeps2) rebar_state:set(StateAcc, {deps, Profile}, ProfDeps2)
end, State, lists:reverse(Profiles)),
end, State, lists:reverse(CurrentProfiles)),
{AppInfo1, State1}. {AppInfo1, State1}.

+ 5
- 4
src/rebar_core.erl View File

@ -78,12 +78,13 @@ process_command(State, Command) ->
Command when Command =:= do; Command =:= as -> Command when Command =:= do; Command =:= as ->
do(TargetProviders, State); do(TargetProviders, State);
_ -> _ ->
Profiles = providers:profiles(CommandProvider),
State1 = rebar_state:apply_profiles(State, Profiles),
Opts = providers:opts(CommandProvider)++rebar3:global_option_spec_list(), Opts = providers:opts(CommandProvider)++rebar3:global_option_spec_list(),
case getopt:parse(Opts, rebar_state:command_args(State)) of
case getopt:parse(Opts, rebar_state:command_args(State1)) of
{ok, Args} -> {ok, Args} ->
State1 = rebar_state:command_parsed_args(State, Args),
do(TargetProviders, State1);
State2 = rebar_state:command_parsed_args(State1, Args),
do(TargetProviders, State2);
{error, {invalid_option, Option}} -> {error, {invalid_option, Option}} ->
{error, io_lib:format("Invalid option ~s on task ~p", [Option, Command])} {error, io_lib:format("Invalid option ~s on task ~p", [Option, Command])}
end end

+ 5
- 2
src/rebar_state.erl View File

@ -3,7 +3,7 @@
-export([new/0, new/1, new/2, new/3, -export([new/0, new/1, new/2, new/3,
get/2, get/3, set/3, get/2, get/3, set/3,
opts/1,
opts/1, opts/2,
default/1, default/2, default/1, default/2,
escript_path/1, escript_path/2, escript_path/1, escript_path/2,
@ -37,7 +37,6 @@
-record(state_t, {dir :: file:name(), -record(state_t, {dir :: file:name(),
opts = dict:new() :: rebar_dict(), opts = dict:new() :: rebar_dict(),
default = dict:new() :: rebar_dict(), default = dict:new() :: rebar_dict(),
escript_path :: undefined | file:filename_all(), escript_path :: undefined | file:filename_all(),
lock = [], lock = [],
@ -97,6 +96,7 @@ new(ParentState, Config, Dir) ->
D = proplists:get_value(deps, Config, []), D = proplists:get_value(deps, Config, []),
dict:from_list([{{deps, default}, D} | Config]) dict:from_list([{{deps, default}, D} | Config])
end, end,
NewOpts = dict:merge(fun(_Key, Value1, _Value2) -> NewOpts = dict:merge(fun(_Key, Value1, _Value2) ->
Value1 Value1
end, LocalOpts, Opts), end, LocalOpts, Opts),
@ -129,6 +129,9 @@ default(State, Opts) ->
opts(#state_t{opts=Opts}) -> opts(#state_t{opts=Opts}) ->
Opts. Opts.
opts(State, Opts) ->
State#state_t{opts=Opts}.
current_profiles(#state_t{current_profiles=Profiles}) -> current_profiles(#state_t{current_profiles=Profiles}) ->
Profiles. Profiles.

+ 82
- 2
test/rebar_profiles_SUITE.erl View File

@ -10,7 +10,11 @@
profile_merges/1, profile_merges/1,
add_to_profile/1, add_to_profile/1,
add_to_existing_profile/1, add_to_existing_profile/1,
profiles_remain_applied_with_config_present/1]).
profiles_remain_applied_with_config_present/1,
test_profile_applied_at_completion/1,
test_profile_applied_before_compile/1,
test_profile_applied_before_eunit/1,
test_profile_applied_to_apps/1]).
-include_lib("common_test/include/ct.hrl"). -include_lib("common_test/include/ct.hrl").
-include_lib("eunit/include/eunit.hrl"). -include_lib("eunit/include/eunit.hrl").
@ -19,7 +23,11 @@
all() -> all() ->
[profile_new_key, profile_merge_keys, profile_merges, [profile_new_key, profile_merge_keys, profile_merges,
add_to_profile, add_to_existing_profile, add_to_profile, add_to_existing_profile,
profiles_remain_applied_with_config_present].
profiles_remain_applied_with_config_present,
test_profile_applied_at_completion,
test_profile_applied_before_compile,
test_profile_applied_before_eunit,
test_profile_applied_to_apps].
init_per_suite(Config) -> init_per_suite(Config) ->
application:start(meck), application:start(meck),
@ -151,3 +159,75 @@ profiles_remain_applied_with_config_present(Config) ->
Mod = list_to_atom("not_a_real_src_" ++ Name), Mod = list_to_atom("not_a_real_src_" ++ Name),
true = lists:member({d, not_ok}, proplists:get_value(options, Mod:module_info(compile), [])). true = lists:member({d, not_ok}, proplists:get_value(options, Mod:module_info(compile), [])).
test_profile_applied_at_completion(Config) ->
AppDir = ?config(apps, Config),
Name = rebar_test_utils:create_random_name("test_profile_at_completion_"),
Vsn = rebar_test_utils:create_random_vsn(),
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
RebarConfig = [{erl_opts, [{d, some_define}]}],
rebar_test_utils:create_config(AppDir, RebarConfig),
{ok, State} = rebar_test_utils:run_and_check(Config,
RebarConfig,
["eunit"],
return),
Opts = rebar_state:opts(State),
ErlOpts = dict:fetch(erl_opts, Opts),
true = lists:member({d, 'TEST'}, ErlOpts).
test_profile_applied_before_compile(Config) ->
AppDir = ?config(apps, Config),
Name = rebar_test_utils:create_random_name("test_profile_before_compile_"),
Vsn = rebar_test_utils:create_random_vsn(),
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
RebarConfig = [{erl_opts, [{d, some_define}]}],
rebar_test_utils:create_config(AppDir, RebarConfig),
rebar_test_utils:run_and_check(Config, RebarConfig, ["eunit"], {ok, [{app, Name}]}),
S = list_to_atom("not_a_real_src_" ++ Name),
true = lists:member({d, 'TEST'}, proplists:get_value(options, S:module_info(compile), [])).
test_profile_applied_before_eunit(Config) ->
AppDir = ?config(apps, Config),
Name = rebar_test_utils:create_random_name("test_profile_before_eunit_"),
Vsn = rebar_test_utils:create_random_vsn(),
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
RebarConfig = [{erl_opts, [{d, some_define}]}],
rebar_test_utils:create_config(AppDir, RebarConfig),
rebar_test_utils:run_and_check(Config, RebarConfig, ["eunit"], {ok, [{app, Name}]}),
T = list_to_atom("not_a_real_src_" ++ Name ++ "_tests"),
true = lists:member({d, 'TEST'}, proplists:get_value(options, T:module_info(compile), [])).
test_profile_applied_to_apps(Config) ->
AppDir = ?config(apps, Config),
Name = rebar_test_utils:create_random_name("test_profile_applied_to_apps_"),
Vsn = rebar_test_utils:create_random_vsn(),
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
RebarConfig = [{erl_opts, [{d, some_define}]}],
rebar_test_utils:create_config(AppDir, RebarConfig),
{ok, State} = rebar_test_utils:run_and_check(Config,
RebarConfig,
["eunit"],
return),
Apps = rebar_state:project_apps(State),
lists:foreach(fun(App) ->
AppState = rebar_app_info:state(App),
Opts = rebar_state:opts(AppState),
ErlOpts = dict:fetch(erl_opts, Opts),
true = lists:member({d, 'TEST'}, ErlOpts)
end, Apps).

Loading…
Cancel
Save