tests: tests.sh detects directories before trying to execute them
[nit.git] / src / toolcontext.nit
index 3e99de2..62c184a 100644 (file)
@@ -102,6 +102,9 @@ class ToolContext
        # Directory where to generate log files
        var log_directory: String = "logs"
 
+       # Stream in `log_directory` where all info messages are written
+       var log_info: nullable Writer = null
+
        # Messages
        private var messages = new Array[Message]
        private var message_sorter: Comparator = default_comparator
@@ -236,34 +239,40 @@ class ToolContext
                if level <= verbose_level then
                        print "{s}"
                end
+               if log_info != null then
+                       log_info.write s
+                       log_info.write "\n"
+               end
        end
 
        # Executes a program while checking if it's available and if the execution ended correctly
        #
        # Stops execution and prints errors if the program isn't available or didn't end correctly
        fun exec_and_check(args: Array[String], error: String)
-        do
-                var prog = args.first
-                args.remove_at 0
-
-                # Is the wanted program available?
-                var proc_which = new IProcess.from_a("which", [prog])
-                proc_which.wait
-                var res = proc_which.status
-                if res != 0 then
-                        print "{error}: executable \"{prog}\" not found"
-                        exit 1
-                end
-
-                # Execute the wanted program
-                var proc = new Process.from_a(prog, args)
-                proc.wait
-                res = proc.status
-                if res != 0 then
-                        print "{error}: execution of \"{prog} {args.join(" ")}\" failed"
-                        exit 1
-                end
-        end
+       do
+               info("+ {args.join(" ")}", 2)
+
+               var prog = args.first
+               args.remove_at 0
+
+               # Is the wanted program available?
+               var proc_which = new ProcessReader.from_a("which", [prog])
+               proc_which.wait
+               var res = proc_which.status
+               if res != 0 then
+                       print "{error}: executable \"{prog}\" not found"
+                       exit 1
+               end
+
+               # Execute the wanted program
+               var proc = new Process.from_a(prog, args)
+               proc.wait
+               res = proc.status
+               if res != 0 then
+                       print "{error}: execution of \"{prog} {args.join(" ")}\" failed"
+                       exit 1
+               end
+       end
 
        # Global OptionContext
        var option_context = new OptionContext
@@ -427,8 +436,10 @@ The Nit language documentation and the source code of its tools and libraries ma
                if opt_log.value then
                        # Make sure the output directory exists
                        log_directory.mkdir
-               end
 
+                       # Redirect the verbose messages
+                       log_info = (log_directory/"info.txt").to_path.open_wo
+               end
        end
 
        # Get the current `nit_version` or "DUMMY_VERSION" if `--set-dummy-tool` is set.