diff options
author | Patrick Ohly <patrick.ohly@intel.com> | 2016-04-04 15:41:42 +0200 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-04-05 14:33:58 +0100 |
commit | 21e31c277175539a5062e4202a1d500c10e4a512 (patch) | |
tree | 55852b9ea2f8212563b3b997191a18f9b7e79d71 /meta/lib/oe | |
parent | f2d5e20153e001cde257544e5e43998315656bbf (diff) | |
download | poky-21e31c277175539a5062e4202a1d500c10e4a512.tar.gz |
package_manager.py: better error handling in opkg's package listing
opkg does not return a non-zero exit code even if it found
errors. When that happens, parsing the output leads to strange
follow-up errors.
To avoid this we need to check explicitly for non-empty
stderr. Reporting only that on a failure also leads to shorter error
messages (stdout may be very large).
(From OE-Core rev: 7d9e915224a9bc451fddfbbfad533d9b06e9987d)
Signed-off-by: Patrick Ohly <patrick.ohly@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/lib/oe')
-rw-r--r-- | meta/lib/oe/package_manager.py | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py index 0d23d8bc89..b4b359a8c6 100644 --- a/meta/lib/oe/package_manager.py +++ b/meta/lib/oe/package_manager.py | |||
@@ -468,13 +468,16 @@ class OpkgPkgsList(PkgsList): | |||
468 | def list_pkgs(self, format=None): | 468 | def list_pkgs(self, format=None): |
469 | cmd = "%s %s status" % (self.opkg_cmd, self.opkg_args) | 469 | cmd = "%s %s status" % (self.opkg_cmd, self.opkg_args) |
470 | 470 | ||
471 | try: | 471 | # opkg returns success even when it printed some |
472 | # bb.note(cmd) | 472 | # "Collected errors:" report to stderr. Mixing stderr into |
473 | cmd_output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).strip() | 473 | # stdout then leads to random failures later on when |
474 | 474 | # parsing the output. To avoid this we need to collect both | |
475 | except subprocess.CalledProcessError as e: | 475 | # output streams separately and check for empty stderr. |
476 | p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) | ||
477 | cmd_output, cmd_stderr = p.communicate() | ||
478 | if p.returncode or cmd_stderr: | ||
476 | bb.fatal("Cannot get the installed packages list. Command '%s' " | 479 | bb.fatal("Cannot get the installed packages list. Command '%s' " |
477 | "returned %d:\n%s" % (cmd, e.returncode, e.output)) | 480 | "returned %d and stderr:\n%s" % (cmd, p.returncode, cmd_stderr)) |
478 | 481 | ||
479 | return self.opkg_query(cmd_output) | 482 | return self.opkg_query(cmd_output) |
480 | 483 | ||