in libmozevent/utils.py [0:0]
def hg_run(cmd):
"""
Run a mercurial command without an hglib instance
Useful for initial custom clones
Redirects stdout & stderr to python's logger
"""
def _log_process(output, name):
# Read and display every line
out = output.read()
if out is None:
return
text = filter(None, out.decode("utf-8").splitlines())
for line in text:
log.info("{}: {}".format(name, line))
# Start process
main_cmd = cmd[0]
proc = hglib.util.popen([hglib.HGPATH] + cmd)
# Set process outputs as non blocking
for output in (proc.stdout, proc.stderr):
fcntl.fcntl(
output.fileno(),
fcntl.F_SETFL,
fcntl.fcntl(output, fcntl.F_GETFL) | os.O_NONBLOCK,
)
while proc.poll() is None:
_log_process(proc.stdout, main_cmd)
_log_process(proc.stderr, "{} (err)".format(main_cmd))
time.sleep(2)
out, err = proc.communicate()
if proc.returncode != 0:
log.error(
"Mercurial {} failure".format(main_cmd), out=out, err=err, exc_info=True
)
raise hglib.error.CommandError(cmd, proc.returncode, out, err)
return out