In BlockerData._load(), salvage as much cache as possible when some
authorZac Medico <zmedico@gentoo.org>
Sun, 4 May 2008 01:05:06 +0000 (01:05 -0000)
committerZac Medico <zmedico@gentoo.org>
Sun, 4 May 2008 01:05:06 +0000 (01:05 -0000)
seems to be corrupt. (trunk r10149)

svn path=/main/branches/2.1.2/; revision=10150

bin/emerge

index 960502e9a8c283cafa32974875774533461617ae..92e321021534edb4703b6ba44dbde74fa7dc2564 100755 (executable)
@@ -1536,37 +1536,48 @@ class BlockerCache(DictMixin):
                if cache_valid:
                        # Validate all the atoms and counters so that
                        # corruption is detected as soon as possible.
+                       invalid_items = set()
                        for k, v in self._cache_data["blockers"].iteritems():
                                if not isinstance(k, basestring):
-                                       cache_valid = False
-                                       break
+                                       invalid_items.add(k)
+                                       continue
                                try:
-                                       portage.catpkgsplit(k)
+                                       if portage.catpkgsplit(k) is None:
+                                               invalid_items.add(k)
+                                               continue
                                except portage_exception.InvalidData:
-                                       cache_valid = False
-                                       break
+                                       invalid_items.add(k)
+                                       continue
                                if not isinstance(v, tuple) or \
                                        len(v) != 2:
-                                       cache_valid = False
-                                       break
+                                       invalid_items.add(k)
+                                       continue
                                counter, atoms = v
                                if not isinstance(counter, (int, long)):
-                                       cache_valid = False
-                                       break
+                                       invalid_items.add(k)
+                                       continue
                                if not isinstance(atoms, list):
-                                       cache_valid = False
-                                       break
+                                       invalid_items.add(k)
+                                       continue
+                               invalid_atom = False
                                for atom in atoms:
                                        if not isinstance(atom, basestring):
-                                               cache_valid = False
+                                               invalid_atom = True
                                                break
                                        if atom[:1] != "!" or \
                                                not portage.isvalidatom(
                                                atom, allow_blockers=True):
-                                               cache_valid = False
+                                               invalid_atom = True
                                                break
-                               if not cache_valid:
-                                       break
+                               if invalid_atom:
+                                       invalid_items.add(k)
+                                       continue
+
+                       for k in invalid_items:
+                               del self._cache_data["blockers"][k]
+                       if not self._cache_data["blockers"]:
+                               cache_valid = False
+
                if not cache_valid:
                        self._cache_data = {"version":self._cache_version}
                        self._cache_data["blockers"] = {}