Make some confmem behavior modifications in order to try and make it
authorZac Medico <zmedico@gentoo.org>
Thu, 8 May 2008 21:18:01 +0000 (21:18 -0000)
committerZac Medico <zmedico@gentoo.org>
Thu, 8 May 2008 21:18:01 +0000 (21:18 -0000)
less confusing for people who have forgotten about the --noconfmem
option or are completely unaware of it. Thanks to Joe Peterson
<lavajoe@gentoo.org> for suggesting these:

* Always behave like --noconfmem is enabled for downgrades.

* Purge confmem entries when a package is unmerged rather
  than replaced.

svn path=/main/trunk/; revision=10250

pym/portage/dbapi/vartree.py

index abc7916c8e51e0e9775cd2914537c8ab7206951a..e04f861b51f4cc9bca831d2b87920f58b4676431 100644 (file)
@@ -1403,7 +1403,11 @@ class dblink(object):
                                        vartree=self.vartree))
                dest_root = normalize_path(self.vartree.root).rstrip(os.path.sep) + \
                        os.path.sep
-               dest_root_len = len(dest_root)
+               dest_root_len = len(dest_root) - 1
+
+               conf_mem_file = os.path.join(dest_root, CONFIG_MEMORY_FILE)
+               cfgfiledict = grabdict(conf_mem_file)
+               stale_confmem = []
 
                unmerge_orphans = "unmerge-orphans" in self.settings.features
 
@@ -1468,6 +1472,9 @@ class dblink(object):
                                                continue
                                if obj.startswith(dest_root):
                                        relative_path = obj[dest_root_len:]
+                                       if not others_in_slot and \
+                                               relative_path in cfgfiledict:
+                                               stale_confmem.append(relative_path)
                                        is_owned = False
                                        for dblnk in others_in_slot:
                                                if dblnk.isowner(relative_path, dest_root):
@@ -1592,6 +1599,12 @@ class dblink(object):
                                                show_unmerge("---", "!empty", "dir", obj)
                                        del e
 
+               # Remove stale entries from config memory.
+               if stale_confmem:
+                       for filename in stale_confmem:
+                               del cfgfiledict[filename]
+                       writedict(cfgfiledict, conf_mem_file)
+
                #remove self from vartree database so that our own virtual gets zapped if we're the last node
                self.vartree.zap(self.mycpv)
 
@@ -2206,6 +2219,15 @@ class dblink(object):
                else:
                        cfgfiledict["IGNORE"]=0
 
+               # Always behave like --noconfmem is enabled for downgrades
+               # so that people who don't know about this option are less
+               # likely to get confused when doing upgrade/downgrade cycles.
+               pv_split = catpkgsplit(self.mycpv)[1:]
+               for other in others_in_slot:
+                       if pkgcmp(pv_split, catpkgsplit(other.mycpv)[1:]) < 0:
+                               cfgfiledict["IGNORE"] = 1
+                               break
+
                # Don't bump mtimes on merge since some application require
                # preservation of timestamps.  This means that the unmerge phase must
                # check to see if file belongs to an installed instance in the same