dep_expand: optimize away cpv_expand if possible
authorZac Medico <zmedico@gentoo.org>
Sun, 5 Jun 2011 07:10:17 +0000 (00:10 -0700)
committerZac Medico <zmedico@gentoo.org>
Sun, 5 Jun 2011 07:10:17 +0000 (00:10 -0700)
pym/portage/dbapi/dep_expand.py

index 60e30df87afde63d020f793f7361c374406a46b1..afd8b4f13abd290422696eecbec135efb5c55e75 100644 (file)
@@ -14,14 +14,14 @@ def dep_expand(mydep, mydb=None, use_cache=1, settings=None):
        '''
        @rtype: Atom
        '''
-       if not len(mydep):
-               return mydep
-       if mydep[0]=="*":
-               mydep=mydep[1:]
        orig_dep = mydep
        if isinstance(orig_dep, Atom):
-               mydep = orig_dep.cp
+               has_cat = True
        else:
+               if not mydep:
+                       return mydep
+               if mydep[0] == "*":
+                       mydep = mydep[1:]
                mydep = orig_dep
                has_cat = '/' in orig_dep
                if not has_cat:
@@ -40,8 +40,17 @@ def dep_expand(mydep, mydb=None, use_cache=1, settings=None):
                if not has_cat:
                        null_cat, pn = catsplit(mydep.cp)
                        mydep = pn
-               else:
-                       mydep = mydep.cp
+
+       if has_cat:
+               # Optimize most common cases to avoid calling cpv_expand.
+               if not mydep.cp.startswith("virtual/"):
+                       return mydep
+               if not hasattr(mydb, "cp_list") or \
+                       mydb.cp_list(mydep.cp):
+                       return mydep
+               # Fallback to legacy cpv_expand for old-style PROVIDE virtuals.
+               mydep = mydep.cp
+
        expanded = cpv_expand(mydep, mydb=mydb,
                use_cache=use_cache, settings=settings)
        return Atom(orig_dep.replace(mydep, expanded, 1), allow_repo=True)