summaryrefslogtreecommitdiffstats
path: root/pym/_emerge
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2008-05-04 01:04:44 +0000
committerZac Medico <zmedico@gentoo.org>2008-05-04 01:04:44 +0000
commitd880e894c56ee5af2f7e1d53c256b7c102b347f3 (patch)
tree36e93ebd800ccf933b3434a483cd561df438a125 /pym/_emerge
parentdbcaea5cc70745889d6922209b56b8b861565ecd (diff)
downloadportage-d880e894c56ee5af2f7e1d53c256b7c102b347f3.tar.gz
portage-d880e894c56ee5af2f7e1d53c256b7c102b347f3.tar.bz2
portage-d880e894c56ee5af2f7e1d53c256b7c102b347f3.zip
In BlockerData._load(), salvage as much cache as possible when some
seems to be corrupt. svn path=/main/trunk/; revision=10149
Diffstat (limited to 'pym/_emerge')
-rw-r--r--pym/_emerge/__init__.py41
1 files changed, 26 insertions, 15 deletions
diff --git a/pym/_emerge/__init__.py b/pym/_emerge/__init__.py
index 83c9f4da6..b5385f506 100644
--- a/pym/_emerge/__init__.py
+++ b/pym/_emerge/__init__.py
@@ -1395,37 +1395,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"] = {}