combo-layer: runcmd() with separate output
Allow the caller to specify a separate output stream. stderr is always a temporary file opened by runcmd(), so read from that to capture output for error reporting *and* the return value. The reasoning for the latter is a) that this preserves the traditional behavior when out=None and b) if the caller wants the content of stdout, it can read from the stream itself, which is not possible for the temporary stderr. (From OE-Core rev: a084162a9dc4718ab453723f1f28aefc55100e2e) Signed-off-by: Patrick Ohly <patrick.ohly@intel.com> Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
58c5bb28b5
commit
627e524238
|
@ -152,23 +152,27 @@ class Configuration(object):
|
|||
logger.error("ERROR: patchutils package is missing, please install it (e.g. # apt-get install patchutils)")
|
||||
sys.exit(1)
|
||||
|
||||
def runcmd(cmd,destdir=None,printerr=True):
|
||||
def runcmd(cmd,destdir=None,printerr=True,out=None):
|
||||
"""
|
||||
execute command, raise CalledProcessError if fail
|
||||
return output if succeed
|
||||
"""
|
||||
logger.debug("run cmd '%s' in %s" % (cmd, os.getcwd() if destdir is None else destdir))
|
||||
if not out:
|
||||
out = os.tmpfile()
|
||||
err = out
|
||||
else:
|
||||
err = os.tmpfile()
|
||||
try:
|
||||
subprocess.check_call(cmd, stdout=out, stderr=out, cwd=destdir, shell=True)
|
||||
subprocess.check_call(cmd, stdout=out, stderr=err, cwd=destdir, shell=isinstance(cmd, str))
|
||||
except subprocess.CalledProcessError,e:
|
||||
out.seek(0)
|
||||
err.seek(0)
|
||||
if printerr:
|
||||
logger.error("%s" % out.read())
|
||||
logger.error("%s" % err.read())
|
||||
raise e
|
||||
|
||||
out.seek(0)
|
||||
output = out.read()
|
||||
err.seek(0)
|
||||
output = err.read()
|
||||
logger.debug("output: %s" % output )
|
||||
return output
|
||||
|
||||
|
|
Loading…
Reference in New Issue