aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rlx_cmd_args.erl3
-rw-r--r--src/rlx_config.erl56
-rw-r--r--src/rlx_prv_overlay.erl15
-rw-r--r--src/rlx_state.erl8
4 files changed, 57 insertions, 25 deletions
diff --git a/src/rlx_cmd_args.erl b/src/rlx_cmd_args.erl
index 4f5e9da..1dc10c1 100644
--- a/src/rlx_cmd_args.erl
+++ b/src/rlx_cmd_args.erl
@@ -298,6 +298,9 @@ create(add_providers, Opts) ->
create(providers, Opts) ->
Providers = proplists:get_value(providers, Opts, []),
{providers, Providers};
+create(api_caller_overlays, Opts) ->
+ ApiCallerOverlays = proplists:get_value(api_caller_overlays, Opts, []),
+ {api_caller_overlays, ApiCallerOverlays};
create(_, _) ->
[].
diff --git a/src/rlx_config.erl b/src/rlx_config.erl
index 90cfe7c..9eafb7d 100644
--- a/src/rlx_config.erl
+++ b/src/rlx_config.erl
@@ -191,31 +191,20 @@ load_terms({upfrom, UpFrom}, {ok, State0}) ->
{ok, rlx_state:upfrom(State0, UpFrom)};
load_terms({include_src, IncludeSrc}, {ok, State0}) ->
{ok, rlx_state:include_src(State0, IncludeSrc)};
+load_terms({release, {RelName, Vsn, {extend, {RelName2, Vsn2}}}, Applications}, {ok, State0}) ->
+ NewVsn = parse_vsn(Vsn),
+ NewVsn2 = parse_vsn(Vsn2),
+ add_extended_release(RelName, NewVsn, RelName2, NewVsn2, Applications, State0);
load_terms({release, {RelName, Vsn, {extend, RelName2}}, Applications}, {ok, State0}) ->
NewVsn = parse_vsn(Vsn),
- Release0 = rlx_release:new(RelName, NewVsn),
- ExtendRelease = rlx_state:get_configured_release(State0, RelName2, NewVsn),
- Applications1 = rlx_release:goals(ExtendRelease),
- case rlx_release:goals(Release0,
- rlx_release:merge_application_goals(Applications, Applications1)) of
- E={error, _} ->
- E;
- {ok, Release1} ->
- {ok, rlx_state:add_configured_release(State0, Release1)}
- end;
+ add_extended_release(RelName, NewVsn, RelName2, NewVsn, Applications, State0);
+load_terms({release, {RelName, Vsn, {extend, {RelName2, Vsn2}}}, Applications, Config}, {ok, State0}) ->
+ NewVsn = parse_vsn(Vsn),
+ NewVsn2 = parse_vsn(Vsn2),
+ add_extended_release(RelName, NewVsn, RelName2, NewVsn2, Applications, Config, State0);
load_terms({release, {RelName, Vsn, {extend, RelName2}}, Applications, Config}, {ok, State0}) ->
NewVsn = parse_vsn(Vsn),
- Release0 = rlx_release:new(RelName, NewVsn),
- ExtendRelease = rlx_state:get_configured_release(State0, RelName2, NewVsn),
- Applications1 = rlx_release:goals(ExtendRelease),
- case rlx_release:goals(Release0,
- rlx_release:merge_application_goals(Applications, Applications1)) of
- E={error, _} ->
- E;
- {ok, Release1} ->
- Release2 = rlx_release:config(Release1, Config),
- {ok, rlx_state:add_configured_release(State0, Release2)}
- end;
+ add_extended_release(RelName, NewVsn, RelName2, NewVsn, Applications, Config, State0);
load_terms({release, {RelName, Vsn}, {erts, ErtsVsn}, Applications}, {ok, State}) ->
NewVsn = parse_vsn(Vsn),
Release0 = rlx_release:erts(rlx_release:new(RelName, NewVsn), ErtsVsn),
@@ -414,3 +403,28 @@ git_ref(Arg) ->
{plain, "0"}
end
end.
+
+add_extended_release(RelName, NewVsn, RelName2, NewVsn2, Applications, State0) ->
+ Release0 = rlx_release:new(RelName, NewVsn),
+ ExtendRelease = rlx_state:get_configured_release(State0, RelName2, NewVsn2),
+ Applications1 = rlx_release:goals(ExtendRelease),
+ case rlx_release:goals(Release0,
+ rlx_release:merge_application_goals(Applications, Applications1)) of
+ E={error, _} ->
+ E;
+ {ok, Release1} ->
+ {ok, rlx_state:add_configured_release(State0, Release1)}
+ end.
+
+add_extended_release(RelName, NewVsn, RelName2, NewVsn2, Applications, Config, State0) ->
+ Release0 = rlx_release:new(RelName, NewVsn),
+ ExtendRelease = rlx_state:get_configured_release(State0, RelName2, NewVsn2),
+ Applications1 = rlx_release:goals(ExtendRelease),
+ case rlx_release:goals(Release0,
+ rlx_release:merge_application_goals(Applications, Applications1)) of
+ E={error, _} ->
+ E;
+ {ok, Release1} ->
+ Release2 = rlx_release:config(Release1, Config),
+ {ok, rlx_state:add_configured_release(State0, Release2)}
+ end.
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})),
diff --git a/src/rlx_state.erl b/src/rlx_state.erl
index cab55f6..9f9d835 100644
--- a/src/rlx_state.erl
+++ b/src/rlx_state.erl
@@ -44,6 +44,7 @@
goals/2,
config_file/1,
config_file/2,
+ api_caller_overlays/1,
cli_args/1,
cli_args/2,
providers/1,
@@ -104,6 +105,7 @@
output_dir :: file:name(),
lib_dirs=[] :: [file:name()],
config_file=[] :: file:filename() | undefined,
+ api_caller_overlays=[] :: [{atom(),term()}],
cli_args=[] :: proplists:proplist(),
goals=[] :: [rlx_depsolver:raw_constraint()],
providers=[] :: [providers:t()],
@@ -160,8 +162,10 @@ new(Config, CommandLineConfig, Targets)
Log = proplists:get_value(
log, CommandLineConfig,
ec_cmd_log:new(error, Caller, rlx_util:intensity())),
+ ApiCallerOverlays = proplists:get_value(api_caller_overlays, CommandLineConfig, []),
State0 = #state_t{log=Log,
config_file=Config,
+ api_caller_overlays=ApiCallerOverlays,
cli_args=CommandLineConfig,
actions=Targets,
caller=Caller,
@@ -270,6 +274,10 @@ config_file(#state_t{config_file=ConfigFiles}) ->
config_file(State, ConfigFiles) ->
State#state_t{config_file=ConfigFiles}.
+-spec api_caller_overlays(t()) -> [{atom(),term()}].
+api_caller_overlays(#state_t{api_caller_overlays = ApiCallerOverlays}) ->
+ ApiCallerOverlays.
+
-spec cli_args(t()) -> proplists:proplist().
cli_args(#state_t{cli_args=CliArgs}) ->
CliArgs.