When transferring cache after sync, compare all metadata to make sure it is identical...
authorZac Medico <zmedico@gentoo.org>
Sat, 4 Nov 2006 05:33:36 +0000 (05:33 -0000)
committerZac Medico <zmedico@gentoo.org>
Sat, 4 Nov 2006 05:33:36 +0000 (05:33 -0000)
svn path=/main/branches/2.1.1/; revision=4930

pym/cache/util.py

index f2f62991c17b694523e67701ff6c279d2a71bf63..2bfaa76fb151c640696b937dc0c61fe97cd0f84b 100644 (file)
@@ -3,6 +3,9 @@
 # License: GPL2
 # $Id$
 
+if not hasattr(__builtins__, "set"):
+       from sets import Set as set
+from itertools import chain
 from cache import cache_errors
 
 def mirror_cache(valid_nodes_iterable, src_cache, trg_cache, eclass_cache=None, verbose_instance=None):
@@ -33,6 +36,7 @@ def mirror_cache(valid_nodes_iterable, src_cache, trg_cache, eclass_cache=None,
                        del e
                        continue
                write_it = True
+               trg = None
                try:
                        trg = trg_cache[x]
                        if long(trg["_mtime_"]) == long(entry["_mtime_"]) and eclass_cache.is_eclass_data_valid(trg["_eclasses_"]):
@@ -40,6 +44,19 @@ def mirror_cache(valid_nodes_iterable, src_cache, trg_cache, eclass_cache=None,
                except (cache_errors.CacheError, KeyError):
                        pass
 
+               if trg and not write_it:
+                       """ We don't want to skip the write unless we're really sure that
+                       the existing cache is identical, so don't trust _mtime_ and
+                       _eclasses_ alone."""
+                       for d in (entry, trg):
+                               if "EAPI" in d and d["EAPI"] in ("", "0"):
+                                       del d["EAPI"]
+                       for k in set(chain(entry, trg)).difference(
+                               ("_mtime_", "_eclasses_")):
+                               if trg.get(k, "") != entry.get(k, ""):
+                                       write_it = True
+                                       break
+
                if write_it:
                        try:
                                inherited = entry.get("INHERITED", None)