pactest: improve speed of local DB dependent rules

We were doing some really silly stuff before and abusing the os.walk()
call, having to walk the entire local database for every single PKG
rule. We really only need top level directories, and we can cache any
generated package since calls to db_read() are well-defined and only
happen in one place.

This speeds up the running of tests that may want to add 100 PKG_VERSION
rules at once, where before we had to limit how many we used in order to
not put a serious cramp in the speed of the test suite run.

Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Dan McGee 2011-08-08 23:32:19 -05:00
parent 5f38660be1
commit 9d3d647f00

View file

@ -58,6 +58,8 @@ class pmdb(object):
self.dbdir = os.path.join(root, util.PM_DBPATH, treename) self.dbdir = os.path.join(root, util.PM_DBPATH, treename)
self.dbfile = None self.dbfile = None
self.is_local = True self.is_local = True
self.read_dircache = None
self.read_pkgcache = {}
else: else:
self.dbdir = None self.dbdir = None
self.dbfile = os.path.join(root, util.PM_SYNCDBPATH, treename + ".db") self.dbfile = os.path.join(root, util.PM_SYNCDBPATH, treename + ".db")
@ -81,20 +83,24 @@ class pmdb(object):
if not self.dbdir or not os.path.isdir(self.dbdir): if not self.dbdir or not os.path.isdir(self.dbdir):
return None return None
dbentry = "" dbentry = None
for roots, dirs, files in os.walk(self.dbdir): if self.read_dircache is None:
for i in dirs: self.read_dircache = os.listdir(self.dbdir)
[pkgname, pkgver, pkgrel] = i.rsplit("-", 2) for entry in self.read_dircache:
[pkgname, pkgver, pkgrel] = entry.rsplit("-", 2)
if pkgname == name: if pkgname == name:
dbentry = i dbentry = entry
break break
if not dbentry: if dbentry is None:
return None return None
path = os.path.join(self.dbdir, dbentry)
[pkgname, pkgver, pkgrel] = dbentry.rsplit("-", 2) if pkgname in self.read_pkgcache:
return self.read_pkgcache[pkgname]
pkg = pmpkg.pmpkg(pkgname, pkgver + "-" + pkgrel) pkg = pmpkg.pmpkg(pkgname, pkgver + "-" + pkgrel)
self.read_pkgcache[pkgname] = pkg
path = os.path.join(self.dbdir, dbentry)
# desc # desc
filename = os.path.join(path, "desc") filename = os.path.join(path, "desc")
if not os.path.isfile(filename): if not os.path.isfile(filename):