summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2007-10-28 07:26:24 +0000
committerZac Medico <zmedico@gentoo.org>2007-10-28 07:26:24 +0000
commit4ac207ffc70bb84a74d0b11d80864c5cdfa2ad32 (patch)
tree6dae73b638d9c844d6df3d20e69ca74979f28a9d
parent2641d1772d8170f788d6ce8586b1f97a4506f04b (diff)
downloadportage-4ac207ffc70bb84a74d0b11d80864c5cdfa2ad32.tar.gz
portage-4ac207ffc70bb84a74d0b11d80864c5cdfa2ad32.tar.bz2
portage-4ac207ffc70bb84a74d0b11d80864c5cdfa2ad32.zip
Sort all dbapi.cp_list() results in ascending order and
cache the results when possible. The order is preserved in dbapi.match() so those results are also sorted. svn path=/main/trunk/; revision=8329
-rw-r--r--pym/_emerge/__init__.py26
-rw-r--r--pym/portage/dbapi/__init__.py21
-rw-r--r--pym/portage/dbapi/porttree.py12
-rw-r--r--pym/portage/dbapi/vartree.py5
-rw-r--r--pym/portage/dbapi/virtual.py15
5 files changed, 41 insertions, 38 deletions
diff --git a/pym/_emerge/__init__.py b/pym/_emerge/__init__.py
index e5ac45cd5..a5d6f88fc 100644
--- a/pym/_emerge/__init__.py
+++ b/pym/_emerge/__init__.py
@@ -827,23 +827,6 @@ def perform_global_updates(mycpv, mydb, mycommands):
if updates:
mydb.aux_update(mycpv, updates)
-def cpv_sort_descending(cpv_list):
- """Sort in place, returns None."""
- if len(cpv_list) <= 1:
- return
- first_split = portage.catpkgsplit(cpv_list[0])
- cat = first_split[0]
- cpv_list[0] = first_split[1:]
- for i in xrange(1, len(cpv_list)):
- cpv_list[i] = portage.catpkgsplit(cpv_list[i])[1:]
- cpv_list.sort(portage.pkgcmp, reverse=True)
- for i, (pn, ver, rev) in enumerate(cpv_list):
- if rev == "r0":
- cpv = cat + "/" + pn + "-" + ver
- else:
- cpv = cat + "/" + pn + "-" + ver + "-" + rev
- cpv_list[i] = cpv
-
def visible(pkgsettings, cpv, metadata, built=False, installed=False):
"""
Check if a package is visible. This can raise an InvalidDependString
@@ -1873,7 +1856,8 @@ class depgraph(object):
# we have to try all of them to prevent the old-style
# virtuals from overriding available new-styles.
continue
- cpv_sort_descending(cpv_list)
+ # descending order
+ cpv_list.reverse()
for cpv in cpv_list:
if filtered_db.cpv_exists(cpv):
continue
@@ -1984,7 +1968,8 @@ class depgraph(object):
cpv_list = db.xmatch("match-all", atom)
else:
cpv_list = db.match(atom)
- cpv_sort_descending(cpv_list)
+ # descending order
+ cpv_list.reverse()
for cpv in cpv_list:
try:
metadata = dict(izip(db_keys,
@@ -2098,7 +2083,8 @@ class depgraph(object):
cpv_list = db.xmatch("match-all", atom)
else:
cpv_list = db.match(atom)
- cpv_sort_descending(cpv_list)
+ # descending order
+ cpv_list.reverse()
for cpv in cpv_list:
reinstall_for_flags = None
try:
diff --git a/pym/portage/dbapi/__init__.py b/pym/portage/dbapi/__init__.py
index 329271ee6..0bec4cce5 100644
--- a/pym/portage/dbapi/__init__.py
+++ b/pym/portage/dbapi/__init__.py
@@ -9,7 +9,7 @@ from portage.locks import unlockfile
from portage.output import red
from portage.util import writemsg
from portage import dep_expand
-from portage.versions import catsplit
+from portage.versions import catpkgsplit, catsplit, pkgcmp
class dbapi(object):
@@ -22,6 +22,25 @@ class dbapi(object):
def cp_list(self, cp, use_cache=1):
return
+ def _cpv_sort_ascending(self, cpv_list):
+ """
+ Use this to sort self.cp_list() results in ascending
+ order. It sorts in place and returns None.
+ """
+ if len(cpv_list) > 1:
+ first_split = catpkgsplit(cpv_list[0])
+ cat = first_split[0]
+ cpv_list[0] = first_split[1:]
+ for i in xrange(1, len(cpv_list)):
+ cpv_list[i] = catpkgsplit(cpv_list[i])[1:]
+ cpv_list.sort(pkgcmp)
+ for i, (pn, ver, rev) in enumerate(cpv_list):
+ if rev == "r0":
+ cpv = cat + "/" + pn + "-" + ver
+ else:
+ cpv = cat + "/" + pn + "-" + ver + "-" + rev
+ cpv_list[i] = cpv
+
def cpv_all(self):
"""Return all CPVs in the db
Args:
diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py
index 4f9b1cbbe..84f8c196d 100644
--- a/pym/portage/dbapi/porttree.py
+++ b/pym/portage/dbapi/porttree.py
@@ -528,17 +528,7 @@ class portdbapi(dbapi):
mylist = d.keys()
# Always sort in ascending order here since it's handy
# and the result can be easily cached and reused.
- if len(mylist) > 1:
- for i in xrange(len(mylist)):
- mylist[i] = catpkgsplit(mylist[i])[1:]
- mylist.sort(pkgcmp)
- cat = mysplit[0]
- for i, (pn, ver, rev) in enumerate(mylist):
- if rev == "r0":
- cpv = cat + "/" + pn + "-" + ver
- else:
- cpv = cat + "/" + pn + "-" + ver + "-" + rev
- mylist[i] = cpv
+ self._cpv_sort_ascending(mylist)
if self.frozen and mytree is None:
cachelist = mylist[:]
self.xcache["cp-list"][mycp] = cachelist
diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
index 912614615..abc557583 100644
--- a/pym/portage/dbapi/vartree.py
+++ b/pym/portage/dbapi/vartree.py
@@ -343,7 +343,7 @@ class vardbapi(dbapi):
if use_cache and self.cpcache.has_key(mycp):
cpc = self.cpcache[mycp]
if cpc[0] == mystat:
- return cpc[1]
+ return cpc[1][:]
cat_dir = self.getpath(mysplit[0])
try:
dir_list = os.listdir(cat_dir)
@@ -369,7 +369,8 @@ class vardbapi(dbapi):
if ps[0] == mysplit[1]:
returnme.append(mysplit[0]+"/"+x)
if use_cache:
- self.cpcache[mycp] = [mystat,returnme]
+ self._cpv_sort_ascending(returnme)
+ self.cpcache[mycp] = [mystat, returnme[:]]
elif self.cpcache.has_key(mycp):
del self.cpcache[mycp]
return returnme
diff --git a/pym/portage/dbapi/virtual.py b/pym/portage/dbapi/virtual.py
index 65ac0a8d0..52aca6880 100644
--- a/pym/portage/dbapi/virtual.py
+++ b/pym/portage/dbapi/virtual.py
@@ -41,10 +41,17 @@ class fakedbapi(dbapi):
return self.cpvdict.has_key(mycpv)
def cp_list(self, mycp, use_cache=1):
- if not self.cpdict.has_key(mycp):
- return []
- else:
- return self.cpdict[mycp]
+ cachelist = self._match_cache.get(mycp)
+ # cp_list() doesn't expand old-style virtuals
+ if cachelist and cachelist[0].startswith(mycp):
+ return cachelist[:]
+ cpv_list = self.cpdict.get(mycp)
+ if cpv_list is None:
+ cpv_list = []
+ self._cpv_sort_ascending(cpv_list)
+ if not (not cpv_list and mycp.startswith("virtual/")):
+ self._match_cache[mycp] = cpv_list[:]
+ return cpv_list
def cp_all(self):
return list(self.cpdict)