aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikhail Uvarov <[email protected]>2019-08-12 01:49:59 +0200
committerMikhail Uvarov <[email protected]>2019-08-12 01:56:01 +0200
commite644d7c078c9b75edf1ba513a030d33921af8192 (patch)
tree8979a309de94132d354017e21819d659e73e99fe
parentf6bdffcd9bff0b62f3b7fd7bbf3db034f05fbd66 (diff)
downloadrelx-e644d7c078c9b75edf1ba513a030d33921af8192.tar.gz
relx-e644d7c078c9b75edf1ba513a030d33921af8192.tar.bz2
relx-e644d7c078c9b75edf1ba513a030d33921af8192.zip
Correctly render redefined variable
Rendering of variables behaves differently for already defined variables. Values of such variables are rendered in the wrong order, ignoring any variables above from the same file.
-rw-r--r--src/rlx_prv_overlay.erl6
-rw-r--r--test/rlx_release_SUITE.erl12
-rw-r--r--test/rlx_test_utils.erl3
3 files changed, 16 insertions, 5 deletions
diff --git a/src/rlx_prv_overlay.erl b/src/rlx_prv_overlay.erl
index 87fa91f..75608b3 100644
--- a/src/rlx_prv_overlay.erl
+++ b/src/rlx_prv_overlay.erl
@@ -187,9 +187,11 @@ merge_overlay_vars(State, FileNames) ->
%% to the current one being read
OverlayRelativeRoot = filename:dirname(FileName),
NewTerms = check_overlay_inclusion(State, OverlayRelativeRoot, Terms),
+ %% Remove already defined variables from Acc,
+ %% append NewTerms, preserving order
lists:foldl(fun(NewTerm, A) ->
- lists:keystore(element(1, NewTerm), 1, A, NewTerm)
- end, Acc, NewTerms);
+ lists:keydelete(element(1, NewTerm), 1, A)
+ end, Acc, NewTerms) ++ NewTerms;
{error, Reason} ->
ec_cmd_log:warn(rlx_state:log(State),
format_error({unable_to_read_varsfile, FileName, Reason})),
diff --git a/test/rlx_release_SUITE.erl b/test/rlx_release_SUITE.erl
index a582526..7ddaa14 100644
--- a/test/rlx_release_SUITE.erl
+++ b/test/rlx_release_SUITE.erl
@@ -781,14 +781,18 @@ overlay_release(Config) ->
goal_app_2]}]),
VarsFile1 = filename:join([LibDir1, "vars1.config"]),
+ %% tpl_var is defined in vars1, but redifined in vars2 using template.
rlx_test_utils:write_config(VarsFile1, [{yahoo, "yahoo"},
{yahoo2, [{foo, "bar"}]},
{foo_yahoo, "foo_{{yahoo}}"},
- {foo_dir, "foodir"}]),
+ {foo_dir, "foodir"},
+ {tpl_var, "defined in vars1"}]),
VarsFile2 = filename:join([LibDir1, "vars2.config"]),
rlx_test_utils:write_config(VarsFile2, [{google, "yahoo"},
{yahoo2, "foo"},
+ {tpl_arg, "a template value"},
+ {tpl_var, "Redefined in vars2 with {{tpl_arg}}"},
OverlayVars3]),
VarsFile3 = filename:join([LibDir1, "vars3.config"]),
@@ -857,7 +861,11 @@ overlay_release(Config) ->
?assertEqual("val1",
proplists:get_value(prop1, TemplateData)),
?assertEqual(2,
- proplists:get_value(prop2, TemplateData)).
+ proplists:get_value(prop2, TemplateData)),
+ %% This should be rendered correctly based on VarsFile2 file, regardless
+ %% of tpl_var defined in VarsFile1 or not.
+ ?assertEqual("Redefined in vars2 with a template value",
+ proplists:get_value(tpl_var, TemplateData)).
make_goalless_release(Config) ->
LibDir1 = proplists:get_value(lib1, Config),
diff --git a/test/rlx_test_utils.erl b/test/rlx_test_utils.erl
index 37d9c7a..5328559 100644
--- a/test/rlx_test_utils.erl
+++ b/test/rlx_test_utils.erl
@@ -185,7 +185,8 @@ test_template_contents() ->
"{foo_yahoo, \"{{foo_yahoo}}\"}.\n"
"{google, \"{{google}}\"}.\n"
"{prop1, \"{{prop1}}\"}.\n"
- "{prop2, {{prop2}}}.\n".
+ "{prop2, {{prop2}}}.\n"
+ "{tpl_var, \"{{tpl_var}}\"}.\n".
escript_contents() ->
"#!/usr/bin/env escript\n"