소스 검색

Fix precedence rules of erl_opts for test profile

When adding the 'TEST' macro to the test profile, we mistakenly sourced
the erl_opts values from the base profile rather than the test profile
itself.

This means that in cases where the base profile set an option such as
'no_debug_info' and a profile overrode it with 'debug_info', the default
options would get injected within the test profile, and broke the
precedence rules, yielding incompatible values.

This patch fixes things by adding the macro to the values sourced from
the test profile itself, fixing the issue.
pull/1759/head
Fred Hebert 7 년 전
부모
커밋
543fe579a6
2개의 변경된 파일37개의 추가작업 그리고 1개의 파일을 삭제
  1. +5
    -1
      src/rebar3.erl
  2. +32
    -0
      test/rebar_profiles_SUITE.erl

+ 5
- 1
src/rebar3.erl 파일 보기

@ -389,7 +389,11 @@ state_from_global_config(Config, GlobalConfigFile) ->
rebar_state:providers(rebar_state:new(GlobalConfig3, Config), GlobalPlugins).
test_state(State) ->
ErlOpts = rebar_state:get(State, erl_opts, []),
%% Fetch the test profile's erl_opts only
Opts = rebar_state:opts(State),
Profiles = rebar_opts:get(Opts, profiles, []),
ProfileOpts = proplists:get_value(test, Profiles, []),
ErlOpts = proplists:get_value(erl_opts, ProfileOpts, []),
TestOpts = safe_define_test_macro(ErlOpts),
[{extra_src_dirs, ["test"]}, {erl_opts, TestOpts}].

+ 32
- 0
test/rebar_profiles_SUITE.erl 파일 보기

@ -28,6 +28,7 @@
test_profile_erl_opts_order_4/1,
test_profile_erl_opts_order_5/1,
test_erl_opts_debug_info/1,
test_profile_erl_opts_precedence/1,
first_files_exception/1]).
-include_lib("common_test/include/ct.hrl").
@ -52,6 +53,7 @@ all() ->
test_profile_erl_opts_order_4,
test_profile_erl_opts_order_5,
test_erl_opts_debug_info,
test_profile_erl_opts_precedence,
first_files_exception].
init_per_suite(Config) ->
@ -527,6 +529,36 @@ test_erl_opts_debug_info(_Config) ->
no_debug_info,b,c,{debug_info,{mod,"123"}}])),
ok.
test_profile_erl_opts_precedence(Config) ->
AppDir = ?config(apps, Config),
Name = rebar_test_utils:create_random_name("profile_new_key_"),
Vsn = rebar_test_utils:create_random_vsn(),
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
RebarConfig = [{erl_opts, [no_debug_info]},
{profiles, [
{test, [{erl_opts, [debug_info, {d,'HI'}]}]},
{other, [{erl_opts, [debug_info, {d,'HI'}]}]}
]}],
{ok, State1} = rebar_test_utils:run_and_check(
Config, RebarConfig, ["as", "test", "compile"], return
),
{ok, State2} = rebar_test_utils:run_and_check(
Config, RebarConfig, ["as", "other", "compile"], return
),
{ok, State3} = rebar_test_utils:run_and_check(
Config, RebarConfig, ["compile"], return
),
Opts1 = rebar_state:opts(State1),
Opts2 = rebar_state:opts(State2),
Opts3 = rebar_state:opts(State3),
ErlOpts1 = rebar_opts:erl_opts(Opts1),
ErlOpts2 = rebar_opts:erl_opts(Opts2),
ErlOpts3 = rebar_opts:erl_opts(Opts3),
?assertEqual([{d,'TEST'}, debug_info, {d,'HI'}], ErlOpts1),
?assertEqual([debug_info, {d,'HI'}], ErlOpts2),
?assertEqual([], ErlOpts3),
ok.
first_files_exception(_Config) ->
RebarConfig = [{erl_first_files, ["c","a","b"]},
{mib_first_files, ["c","a","b"]},

불러오는 중...
취소
저장