aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/sasl/src/release_handler.erl53
-rw-r--r--lib/sasl/src/systools_make.erl8
-rw-r--r--lib/sasl/test/systools_SUITE.erl10
3 files changed, 57 insertions, 14 deletions
diff --git a/lib/sasl/src/release_handler.erl b/lib/sasl/src/release_handler.erl
index 38aee9ecde..931347bde2 100644
--- a/lib/sasl/src/release_handler.erl
+++ b/lib/sasl/src/release_handler.erl
@@ -1049,10 +1049,9 @@ new_emulator_make_tmp_release(CurrentRelease,ToRelease,RelDir,Opts,Masters) ->
erts_vsn=ToRelease#release.erts_vsn,
libs = BaseLibs ++ RestLibs,
status = unpacked},
- new_emulator_make_boot_hybrid(CurrentVsn,ToVsn,TmpVsn,BaseLibs,
+ new_emulator_make_hybrid_boot(CurrentVsn,ToVsn,TmpVsn,BaseLibs,
RelDir,Opts,Masters),
- SysConfig = filename:join([RelDir,CurrentVsn,"sys.config"]),
- copy_file(SysConfig,filename:join(RelDir,TmpVsn),Masters),
+ new_emulator_make_hybrid_config(CurrentVsn,ToVsn,TmpVsn,RelDir,Masters),
{TmpVsn,TmpRelease}.
check_base_libs([_,_,_]=BaseLibs,_Vsn) ->
@@ -1069,7 +1068,7 @@ find_missing(SomeMissing,[H|T],Vsn) ->
throw({error,{missing_base_app,Vsn,H}})
end.
-new_emulator_make_boot_hybrid(CurrentVsn,ToVsn,TmpVsn,BaseLibs,RelDir,Opts,Masters) ->
+new_emulator_make_hybrid_boot(CurrentVsn,ToVsn,TmpVsn,BaseLibs,RelDir,Opts,Masters) ->
FromBootFile = filename:join([RelDir,CurrentVsn,"start.boot"]),
ToBootFile = filename:join([RelDir,ToVsn,"start.boot"]),
TmpBootFile = filename:join([RelDir,TmpVsn,"start.boot"]),
@@ -1080,13 +1079,57 @@ new_emulator_make_boot_hybrid(CurrentVsn,ToVsn,TmpVsn,BaseLibs,RelDir,Opts,Maste
[KernelPath,SaslPath,StdlibPath] =
[filename:join(Path,ebin) || {_,_,Path} <- lists:keysort(1,BaseLibs)],
Paths = {KernelPath,StdlibPath,SaslPath},
- case systools_make:make_boot_hybrid(TmpVsn,FromBoot,ToBoot,Paths,Args) of
+ case systools_make:make_hybrid_boot(TmpVsn,FromBoot,ToBoot,Paths,Args) of
{ok,TmpBoot} ->
write_file(TmpBootFile,TmpBoot,Masters);
{error,Reason} ->
throw({error,{could_not_create_hybrid_boot,Reason}})
end.
+new_emulator_make_hybrid_config(CurrentVsn,ToVsn,TmpVsn,RelDir,Masters) ->
+ FromFile = filename:join([RelDir,CurrentVsn,"sys.config"]),
+ ToFile = filename:join([RelDir,ToVsn,"sys.config"]),
+ TmpFile = filename:join([RelDir,TmpVsn,"sys.config"]),
+
+ FromConfig =
+ case consult(FromFile,Masters) of
+ {ok,[FC]} ->
+ FC;
+ {error,Error1} ->
+ io:format("Warning: ~p can not read ~p: ~p~n",
+ [?MODULE,FromFile,Error1]),
+ []
+ end,
+
+ [Kernel,Stdlib,Sasl] =
+ case consult(ToFile,Masters) of
+ {ok,[ToConfig]} ->
+ [lists:keyfind(App,1,ToConfig) || App <- [kernel,stdlib,sasl]];
+ {error,Error2} ->
+ io:format("Warning: ~p can not read ~p: ~p~n",
+ [?MODULE,ToFile,Error2]),
+ [false,false,false]
+ end,
+
+ Config1 = replace_config(kernel,FromConfig,Kernel),
+ Config2 = replace_config(stdlib,Config1,Stdlib),
+ Config3 = replace_config(sasl,Config2,Sasl),
+
+ ConfigStr = io_lib:format("~p.~n",[Config3]),
+ write_file(TmpFile,ConfigStr,Masters).
+
+%% Take the configuration for application App from the new config and
+%% insert in the old config.
+%% If no entry exists in the new config, then delete the entry (if it exists)
+%% from the old config.
+%% If entry exists in the new config, but not in the old config, then
+%% add the entry.
+replace_config(App,Config,false) ->
+ lists:keydelete(App,1,Config);
+replace_config(App,Config,AppConfig) ->
+ lists:keystore(App,1,Config,AppConfig).
+
+%% Remove all files related to the temporary release
new_emulator_rm_tmp_release(?tmp_vsn(_)=TmpVsn,RelDir,Releases,Masters) ->
remove_dir(filename:join(RelDir,TmpVsn),Masters),
lists:keydelete(TmpVsn,#release.vsn,Releases);
diff --git a/lib/sasl/src/systools_make.erl b/lib/sasl/src/systools_make.erl
index 42b528540e..33bd51ecbb 100644
--- a/lib/sasl/src/systools_make.erl
+++ b/lib/sasl/src/systools_make.erl
@@ -31,7 +31,7 @@
-export([read_application/4]).
--export([make_boot_hybrid/5]).
+-export([make_hybrid_boot/5]).
-import(lists, [filter/2, keysort/2, keysearch/3, map/2, reverse/1,
append/1, foldl/3, member/2, foreach/2]).
@@ -182,9 +182,9 @@ return({error,Mod,Error},_,Flags) ->
%% Boot1 = Boot2 = Boot = binary()
%% Reason = {app_not_found,App} | {app_not_replaced,App}
%% App = kernel | stdlib | sasl
-make_boot_hybrid(TmpVsn, Boot1, Boot2, Paths, Args) ->
- catch do_make_boot_hybrid(TmpVsn, Boot1, Boot2, Paths, Args).
-do_make_boot_hybrid(TmpVsn, Boot1, Boot2, Paths, Args) ->
+make_hybrid_boot(TmpVsn, Boot1, Boot2, Paths, Args) ->
+ catch do_make_hybrid_boot(TmpVsn, Boot1, Boot2, Paths, Args).
+do_make_hybrid_boot(TmpVsn, Boot1, Boot2, Paths, Args) ->
{script,{_RelName1,_RelVsn1},Script1} = binary_to_term(Boot1),
{script,{RelName2,_RelVsn2},Script2} = binary_to_term(Boot2),
MatchPaths = get_regexp_path(Paths),
diff --git a/lib/sasl/test/systools_SUITE.erl b/lib/sasl/test/systools_SUITE.erl
index 960ba3cc21..5b3abad219 100644
--- a/lib/sasl/test/systools_SUITE.erl
+++ b/lib/sasl/test/systools_SUITE.erl
@@ -1486,7 +1486,7 @@ normal_hybrid(Config) ->
?line ok = file:set_cwd(OldDir),
?line BasePaths = {"testkernelpath","teststdlibpath","testsaslpath"},
- ?line {ok,Hybrid} = systools_make:make_boot_hybrid("tmp_vsn",Boot1,Boot2,
+ ?line {ok,Hybrid} = systools_make:make_hybrid_boot("tmp_vsn",Boot1,Boot2,
BasePaths, [dummy,args]),
?line {script,{"Test release 4","tmp_vsn"},Script} = binary_to_term(Hybrid),
@@ -1560,7 +1560,7 @@ normal_hybrid(Config) ->
ok.
-%% Check that systools_make:make_boot_hybrid fails with a meaningful
+%% Check that systools_make:make_hybrid_boot fails with a meaningful
%% error message if the FromBoot does not include the sasl
%% application.
hybrid_no_old_sasl(Config) ->
@@ -1584,14 +1584,14 @@ hybrid_no_old_sasl(Config) ->
?line BasePaths = {"testkernelpath","teststdlibpath","testsaslpath"},
?line {error,{app_not_replaced,sasl}} =
- systools_make:make_boot_hybrid("tmp_vsn",Boot1,Boot2,
+ systools_make:make_hybrid_boot("tmp_vsn",Boot1,Boot2,
BasePaths,[dummy,args]),
?line ok = file:set_cwd(OldDir),
ok.
-%% Check that systools_make:make_boot_hybrid fails with a meaningful
+%% Check that systools_make:make_hybrid_boot fails with a meaningful
%% error message if the ToBoot does not include the sasl
%% application.
hybrid_no_new_sasl(Config) ->
@@ -1615,7 +1615,7 @@ hybrid_no_new_sasl(Config) ->
?line BasePaths = {"testkernelpath","teststdlibpath","testsaslpath"},
?line {error,{app_not_found,sasl}} =
- systools_make:make_boot_hybrid("tmp_vsn",Boot1,Boot2,
+ systools_make:make_hybrid_boot("tmp_vsn",Boot1,Boot2,
BasePaths,[dummy,args]),
?line ok = file:set_cwd(OldDir),