aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/rlx_config.erl56
-rw-r--r--test/rlx_release_SUITE.erl37
2 files changed, 72 insertions, 21 deletions
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/test/rlx_release_SUITE.erl b/test/rlx_release_SUITE.erl
index b647ca8..752ce18 100644
--- a/test/rlx_release_SUITE.erl
+++ b/test/rlx_release_SUITE.erl
@@ -31,6 +31,7 @@
make_release/1,
make_config_release/1,
make_extend_release/1,
+ make_extend_release_versioned/1,
make_extend_config_release/1,
make_scriptless_release/1,
make_overridden_release/1,
@@ -87,6 +88,7 @@ init_per_testcase(_, Config) ->
all() ->
[providers, providers_via_api_options, add_providers, add_providers_via_api_options,
make_release, make_config_release, make_extend_release, make_extend_config_release,
+ make_extend_release_versioned,
make_scriptless_release, make_overridden_release, make_auto_skip_empty_app_release,
make_skip_app_release, make_exclude_app_release, make_app_type_none_release,
make_implicit_config_release, make_rerun_overridden_release, overlay_release,
@@ -380,6 +382,41 @@ make_extend_release(Config) ->
?assert(lists:member({goal_app_2, "0.0.1"}, AppSpecs)),
?assert(lists:member({lib_dep_1, "0.0.1", load}, AppSpecs)).
+make_extend_release_versioned(Config) ->
+ LibDir1 = proplists:get_value(lib1, Config),
+
+ rlx_test_utils:create_app(LibDir1, "goal_app_1", "0.0.1", [stdlib,kernel,non_goal_1], []),
+ rlx_test_utils:create_app(LibDir1, "lib_dep_1", "0.0.1", [stdlib,kernel], []),
+ rlx_test_utils:create_app(LibDir1, "goal_app_2", "0.0.1", [stdlib,kernel,goal_app_1,non_goal_2], []),
+ rlx_test_utils:create_app(LibDir1, "non_goal_1", "0.0.1", [stdlib,kernel], [lib_dep_1]),
+ rlx_test_utils:create_app(LibDir1, "non_goal_2", "0.0.1", [stdlib,kernel], []),
+
+ ConfigFile = filename:join([LibDir1, "relx.config"]),
+ rlx_test_utils:write_config(ConfigFile,
+ [{release, {foo, "0.0.2"},
+ [goal_app_1,
+ goal_app_2]},
+ {release, {foo_test, "0.0.3", {extend, {foo, "0.0.2"}}},
+ [goal_app_2]},
+ {lib_dirs, [filename:join(LibDir1, "*")]}]),
+ OutputDir = filename:join([proplists:get_value(priv_dir, Config),
+ rlx_test_utils:create_random_name("relx-output")]),
+
+ ?assertMatch({error, {rlx_prv_release, {multiple_release_names,foo,foo_test}}},
+ catch relx:do(undefined, undefined, [], [LibDir1], 3, OutputDir, ConfigFile)),
+
+ {ok, State} = relx:do(foo_test, undefined, [], [LibDir1], 3,
+ OutputDir, ConfigFile),
+ [{{foo_test, "0.0.3"}, Release}] = ec_dictionary:to_list(rlx_state:realized_releases(State)),
+ AppSpecs = rlx_release:applications(Release),
+ ?assert(lists:keymember(stdlib, 1, AppSpecs)),
+ ?assert(lists:keymember(kernel, 1, AppSpecs)),
+ ?assert(lists:member({non_goal_1, "0.0.1"}, AppSpecs)),
+ ?assert(lists:member({non_goal_2, "0.0.1"}, AppSpecs)),
+ ?assert(lists:member({goal_app_1, "0.0.1"}, AppSpecs)),
+ ?assert(lists:member({goal_app_2, "0.0.1"}, AppSpecs)),
+ ?assert(lists:member({lib_dep_1, "0.0.1", load}, AppSpecs)).
+
make_extend_config_release(Config) ->
LibDir1 = proplists:get_value(lib1, Config),