Add support in MetadataRegen for cleansing stale cache when only a subset
authorZac Medico <zmedico@gentoo.org>
Thu, 30 Apr 2009 06:49:50 +0000 (06:49 -0000)
committerZac Medico <zmedico@gentoo.org>
Thu, 30 Apr 2009 06:49:50 +0000 (06:49 -0000)
of packages are processed. (trunk r13255)

svn path=/main/branches/2.1.6/; revision=13434

pym/_emerge/__init__.py
pym/portage/__init__.py

index 50e4f265bad20ea93bbcf181a085137e3f10da3c..15739d7388166d0cf75ba6f21a5c778c271139eb 100644 (file)
@@ -11564,9 +11564,7 @@ class MetadataRegen(PollScheduler):
                if cp_iter is None:
                        cp_iter = self._iter_every_cp()
                        # We can globally cleanse stale cache only if we
-                       # iterate over every single cp. TODO: Add support
-                       # to cleanse cache for the specific cp values that
-                       # are processed.
+                       # iterate over every single cp.
                        self._global_cleanse = True
                self._cp_iter = cp_iter
 
@@ -11581,6 +11579,7 @@ class MetadataRegen(PollScheduler):
                        unregister=self._unregister)
 
                self._valid_pkgs = set()
+               self._cp_set = set()
                self._process_iter = self._iter_metadata_processes()
                self.returncode = os.EX_OK
                self._error_count = 0
@@ -11597,8 +11596,10 @@ class MetadataRegen(PollScheduler):
        def _iter_metadata_processes(self):
                portdb = self._portdb
                valid_pkgs = self._valid_pkgs
+               cp_set = self._cp_set
 
                for cp in self._cp_iter:
+                       cp_set.add(cp)
                        portage.writemsg_stdout("Processing %s\n" % cp)
                        cpv_list = portdb.cp_list(cp)
                        for cpv in cpv_list:
@@ -11616,6 +11617,12 @@ class MetadataRegen(PollScheduler):
                from portage.cache.cache_errors import CacheError
                dead_nodes = {}
 
+               while self._schedule():
+                       self._poll_loop()
+
+               while self._jobs:
+                       self._poll_loop()
+
                if self._global_cleanse:
                        for mytree in portdb.porttrees:
                                try:
@@ -11627,14 +11634,23 @@ class MetadataRegen(PollScheduler):
                                        del e
                                        dead_nodes = None
                                        break
+               else:
+                       cp_set = self._cp_set
+                       cpv_getkey = portage.cpv_getkey
+                       for mytree in portdb.porttrees:
+                               try:
+                                       dead_nodes[mytree] = set(cpv for cpv in \
+                                               portdb.auxdb[mytree].iterkeys() \
+                                               if cpv_getkey(cpv) in cp_set)
+                               except CacheError, e:
+                                       portage.writemsg("Error listing cache entries for " + \
+                                               "'%s': %s, continuing...\n" % (mytree, e),
+                                               noiselevel=-1)
+                                       del e
+                                       dead_nodes = None
+                                       break
 
-               while self._schedule():
-                       self._poll_loop()
-
-               while self._jobs:
-                       self._poll_loop()
-
-               if self._global_cleanse and dead_nodes:
+               if dead_nodes:
                        for y in self._valid_pkgs:
                                for mytree in portdb.porttrees:
                                        if portdb.findname2(y, mytree=mytree)[0]:
index 1b11fd06fe23950f887ab16ba158d6fbcacd8a29..50974cd76432771726245f154b4431afdf9ce4a2 100644 (file)
@@ -7167,6 +7167,8 @@ def dep_wordreduce(mydeplist,mysettings,mydbapi,mode,use_cache=1):
 def cpv_getkey(mycpv):
        myslash=mycpv.split("/")
        mysplit=pkgsplit(myslash[-1])
+       if mysplit is None:
+               return None
        mylen=len(myslash)
        if mylen==2:
                return myslash[0]+"/"+mysplit[0]