chiark / gitweb /
Merge branch 'p1' into 'master'
authorDaniel Martí <mvdan@mvdan.cc>
Sun, 28 Feb 2016 13:37:17 +0000 (13:37 +0000)
committerDaniel Martí <mvdan@mvdan.cc>
Sun, 28 Feb 2016 13:37:17 +0000 (13:37 +0000)
Fix pubkey extraction on update

Replacement of !86.

Fix pubkey extraction in case of non-empty _JAVA_OPTIONS. Fixes #133.

I didn't actually run the test suite (it looks like there are some preparations to be done for that), but I checked the commands from `test_fdroid_popen_stderr_redirect` in ipython.

See merge request !103

fdroidserver/common.py
fdroidserver/update.py
tests/common.TestCase

index 36c588d0862781dfc403236f9180d135617a6f8d..0b4c2dd007c3f201cedcb2bdbf309a9a4db9ea79 100644 (file)
@@ -1626,7 +1626,7 @@ def SdkToolsPopen(commands, cwd=None, output=True):
                        cwd=cwd, output=output)
 
 
-def FDroidPopen(commands, cwd=None, output=True):
+def FDroidPopen(commands, cwd=None, output=True, stderr_to_stdout=True):
     """
     Run a command and capture the possibly huge output.
 
@@ -1642,15 +1642,28 @@ def FDroidPopen(commands, cwd=None, output=True):
         logging.debug("Directory: %s" % cwd)
     logging.debug("> %s" % ' '.join(commands))
 
+    stderr_param = subprocess.STDOUT if stderr_to_stdout else subprocess.PIPE
     result = PopenResult()
     p = None
     try:
         p = subprocess.Popen(commands, cwd=cwd, shell=False, env=env,
-                             stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+                             stdout=subprocess.PIPE, stderr=stderr_param)
     except OSError as e:
         raise BuildException("OSError while trying to execute " +
                              ' '.join(commands) + ': ' + str(e))
 
+    if not stderr_to_stdout and options.verbose:
+        stderr_queue = Queue()
+        stderr_reader = AsynchronousFileReader(p.stderr, stderr_queue)
+
+        while not stderr_reader.eof():
+            while not stderr_queue.empty():
+                line = stderr_queue.get()
+                sys.stderr.write(line)
+                sys.stderr.flush()
+
+            time.sleep(0.1)
+
     stdout_queue = Queue()
     stdout_reader = AsynchronousFileReader(p.stdout, stdout_queue)
 
index 67de608daab9fbc9e07aa826b6490faff8195f38..38a61c8b3aae245ff22b135041ade42068217c96 100644 (file)
@@ -726,7 +726,8 @@ def extract_pubkey():
                          '-alias', config['repo_keyalias'],
                          '-keystore', config['keystore'],
                          '-storepass:file', config['keystorepassfile']]
-                        + config['smartcardoptions'], output=False)
+                        + config['smartcardoptions'],
+                        output=False, stderr_to_stdout=False)
         if p.returncode != 0 or len(p.output) < 20:
             msg = "Failed to get repo pubkey!"
             if config['keystore'] == 'NONE':
index d34569995509c1024dbfd269a9e3178dbc3dd50b..32e7af7f468c38bf7d7a3e8b71b9426ff4bde610 100755 (executable)
@@ -149,6 +149,14 @@ class CommonTest(unittest.TestCase):
         self.assertIsNotNone(re.search('android:versionName="%s"' % build.version, filedata))
         self.assertIsNotNone(re.search('android:versionCode="%s"' % build.vercode, filedata))
 
+    def test_fdroid_popen_stderr_redirect(self):
+        commands = ['sh', '-c', 'echo stdout message && echo stderr message 1>&2']
+
+        p = fdroidserver.common.FDroidPopen(commands)
+        self.assertEqual(p.output, 'stdout message\nstderr message\n')
+
+        p = fdroidserver.common.FDroidPopen(commands, stderr_to_stdout=False)
+        self.assertEqual(p.output, 'stdout message\n')
 
 if __name__ == "__main__":
     parser = optparse.OptionParser()