diff options
Diffstat (limited to 'src/rlx_prv_overlay.erl')
-rw-r--r-- | src/rlx_prv_overlay.erl | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/rlx_prv_overlay.erl b/src/rlx_prv_overlay.erl index 87fa91f..ec8a97f 100644 --- a/src/rlx_prv_overlay.erl +++ b/src/rlx_prv_overlay.erl @@ -152,10 +152,15 @@ get_overlay_vars_from_file(State, OverlayVars) -> -spec read_overlay_vars(rlx_state:t(), proplists:proplist(), [file:name()]) -> proplists:proplist() | relx:error(). read_overlay_vars(State, OverlayVars, FileNames) -> + ApiCallerVars = rlx_state:api_caller_overlays(State), Terms = merge_overlay_vars(State, FileNames), - case render_overlay_vars(OverlayVars, Terms, []) of + case render_overlay_vars(OverlayVars ++ ApiCallerVars, Terms, []) of {ok, NewTerms} -> - OverlayVars ++ NewTerms; + % We place `ApiCallerVars' at the end on purpose; their + % definitions should be overwrittenable by both internal + % and rendered vars, as not to change behaviour in + % setups preceding the support for API caller overlays. + OverlayVars ++ NewTerms ++ ApiCallerVars; Error -> Error end. @@ -187,9 +192,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})), |