From bc2f06220003499ac998f519c9eb595a0e957e15 Mon Sep 17 00:00:00 2001 From: Fred Hebert Date: Tue, 15 Aug 2017 11:20:28 -0400 Subject: Fix ordering of overlays and overlay vars in Relx Specifically, this impacts profiles. It appears that relx as a whole requires its configuration to be merged in one tuple order (New takes precedence over Old), whereas the overlays require the opposite (Old takes precedence over New) since the operation order on disk is important to work well. This patch reorders overlay values such that the overlay of a profile takes place *after* the basic overlay, ensuring that the profile actions take place after the basic ones; this allows profiles to properly overwrite files as expected (see #1609) This is done while adequately maintaining the order of operations that were required as part of #1563 Overlay vars of profiles are also checked to be working fine, along with a test. This fixes #1247 and #1609 --- test/rebar_release_SUITE.erl | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) (limited to 'test') diff --git a/test/rebar_release_SUITE.erl b/test/rebar_release_SUITE.erl index e41339b..1bcc61e 100644 --- a/test/rebar_release_SUITE.erl +++ b/test/rebar_release_SUITE.erl @@ -200,13 +200,34 @@ profile_overlays(Config) -> AppDir = ?config(apps, Config), Name = ?config(name, Config), Vsn = "1.0.0", + file:write_file(filename:join(AppDir, "dev.file"), "dev.\n"), + file:write_file(filename:join(AppDir, "prod.file"), "prod.\n"), + file:write_file(filename:join(AppDir, "dev.vars"), "{env, \"dev\"}.\n"), + file:write_file(filename:join(AppDir, "prod.vars"), "{env, \"prod\"}.\n"), {ok, RebarConfig} = - file:consult(rebar_test_utils:create_config(AppDir, - [{relx, [{release, {list_to_atom(Name), Vsn}, - [list_to_atom(Name)]}, - {overlay, [{mkdir, "randomdir"}]}, - {lib_dirs, [AppDir]}]}, - {profiles, [{prod, [{relx, [{overlay, [{mkdir, "otherrandomdir"}]}]}]}]}])), + file:consult(rebar_test_utils:create_config(AppDir, + %% Paths are relative, but to cwd in relx, not the project root as + %% seen by rebar3 (in non-test cases, they're the same). + %% Work around by being explicit. + [{relx, [{release, {list_to_atom(Name), Vsn}, + [list_to_atom(Name)]}, + {overlay_vars, filename:join(AppDir, "dev.vars")}, + {overlay, [{mkdir, "randomdir"}, + {copy, filename:join(AppDir,"./dev.file"), "profile.file"}, + {copy, filename:join(AppDir,"./dev.file"), "{{env}}.file"}, + {chmod, 8#00770, "profile.file"}]}, + {lib_dirs, [AppDir]}]}, + {profiles, [{prod, + [{relx, [ + {overlay_vars, filename:join(AppDir, "prod.vars")}, + {overlay, [{mkdir, "otherrandomdir"}, + {copy, filename:join(AppDir, "./prod.file"), "{{env}}.file"}, + {copy, filename:join(AppDir, "./prod.file"), "profile.file"}, + {chmod, 8#00770, "profile.file"}]} + + ]}] + }]} + ])), ReleaseDir = filename:join([AppDir, "./_build/prod/rel/", Name]), @@ -216,7 +237,12 @@ profile_overlays(Config) -> {ok, [{release, list_to_atom(Name), Vsn, false}, {dir, filename:join(ReleaseDir, "otherrandomdir")}, {dir, filename:join(ReleaseDir, "randomdir")}]} - ). + ), + ?assertMatch({ok,[prod]}, + file:consult(filename:join(ReleaseDir, "profile.file"))), + ?assertMatch({ok,[prod]}, + file:consult(filename:join(ReleaseDir, "prod.file"))), + ok. profile_overlay_merge (_Config) -> % when profile and relx overlays both exist, the profile overlays should be -- cgit v1.1