From: Daniel Martí Date: Sun, 28 Feb 2016 13:37:17 +0000 (+0000) Subject: Merge branch 'p1' into 'master' X-Git-Tag: 0.7.0~98 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=bf3247743344edf676a51c568cc35f6f0bdc95e5;hp=9f95c0bbdb48a552606a5f6e3826d0d044a7ab02;p=fdroidserver.git Merge branch 'p1' into 'master' 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 --- diff --git a/fdroidserver/common.py b/fdroidserver/common.py index 36c588d0..0b4c2dd0 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -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) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 67de608d..38a61c8b 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -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': diff --git a/tests/common.TestCase b/tests/common.TestCase index d3456999..32e7af7f 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -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()