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>
This commit is contained in:
parent
f2d5e20153
commit
21e31c2771
|
@ -468,13 +468,16 @@ class OpkgPkgsList(PkgsList):
|
|||
def list_pkgs(self, format=None):
|
||||
cmd = "%s %s status" % (self.opkg_cmd, self.opkg_args)
|
||||
|
||||
try:
|
||||
# bb.note(cmd)
|
||||
cmd_output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).strip()
|
||||
|
||||
except subprocess.CalledProcessError as e:
|
||||
# opkg returns success even when it printed some
|
||||
# "Collected errors:" report to stderr. Mixing stderr into
|
||||
# stdout then leads to random failures later on when
|
||||
# parsing the output. To avoid this we need to collect both
|
||||
# output streams separately and check for empty stderr.
|
||||
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
|
||||
cmd_output, cmd_stderr = p.communicate()
|
||||
if p.returncode or cmd_stderr:
|
||||
bb.fatal("Cannot get the installed packages list. Command '%s' "
|
||||
"returned %d:\n%s" % (cmd, e.returncode, e.output))
|
||||
"returned %d and stderr:\n%s" % (cmd, p.returncode, cmd_stderr))
|
||||
|
||||
return self.opkg_query(cmd_output)
|
||||
|
||||
|
|
Loading…
Reference in New Issue