[OE-core] [PATCH 1/2] combo-layer: runcmd() with separate output

Paul Eggleton paul.eggleton at linux.intel.com
Thu Mar 12 18:33:09 UTC 2015


On Tuesday 10 March 2015 11:10:48 Patrick Ohly wrote:
> 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.
> 
> Signed-off-by: Patrick Ohly <patrick.ohly at intel.com>
> ---
>  scripts/combo-layer | 18 +++++++++++-------
>  1 file changed, 11 insertions(+), 7 deletions(-)
> 
> diff --git a/scripts/combo-layer b/scripts/combo-layer
> index 5f10e83..fb3fb50 100755
> --- a/scripts/combo-layer
> +++ b/scripts/combo-layer
> @@ -149,23 +149,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)) -    out = os.tmpfile()
> +    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

I'm fine with this change, but FYI unfortunately we have a number of copies of 
this function floating around. We'll probably end up having to do a refactoring 
of these at some point soon.

Cheers,
Paul

-- 

Paul Eggleton
Intel Open Source Technology Centre



More information about the Openembedded-core mailing list