From patchwork Thu Jan 19 15:49:47 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [bitbake-devel] bitbake/lib/bb/fetch2: Fix stderr handling when running commands Date: Thu, 19 Jan 2012 15:49:47 -0000 From: Adrien Bustany X-Patchwork-Id: 19789 Message-Id: <20120119164907.5BA773E8BA@mail.mymadcat.com> stderr would previously be appended to stdout, corrupting the result when something was outputed to stderr but exit code was still 0 (non-fatal warning messages). This commit makes the code parse only stdout, but output stderr if an error happened. Signed-off-by: Adrien Bustany --- bitbake/lib/bb/fetch2/__init__.py | 35 ++++++++++++++++------------------- 1 files changed, 16 insertions(+), 19 deletions(-) diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py index 374ac9b..c3b22d7 100644 --- a/bitbake/lib/bb/fetch2/__init__.py +++ b/bitbake/lib/bb/fetch2/__init__.py @@ -378,6 +378,9 @@ def runfetchcmd(cmd, d, quiet = False, cleanup = []): Optionally remove the files/directories listed in cleanup upon failure """ + import bb.process + import subprocess + # Need to export PATH as binary could be in metadata paths # rather than host provided # Also include some other variables. @@ -394,33 +397,27 @@ def runfetchcmd(cmd, d, quiet = False, cleanup = []): logger.debug(1, "Running %s", cmd) - # redirect stderr to stdout - stdout_handle = os.popen(cmd + " 2>&1", "r") - output = "" - - while True: - line = stdout_handle.readline() - if not line: - break - if not quiet: - print(line, end=' ') - output += line + success = False + error_message = "" - status = stdout_handle.close() or 0 - signal = status >> 8 - exitstatus = status & 0xff + try: + (output, errors) = bb.process.run(cmd, shell=True, stderr=subprocess.PIPE) + success = True + except bb.process.NotFoundError as e: + error_message = "Fetch command %s" % (e.command) + except bb.process.CmdError as e: + error_message = "Fetch command %s could not be run:\n%s" % (e.command, e.msg) + except bb.process.ExecutionError as e: + error_message = "Fetch command %s failed with exit code %s, output:\n%s" % (e.command, e.exitcode, e.stderr) - if (signal or status != 0): + if not success: for f in cleanup: try: bb.utils.remove(f, True) except OSError: pass - if signal: - raise FetchError("Fetch command %s failed with signal %s, output:\n%s" % (cmd, signal, output)) - elif status != 0: - raise FetchError("Fetch command %s failed with exit code %s, output:\n%s" % (cmd, status, output)) + raise FetchError(error_message) return output