diff options
author | Zac Medico <zmedico@gentoo.org> | 2008-08-01 04:13:23 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2008-08-01 04:13:23 +0000 |
commit | ce4847e2e7db79f23f662115d2b070b596e0118e (patch) | |
tree | 302c8a6d00ab2d24f54866ec9de9fb06f7c89deb /bin | |
parent | b04b06a4184b3355f87f8436cc2a96dbff302d54 (diff) | |
download | portage-ce4847e2e7db79f23f662115d2b070b596e0118e.tar.gz portage-ce4847e2e7db79f23f662115d2b070b596e0118e.tar.bz2 portage-ce4847e2e7db79f23f662115d2b070b596e0118e.zip |
Optimize `emaint` --fix binhost so that it the Packages file isn't re-read
and re-written for each package that's updated. Instead, hold a lock for
the whole time the command is running and just update it once.
svn path=/main/trunk/; revision=11307
Diffstat (limited to 'bin')
-rwxr-xr-x | bin/emaint | 60 |
1 files changed, 45 insertions, 15 deletions
diff --git a/bin/emaint b/bin/emaint index b9b7a6676..561d26719 100755 --- a/bin/emaint +++ b/bin/emaint @@ -112,8 +112,7 @@ class BinhostHandler(object): self._bintree = portage.db[myroot]["bintree"] self._bintree.populate() self._pkgindex_file = os.path.join(self._bintree.pkgdir, "Packages") - from portage import getbinpkg - self._pkgindex = getbinpkg.PackageIndex() + self._pkgindex = self._bintree._new_pkgindex() f = open(self._pkgindex_file, 'r') try: self._pkgindex.read(f) @@ -149,7 +148,7 @@ class BinhostHandler(object): cpv_all = self._bintree.dbapi.cpv_all() cpv_all.sort() missing = [] - maxval = len(cpv_all) + maxval = 0 if onProgress: onProgress(maxval, 0) pkgindex = self._pkgindex @@ -157,35 +156,61 @@ class BinhostHandler(object): metadata = {} for d in pkgindex.packages: metadata[d["CPV"]] = d + for i, cpv in enumerate(cpv_all): d = metadata.get(cpv) if not d or "MD5" not in d: - bintree.inject(cpv) - if onProgress: - onProgress(maxval, i+1) + missing.append(cpv) + stale = set(metadata).difference(cpv_all) - if stale: + if missing or stale: from portage import locks pkgindex_lock = locks.lockfile( self._pkgindex_file, wantnewlockfile=1) try: - from portage import getbinpkg - pkgindex = getbinpkg.PackageIndex() + # Repopulate with lock held. + bintree._populate() + cpv_all = self._bintree.dbapi.cpv_all() + cpv_all.sort() + + pkgindex = bintree._new_pkgindex() self._pkgindex = pkgindex f = open(self._pkgindex_file, 'r') try: self._pkgindex.read(f) finally: f.close() - from portage.dbapi.bintree import binarytree - self._bintree = binarytree(bintree.root, bintree.pkgdir, - settings=bintree.settings) - del bintree - portage.db[self._bintree.root]["bintree"] = self._bintree - self._bintree._populate() + + metadata = {} + for d in pkgindex.packages: + metadata[d["CPV"]] = d + + # Recount missing packages, with lock held. + del missing[:] + for i, cpv in enumerate(cpv_all): + d = metadata.get(cpv) + if not d or "MD5" not in d: + missing.append(cpv) + + maxval = len(missing) + for i, cpv in enumerate(missing): + try: + metadata[cpv] = bintree._pkgindex_entry(cpv) + except portage.exception.InvalidDependString: + writemsg("!!! Invalid binary package: '%s'\n" % \ + bintree.getname(cpv), noiselevel=-1) + + if onProgress: + onProgress(maxval, i+1) + for cpv in set(metadata).difference( self._bintree.dbapi.cpv_all()): del metadata[cpv] + + # We've updated the pkgindex, so set it to + # repopulate when necessary. + bintree.populated = False + del pkgindex.packages[:] pkgindex.packages.extend(metadata.itervalues()) from portage.util import atomic_ofstream @@ -196,6 +221,11 @@ class BinhostHandler(object): f.close() finally: locks.unlockfile(pkgindex_lock) + + if onProgress: + if maxval == 0: + maxval = 1 + onProgress(maxval, maxval) return None class MoveHandler(object): |