portdbapi.xmatch: fix match-all for multi-repo
authorZac Medico <zmedico@gentoo.org>
Fri, 23 Sep 2011 18:19:13 +0000 (11:19 -0700)
committerZac Medico <zmedico@gentoo.org>
Fri, 23 Sep 2011 18:19:13 +0000 (11:19 -0700)
pym/portage/dbapi/porttree.py

index eb7e36a96bce1a905de18253d19b07a61d9ad526..e3fe9a9111e1a5e29264013b004172b25655b4bf 100644 (file)
@@ -853,6 +853,25 @@ class portdbapi(dbapi):
                                myval = match_from_list(mydep,
                                        self.cp_list(mykey, mytree=mytree))
 
+               elif level == "match-all":
+                       # match *all* visible *and* masked packages
+                       if mydep == mykey:
+                               myval = self.cp_list(mykey, mytree=mytree)
+                       elif mydep.repo is not None or len(self.porttrees) == 1:
+                               myval = list(self._iter_match(mydep,
+                                       self.cp_list(mykey, mytree=mytree)))
+                       else:
+                               myval = set()
+                               # We iterate over self.porttrees, since it's common to
+                               # tweak this attribute in order to adjust match behavior.
+                               for tree in self.porttrees:
+                                       repo = self.repositories.get_name_for_location(tree)
+                                       myval.update(self._iter_match(mydep.with_repo(repo),
+                                       self.cp_list(mykey, mytree=mytree)))
+                               myval = list(myval)
+                               if len(myval) > 1:
+                                       self._cpv_sort_ascending(myval)
+
                elif level == "match-visible":
                        # find all visible matches
                        if mydep.repo is not None or len(self.porttrees) == 1:
@@ -969,13 +988,6 @@ class portdbapi(dbapi):
 
                        myval = list(self._iter_match(mydep, mylist))
 
-               elif level == "match-all":
-                       #match *all* visible *and* masked packages
-                       if mydep == mykey:
-                               myval = self.cp_list(mykey, mytree=mytree)
-                       else:
-                               myval = list(self._iter_match(mydep,
-                                       self.cp_list(mykey, mytree=mytree)))
                else:
                        raise AssertionError(
                                "Invalid level argument: '%s'" % level)