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.
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)
'-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':
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()