From 512b1a258c083021f199e6cad2da479e7fdfd6dd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?H=C3=A5kan=20Mattsson?= <hakan@erlang.org>
Date: Tue, 9 Mar 2010 18:46:31 +0100
Subject: Add function to return status about the configuration

It is called reltool:get_status/1. The API functions in reltool
that may take PidOrOptions as input and actually gets Options
does now print out the warnings.
---
 lib/reltool/doc/src/reltool.xml           | 11 +++++++
 lib/reltool/src/reltool.erl               | 50 +++++++++++++++++++++++--------
 lib/reltool/src/reltool_target.erl        | 29 ++++++++++--------
 lib/reltool/test/reltool_server_SUITE.erl | 20 ++++++++-----
 lib/reltool/test/rtt                      |  2 +-
 5 files changed, 78 insertions(+), 34 deletions(-)

(limited to 'lib')

diff --git a/lib/reltool/doc/src/reltool.xml b/lib/reltool/doc/src/reltool.xml
index 15beec52d6..24683b9302 100644
--- a/lib/reltool/doc/src/reltool.xml
+++ b/lib/reltool/doc/src/reltool.xml
@@ -617,6 +617,17 @@ target_spec()       = [target_spec()]
       more details.</p></desc>
     </func>
 
+    <func>
+      <name>get_status(Server) -> {ok, [Warning]} | {error, Reason}</name>
+      <fsummary>Get contents of a release file</fsummary>
+      <type>
+        <v>Server  = server()</v>
+        <v>Warning = string()</v>
+        <v>Reason  = reason()</v>
+      </type>
+      <desc><p>Get status about the configuration</p></desc>
+    </func>
+
     <func>
       <name>get_server(WindowPid) -> {ok, ServerPid} | {error, Reason}</name>
       <fsummary>Start server process with options</fsummary>
diff --git a/lib/reltool/src/reltool.erl b/lib/reltool/src/reltool.erl
index ff200d0eb8..351a3d59cf 100644
--- a/lib/reltool/src/reltool.erl
+++ b/lib/reltool/src/reltool.erl
@@ -21,7 +21,7 @@
 %% Public
 -export([
          start/0, start/1, start_link/1, debug/0, % GUI
-         start_server/1, get_server/1, stop/1,
+         start_server/1, get_server/1, get_status/1, stop/1,
          get_config/1, get_config/3, get_rel/2, get_script/2,
          create_target/2, get_target_spec/1, eval_target_spec/3,
          install/2
@@ -96,20 +96,45 @@ stop(Pid) when is_pid(Pid) ->
     end.
 
 %% Internal library function
--spec eval_server(server(), fun((server_pid()) -> term())) ->
+-spec eval_server(server(), boolean(), fun((server_pid()) -> term())) ->
  {ok, server_pid()} | {error, reason()}.
-eval_server(Pid, Fun) when is_pid(Pid) ->
+eval_server(Pid, DisplayWarnings, Fun)
+  when is_pid(Pid), is_boolean(DisplayWarnings) ->
     Fun(Pid);
-eval_server(Options, Fun) when is_list(Options), is_function(Fun, 1) ->
+eval_server(Options, DisplayWarnings, Fun)
+  when is_list(Options), is_boolean(DisplayWarnings), is_function(Fun, 1) ->
     case start_server(Options) of
         {ok, Pid} ->
-            Res = Fun(Pid),
-            stop(Pid),
-            Res;
+	    apply_fun(Pid, DisplayWarnings, Fun);
         {error, Reason} ->
             {error, Reason}
     end.
 
+apply_fun(Pid, false, Fun) ->
+    Res = Fun(Pid),
+    stop(Pid),
+    Res;
+apply_fun(Pid, true, Fun) ->
+    case get_status(Pid) of
+	{ok, Warnings} ->
+	    [io:format("~p: ~s\n", [?APPLICATION, W]) || W <- Warnings],
+	    apply_fun(Pid, false, Fun);
+	{error, Reason} ->
+	    stop(Pid),
+	    {error, Reason}
+    end.
+
+%% Get status about the configuration
+-type warning() :: string().
+-spec get_status(server()) ->
+			{ok, [warning()]} | {error, reason()}.
+get_status(PidOrOptions)
+  when is_pid(PidOrOptions); is_list(PidOrOptions) ->
+    eval_server(PidOrOptions, false,
+		fun(Pid) ->
+			reltool_server:get_status(Pid)
+		end).
+
 %% Get reltool configuration
 -spec get_config(server()) -> {ok, config()} | {error, reason()}.
 get_config(PidOrOption) ->
@@ -119,7 +144,7 @@ get_config(PidOrOption) ->
 			{ok, config()} | {error, reason()}.
 get_config(PidOrOptions, InclDef, InclDeriv)
   when is_pid(PidOrOptions); is_list(PidOrOptions) ->
-    eval_server(PidOrOptions,
+    eval_server(PidOrOptions, true,
 		fun(Pid) ->
 			reltool_server:get_config(Pid, InclDef, InclDeriv)
 		end).
@@ -128,7 +153,7 @@ get_config(PidOrOptions, InclDef, InclDeriv)
 -spec get_rel(server(), rel_name()) -> {ok, rel_file()} | {error, reason()}.
 get_rel(PidOrOptions, RelName)
   when is_pid(PidOrOptions); is_list(PidOrOptions) ->
-    eval_server(PidOrOptions,
+    eval_server(PidOrOptions, true,
 		fun(Pid) -> reltool_server:get_rel(Pid, RelName) end).
 
 %% Get contents of boot script file
@@ -136,21 +161,22 @@ get_rel(PidOrOptions, RelName)
 			{ok, script_file()} | {error, reason()}.
 get_script(PidOrOptions, RelName)
   when is_pid(PidOrOptions); is_list(PidOrOptions) ->
-   eval_server(PidOrOptions,
+   eval_server(PidOrOptions, true,
 	       fun(Pid) -> reltool_server:get_script(Pid, RelName) end).
 
 %% Generate a target system
 -spec create_target(server(), target_dir()) -> ok | {error, reason()}.
 create_target(PidOrOptions, TargetDir)
   when is_pid(PidOrOptions); is_list(PidOrOptions) ->
-    eval_server(PidOrOptions,
+    eval_server(PidOrOptions, true,
 		fun(Pid) -> reltool_server:gen_target(Pid, TargetDir) end).
 
 %% Generate a target system
 -spec get_target_spec(server()) -> {ok, target_spec()} | {error, reason()}.
 get_target_spec(PidOrOptions)
   when is_pid(PidOrOptions); is_list(PidOrOptions) ->
-    eval_server(PidOrOptions, fun(Pid) -> reltool_server:gen_spec(Pid) end).
+    eval_server(PidOrOptions, true,
+		fun(Pid) -> reltool_server:gen_spec(Pid) end).
 
 %% Generate a target system
 -spec eval_target_spec(target_spec(), root_dir(), target_dir()) ->
diff --git a/lib/reltool/src/reltool_target.erl b/lib/reltool/src/reltool_target.erl
index a4440f8fb1..160cbd8e15 100644
--- a/lib/reltool/src/reltool_target.erl
+++ b/lib/reltool/src/reltool_target.erl
@@ -707,16 +707,17 @@ strip_sys_files(Relocatable, SysFiles, Apps, ExclRegexps) ->
     {value, Erts} = lists:keysearch(erts, #app.name, Apps),
     FilterErts =
         fun(Spec) ->
-                File = element(2, Spec),
-                case lists:prefix("erts", File) of
-                    true ->
-                        if
-                            File =:= Erts#app.label ->
-                                replace_dyn_erl(Relocatable, Spec);
-                            true ->
-                                false
-                        end;
-                    false ->
+		File = element(2, Spec),
+		case File of
+		    "erts" ->
+			reltool_utils:throw_error("This system is not installed. "
+						  "The directory ~s is missing.",
+				    [Erts#app.label]);
+		    _ when File =:= Erts#app.label ->
+			replace_dyn_erl(Relocatable, Spec);
+                    "erts-" ++ _ ->
+			false;
+                    _ ->
                         true
                 end
         end,
@@ -729,7 +730,8 @@ strip_sys_files(Relocatable, SysFiles, Apps, ExclRegexps) ->
 replace_dyn_erl(false, _ErtsSpec) ->
     true;
 replace_dyn_erl(true, {create_dir, ErtsDir, ErtsFiles}) ->
-    [{create_dir, _, BinFiles}] = safe_lookup_spec("bin", ErtsFiles),
+    [{create_dir, _, BinFiles}] =
+	safe_lookup_spec("bin", ErtsFiles),
     case lookup_spec("dyn_erl", BinFiles) of
         [] ->
             case lookup_spec("erl.ini", BinFiles) of
@@ -853,6 +855,7 @@ lookup_spec(Prefix, Specs) ->
 safe_lookup_spec(Prefix, Specs) ->
     case lookup_spec(Prefix, Specs) of
         [] ->
+	    %% io:format("lookup fail ~s:\n\t~p\n", [Prefix, Specs]),
             reltool_utils:throw_error("Mandatory system file ~s is "
 				      "not included", [Prefix]);
         Match ->
@@ -1115,7 +1118,7 @@ do_eval_spec({archive, Archive, Options, Files},
         {ok, _} ->
             ok;
         {error, Reason} ->
-            reltool_utils:throw_error("create archive ~s: ~p\n",
+            reltool_utils:throw_error("create archive ~s failed: ~p\n",
 				      [ArchiveFile, Reason])
     end;
 do_eval_spec({copy_file, File}, _OrigSourceDir, SourceDir, TargetDir) ->
@@ -1317,7 +1320,7 @@ do_install(RelName, TargetDir) ->
             ok = release_handler:create_RELEASES(TargetDir2, RelFile),
             ok;
         _ ->
-            reltool_utils:throw_error("~s: Illegal syntax.\n", [DataFile])
+            reltool_utils:throw_error("~s: Illegal data file syntax.\n", [DataFile])
     end.
 
 subst_src_scripts(Scripts, SrcDir, DestDir, Vars, Opts) ->
diff --git a/lib/reltool/test/reltool_server_SUITE.erl b/lib/reltool/test/reltool_server_SUITE.erl
index cf951191a0..df53d0cc23 100644
--- a/lib/reltool/test/reltool_server_SUITE.erl
+++ b/lib/reltool/test/reltool_server_SUITE.erl
@@ -26,11 +26,13 @@
 -include("reltool_test_lib.hrl").
 
 -define(NODE_NAME, '__RELTOOL__TEMPORARY_TEST__NODE__').
+-define(WORK_DIR, "reltool_work_dir").
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Initialization functions.
 
 init_per_suite(Config) ->
+    ?ignore(file:make_dir(?WORK_DIR)),
     reltool_test_lib:init_per_suite(Config).
 
 end_per_suite(Config) ->
@@ -161,13 +163,15 @@ create_script(_Config) ->
            {erts, ErtsVsn},
            [{stdlib, StdlibVsn}, {kernel, KernelVsn}]},
     ?m({ok, Rel}, reltool:get_rel(Pid, RelName)),
-    RelFile = RelName ++ ".rel",
-    ?m(ok, file:write_file(RelFile, io_lib:format("~p.\n", [Rel]))),
+    ?m(ok, file:write_file(filename:join([?WORK_DIR, RelName ++ ".rel"]),
+			   io_lib:format("~p.\n", [Rel]))),
 
     %% Generate script file
+    {ok, Cwd} = file:get_cwd(),
+    ?m(ok, file:set_cwd(?WORK_DIR)),
     ?m(ok, systools:make_script(RelName, [])),
-    ScriptFile = RelName ++ ".script",
-    {ok, [OrigScript]} = ?msym({ok, [_]}, file:consult(ScriptFile)),
+    {ok, [OrigScript]} = ?msym({ok, [_]}, file:consult(RelName ++ ".script")),
+    ?m(ok, file:set_cwd(Cwd)),
     {ok, Script} = ?msym({ok, _}, reltool:get_script(Pid, RelName)),
     %% OrigScript2 = sort_script(OrigScript),
     %% Script2 = sort_script(Script),
@@ -201,7 +205,7 @@ create_target(_Config) ->
          ]},
 
     %% Generate target file
-    TargetDir = "reltool_target_dir_development",
+    TargetDir = filename:join([?WORK_DIR, "target_development"]),
     ?m(ok, reltool_utils:recursive_delete(TargetDir)),
     ?m(ok, file:make_dir(TargetDir)),
     ?m(ok, reltool:create_target([{config, Config}], TargetDir)),
@@ -234,7 +238,7 @@ create_embedded(_Config) ->
          ]},
 
     %% Generate target file
-    TargetDir = "reltool_target_dir_embedded",
+    TargetDir = filename:join([?WORK_DIR, "target_embedded"]),
     ?m(ok, reltool_utils:recursive_delete(TargetDir)),
     ?m(ok, file:make_dir(TargetDir)),
     ?m(ok, reltool:create_target([{config, Config}], TargetDir)),
@@ -264,7 +268,7 @@ create_standalone(_Config) ->
          ]},
 
     %% Generate target file
-    TargetDir = "reltool_target_dir_standalone",
+    TargetDir = filename:join([?WORK_DIR, "target_standalone"]),
     ?m(ok, reltool_utils:recursive_delete(TargetDir)),
     ?m(ok, file:make_dir(TargetDir)),
     ?m(ok, reltool:create_target([{config, Config}], TargetDir)),
@@ -306,7 +310,7 @@ create_old_target(_Config) ->
          ]},
 
     %% Generate target file
-    TargetDir = "reltool_target_dir_old",
+    TargetDir = filename:join([?WORK_DIR, "target_old_style"]),
     ?m(ok, reltool_utils:recursive_delete(TargetDir)),
     ?m(ok, file:make_dir(TargetDir)),
     ?m(ok, reltool:create_target([{config, Config}], TargetDir)),
diff --git a/lib/reltool/test/rtt b/lib/reltool/test/rtt
index 2411195338..940bcdf451 100755
--- a/lib/reltool/test/rtt
+++ b/lib/reltool/test/rtt
@@ -23,7 +23,7 @@ while [ $# -gt 0 ]; do
     case "$1" in
 	"-cerl")
 	    shift
-	    emu=cerl
+	    emu="$ERL_TOP/bin/cerl"
 	    ;;
 	*)
 	    break
-- 
cgit v1.2.3