def serialize_eclasses(eclass_dict):
"""takes a dict, returns a string representing said dict"""
- return "\t".join(["%s\t%s\t%s" % (k, v[0], str(v[1])) for k,v in eclass_dict.items()])
+ return "\t".join(["%s\t%s" % (k, str(v)) \
+ for k, v in eclass_dict.iteritems()])
def reconstruct_eclasses(cpv, eclass_string):
"""returns a dict when handed a string generated by serialize_eclasses"""
if eclasses == [""]:
# occasionally this occurs in the fs backends. they suck.
return {}
- if len(eclasses) % 3 != 0:
+
+ if len(eclasses) % 2 != 0 and len(eclasses) % 3 != 0:
raise cache_errors.CacheCorruption(cpv, "_eclasses_ was of invalid len %i" % len(eclasses))
d={}
- for x in range(0, len(eclasses), 3):
- d[eclasses[x]] = (eclasses[x + 1], long(eclasses[x + 2]))
+ has_paths = False
+ try:
+ long(eclasses[1])
+ except ValueError:
+ has_paths = True
+ if has_paths:
+ for x in range(0, len(eclasses), 3):
+ d[eclasses[x]] = long(eclasses[x + 2])
+ else:
+ for x in range(0, len(eclasses), 2):
+ d[eclasses[x]] = long(eclasses[x + 1])
del eclasses
return d
self.porttree_root = porttree_root
self.eclasses = {} # {"Name": ("location","_mtime_")}
+ self._eclass_locations = {}
# screw with the porttree ordering, w/out having bash inherit match it, and I'll hurt you.
# ~harring
def update_eclasses(self):
self.eclasses = {}
+ self._eclass_locations = {}
eclass_len = len(".eclass")
for x in [normalize_path(os.path.join(y,"eclass")) for y in self.porttrees]:
if not os.path.isdir(x):
except OSError:
continue
ys=y[:-eclass_len]
- self.eclasses[ys] = (x, long(mtime))
+ self.eclasses[ys] = long(mtime)
+ self._eclass_locations[ys] = x
def is_eclass_data_valid(self, ec_dict):
if not isinstance(ec_dict, dict):
return False
- for eclass, tup in ec_dict.iteritems():
- if eclass not in self.eclasses or tuple(tup) != self.eclasses[eclass]:
+ for eclass, mtime in ec_dict.iteritems():
+ if eclass not in self.eclasses or mtime != self.eclasses[eclass]:
return False
return True
print "ec=",ec_dict
print "inherits=",inherits
raise
- if from_master_only and self.eclasses[x][0] != self._master_eclass_root:
+ if from_master_only and \
+ self._eclass_locations[x] != self._master_eclass_root:
return None
return ec_dict