MetadataRegen: call cp_all for each category
authorZac Medico <zmedico@gentoo.org>
Sun, 6 Jan 2013 20:50:28 +0000 (12:50 -0800)
committerZac Medico <zmedico@gentoo.org>
Sun, 6 Jan 2013 20:50:28 +0000 (12:50 -0800)
List categories individually, in order to start yielding quicker,
and in order to reduce latency in case of a signal interrupt.

pym/_emerge/MetadataRegen.py
pym/portage/package/ebuild/_parallel_manifest/ManifestScheduler.py

index 8dc7ebeee887a9713a1bdd864d200993ed7ec3a5..213fc3df9a36a32e77b16e3bd1ad2d28bea23252 100644 (file)
@@ -33,15 +33,16 @@ class MetadataRegen(AsyncScheduler):
                return next(self._process_iter)
 
        def _iter_every_cp(self):
-               portage.writemsg_stdout("Listing available packages...\n")
-               every_cp = self._portdb.cp_all()
-               portage.writemsg_stdout("Regenerating cache entries...\n")
-               every_cp.reverse()
-               try:
-                       while not self._terminated_tasks:
-                               yield every_cp.pop()
-               except IndexError:
-                       pass
+               # List categories individually, in order to start yielding quicker,
+               # and in order to reduce latency in case of a signal interrupt.
+               categories = sorted(self._portdb.settings.categories, reverse=True)
+               cp_all = self._portdb.cp_all
+
+               while categories:
+                       category = categories.pop()
+                       category_cps = cp_all(categories=(category,), reverse=True)
+                       while category_cps:
+                               yield category_cps.pop()
 
        def _iter_metadata_processes(self):
                portdb = self._portdb
@@ -49,6 +50,7 @@ class MetadataRegen(AsyncScheduler):
                cp_set = self._cp_set
                consumer = self._consumer
 
+               portage.writemsg_stdout("Regenerating cache entries...\n")
                for cp in self._cp_iter:
                        if self._terminated.is_set():
                                break
index 50c9c7404314987167520856730d21059f76abc3..8839989a1666fcdb40c9ebb1d260f076895b65fd 100644 (file)
@@ -30,13 +30,16 @@ class ManifestScheduler(AsyncScheduler):
                return next(self._task_iter)
 
        def _iter_every_cp(self):
-               every_cp = self._portdb.cp_all()
-               every_cp.reverse()
-               try:
-                       while not self._terminated_tasks:
-                               yield every_cp.pop()
-               except IndexError:
-                       pass
+               # List categories individually, in order to start yielding quicker,
+               # and in order to reduce latency in case of a signal interrupt.
+               categories = sorted(self._portdb.settings.categories, reverse=True)
+               cp_all = self._portdb.cp_all
+
+               while categories:
+                       category = categories.pop()
+                       category_cps = cp_all(categories=(category,), reverse=True)
+                       while category_cps:
+                               yield category_cps.pop()
 
        def _iter_tasks(self):
                portdb = self._portdb