err = ''
reads = None
stop = False
+ out_buffer = '' # partial line (no newline yet)
+ err_buffer = '' # partial line (no newline yet)
while not stop:
if reads and process.poll() is not None:
# we want to stop, but first read off anything remaining
message = message.decode('utf-8')
if fd == process.stdout.fileno():
out += message
- for line in message.splitlines():
+ message = out_buffer + message
+ lines = message.split('\n')
+ out_buffer = lines.pop()
+ for line in lines:
if verbose:
logger.info(desc + ':stdout ' + line)
else:
logger.debug(desc + ':stdout ' + line)
elif fd == process.stderr.fileno():
err += message
- for line in message.splitlines():
+ message = err_buffer + message
+ lines = message.split('\n')
+ err_buffer = lines.pop()
+ for line in lines:
if verbose:
logger.info(desc + ':stderr ' + line)
else:
returncode = process.wait()
+ if out_buffer != '':
+ if verbose:
+ logger.info(desc + ':stdout ' + out_buffer)
+ else:
+ logger.debug(desc + ':stdout ' + out_buffer)
+ if err_buffer != '':
+ if verbose:
+ logger.info(desc + ':stderr ' + err_buffer)
+ else:
+ logger.debug(desc + ':stderr ' + err_buffer)
+
if returncode != 0 and verbose_on_failure and not verbose:
# dump stdout + stderr
logger.info('Non-zero exit code %d from %s' % (returncode, ' '.join(command)))