Speed depsolving up by providing pre-computed pkg_refs.

Requires: yum >= 3.4.3-28
This commit is contained in:
Daniel Mach 2012-09-25 22:47:14 +02:00 committed by Dennis Gilmore
parent 50c1d46c7e
commit dd6a68eb7c
1 changed files with 18 additions and 14 deletions

View File

@ -457,6 +457,10 @@ class Pungi(pypungi.PungiBase):
matchdict = {} # A dict of objects to names
excludeGroups = [] #A list of groups for removal defined in the ks file
# precompute pkgs and pkg_refs to speed things up
self.pkgs = self.ayum.pkgSack.returnPackages()
self.pkg_refs = yum.packages.buildPkgRefDict(self.pkgs, casematch=True)
# First remove the excludes
self.ayum.excludePackages()
@ -489,7 +493,7 @@ class Pungi(pypungi.PungiBase):
if self.config.getboolean('pungi', 'alldeps'):
# greedy
# Search repos for things in our searchlist, supports globs
(exactmatched, matched, unmatched) = yum.packages.parsePackages(self.ayum.pkgSack.returnPackages(), searchlist, casematch=1)
(exactmatched, matched, unmatched) = yum.packages.parsePackages(self.pkgs, searchlist, casematch=1, pkgdict=self.pkg_refs.copy())
matches = filter(self._filtersrcdebug, exactmatched + matched)
matches = self.excludePackages(matches)
@ -509,22 +513,22 @@ class Pungi(pypungi.PungiBase):
else:
# nogreedy
for name in searchlist:
arch = None
if "." in name:
name, arch = name.rsplit(".", 1)
exactmatched, matched, unmatched = yum.packages.parsePackages(self.pkgs, [name], casematch=1, pkgdict=self.pkg_refs.copy())
matches = filter(self._filtersrcdebug, exactmatched + matched)
pkg_sack = self.ayum.pkgSack.searchNevra(name=name, arch=arch)
# filter sources out of the package sack
pkg_sack = [ i for i in pkg_sack if i.arch not in ("src", "nosrc") ]
pkg_sack = self.excludePackages(pkg_sack)
match = self.ayum._bestPackageFromList(pkg_sack)
if not match:
if not matches:
self.logger.warn('Could not find a match for %s in any configured repo' % name)
continue
self.ayum.tsInfo.addInstall(match)
self.logger.info('Found %s.%s' % (match.name, match.arch))
packages_by_name = {}
for i in matches:
packages_by_name.setdefault(i.name, []).append(i)
for i, pkg_sack in packages_by_name.iteritems():
pkg_sack = self.excludePackages(pkg_sack)
match = self.ayum._bestPackageFromList(pkg_sack)
self.ayum.tsInfo.addInstall(match)
self.logger.info('Found %s.%s' % (match.name, match.arch))
if len(self.ayum.tsInfo) == 0:
raise yum.Errors.MiscError, 'No packages found to download.'
@ -561,7 +565,7 @@ class Pungi(pypungi.PungiBase):
self.src_by_bin = {}
self.bin_by_src = {}
self.logger.info("Generating source <-> binary package mappings")
(dummy1, everything, dummy2) = yum.packages.parsePackages(self.ayum.pkgSack.returnPackages(), ['*'])
(dummy1, everything, dummy2) = yum.packages.parsePackages(self.pkgs, ['*'], pkgdict=self.pkg_refs.copy())
for po in everything:
if po.arch == 'src':
continue