diff mxtool/mx.py @ 4225:339cf8d4904d

Made mx.run work properly when stderr is redirected to stdout. Made outputparser redirect stderr to stdout. Added copyright headers to outputparser.py and sanitycheck.py. Reverted class path construction in mx.build() to use includeSelf=True to fix regression when running 'mx build -c'.
author Doug Simon <doug.simon@oracle.com>
date Thu, 05 Jan 2012 11:31:46 +0100
parents 47f7d91d34cf
children e03ff10d4bfc
line wrap: on
line diff
--- a/mxtool/mx.py	Wed Jan 04 23:34:15 2012 +0100
+++ b/mxtool/mx.py	Thu Jan 05 11:31:46 2012 +0100
@@ -535,8 +535,8 @@
     Run a command in a subprocess, wait for it to complete and return the exit status of the process.
     If the exit status is non-zero and `nonZeroIsFatal` is true, then mx is exited with
     the same exit status.
-    Each line of the standard output and error streams of the subprocess are redirected to the
-    provided out and err functions if they are not None.
+    Each line of the standard output and error streams of the subprocess are redirected to
+    out and err if they are callable objects.
     """
     
     assert isinstance(args, types.ListType), "'args' must be a list: " + str(args)
@@ -550,19 +550,21 @@
         timeout = _opts.timeout
     
     try:
-        if out is None and err is None and timeout is None:
+        if not callable(out) and not callable(err) and timeout is None:
             retcode = subprocess.call(args, cwd=cwd)
         else:
             def redirect(stream, f):
                 for line in iter(stream.readline, ''):
                     f(line)
                 stream.close()
-            p = subprocess.Popen(args, cwd=cwd, stdout=None if out is None else subprocess.PIPE, stderr=None if err is None else subprocess.PIPE)
-            if out is not None:
+            stdout=out if not callable(out) else subprocess.PIPE
+            stderr=err if not callable(err) else subprocess.PIPE
+            p = subprocess.Popen(args, cwd=cwd, stdout=stdout, stderr=stderr)
+            if callable(out):
                 t = Thread(target=redirect, args=(p.stdout, out))
                 t.daemon = True # thread dies with the program
                 t.start()
-            if err is not None:
+            if callable(err):
                 t = Thread(target=redirect, args=(p.stderr, err))
                 t.daemon = True # thread dies with the program
                 t.start()
@@ -833,7 +835,7 @@
         else:
             os.mkdir(outputDir)
 
-        cp = classpath(p.name, includeSelf=False)
+        cp = classpath(p.name, includeSelf=True)
         sourceDirs = p.source_dirs()
         mustBuild = args.force
         if not mustBuild:
@@ -885,7 +887,7 @@
                                 self.c = 0
                             
                             def eat(self, line):
-                                if 'proprietary API':
+                                if 'proprietary API' in line:
                                     self.c = 2
                                 elif self.c != 0:
                                     self.c -= 1