When processing output from the "depend" phase, use the number of lines as
authorZac Medico <zmedico@gentoo.org>
Fri, 12 Dec 2008 21:29:26 +0000 (21:29 -0000)
committerZac Medico <zmedico@gentoo.org>
Fri, 12 Dec 2008 21:29:26 +0000 (21:29 -0000)
a sanity check so that bash's returncode doesn't have to be trusted.
(trunk r12191)

svn path=/main/branches/2.1.6/; revision=12224

pym/_emerge/__init__.py
pym/portage/__init__.py

index 559894bc68bdb29e8d10084fd8dc835cdd0afc4c..4349459fef5be9473dd711747ea062be58d35bb5 100644 (file)
@@ -2848,17 +2848,26 @@ class EbuildMetadataPhase(SubProcess):
                files = self._files
                self._raw_metadata.append(files.ebuild.read())
                if not self._raw_metadata[-1]:
+                       # Split lines here so they can be counted inside _set_returncode().
+                       self._raw_metadata = "".join(self._raw_metadata).splitlines()
                        self._unregister()
                        self.wait()
 
                        if self.returncode == os.EX_OK:
-                               metadata = izip(portage.auxdbkeys,
-                                       "".join(self._raw_metadata).splitlines())
+                               metadata = izip(portage.auxdbkeys, self._raw_metadata)
                                self.metadata_callback(self.cpv, self.ebuild_path,
                                        self.repo_path, metadata, self.ebuild_mtime)
 
                return self._registered
 
+       def _set_returncode(self, wait_retval):
+               SubProcess._set_returncode(self, wait_retval)
+               if self.returncode == os.EX_OK and \
+                       len(portage.auxdbkeys) != len(self._raw_metadata):
+                       # Don't trust bash's returncode if the
+                       # number of lines is incorrect.
+                       self.returncode = 1
+
 class EbuildProcess(SpawnProcess):
 
        __slots__ = ("phase", "pkg", "settings", "tree")
index ae499bcb26c33aaa8e774be8da01d7986fa77d87..582b6541731876c10cfccb7b01d637c29896077c 100644 (file)
@@ -5494,9 +5494,15 @@ def doebuild(myebuild, mydo, myroot, mysettings, debug=0, listonly=0,
                                # shift in order to distinguish it from a return value. (just
                                # like portage.process.spawn() would do).
                                if retval & 0xff:
-                                       return (retval & 0xff) << 8
-                               # Otherwise, return its exit code.
-                               return retval >> 8
+                                       retval = (retval & 0xff) << 8
+                               else:
+                                       # Otherwise, return its exit code.
+                                       retval = retval >> 8
+                               if retval == os.EX_OK and len(dbkey) != len(auxdbkeys):
+                                       # Don't trust bash's returncode if the
+                                       # number of lines is incorrect.
+                                       retval = 1
+                               return retval
                        elif dbkey:
                                mysettings["dbkey"] = dbkey
                        else: