in hack/release/wizard/releaseWizard.py [0:0]
def run_follow(command, cwd=None, fh=sys.stdout, tee=False, live=False, shell=None, env=None):
doShell = '&&' in command or '&' in command or shell is not None
if not doShell and not isinstance(command, list):
command = shlex.split(command)
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd,
universal_newlines=True, bufsize=0, close_fds=True, shell=doShell, env=env)
lines_written = 0
fl = fcntl.fcntl(process.stdout, fcntl.F_GETFL)
fcntl.fcntl(process.stdout, fcntl.F_SETFL, fl | os.O_NONBLOCK)
flerr = fcntl.fcntl(process.stderr, fcntl.F_GETFL)
fcntl.fcntl(process.stderr, fcntl.F_SETFL, flerr | os.O_NONBLOCK)
endstdout = endstderr = False
errlines = []
while not (endstderr and endstdout):
lines_before = lines_written
if not endstdout:
try:
if live:
chars = process.stdout.read()
if chars == '' and process.poll() is not None:
endstdout = True
else:
fh.write(chars)
fh.flush()
if '\n' in chars:
lines_written += 1
else:
line = process.stdout.readline()
if line == '' and process.poll() is not None:
endstdout = True
else:
fh.write("%s\n" % line.rstrip())
fh.flush()
lines_written += 1
print_line_cr(line, lines_written, stdout=(fh == sys.stdout), tee=tee)
except Exception as ioe:
pass
if not endstderr:
try:
if live:
chars = process.stderr.read()
if chars == '' and process.poll() is not None:
endstderr = True
else:
fh.write(chars)
fh.flush()
if '\n' in chars:
lines_written += 1
else:
line = process.stderr.readline()
if line == '' and process.poll() is not None:
endstderr = True
else:
errlines.append("%s\n" % line.rstrip())
lines_written += 1
print_line_cr(line, lines_written, stdout=(fh == sys.stdout), tee=tee)
except Exception as e:
pass
if not lines_written > lines_before:
# if no output then sleep a bit before checking again
time.sleep(0.1)
print(" " * 80)
rc = process.poll()
if len(errlines) > 0:
for line in errlines:
fh.write("%s\n" % line.rstrip())
fh.flush()
return rc