瀏覽代碼

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"]},

Loading…
取消
儲存