We'd like to avoid downloading prestodelta.xml unconditionally. Trigger it only if the requested package:
1) is an update 2) is installonly pkg 3) have .rpm with same name-arch Also unpack prestodelta.xml on 'yum makecache'. --- yum/drpm.py | 26 +++++++++++++++++++++----- yumcommands.py | 1 + 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/yum/drpm.py b/yum/drpm.py index d3284e9..9f0e109 100644 --- a/yum/drpm.py +++ b/yum/drpm.py @@ -25,7 +25,7 @@ from misc import checksum, repo_gen_decompress from urlgrabber import grabber async = hasattr(grabber, 'parallel_wait') from xml.etree.cElementTree import iterparse -import os +import os, re APPLYDELTA = '/usr/bin/applydeltarpm' @@ -75,11 +75,26 @@ class DeltaInfo: self.limit = ayum.conf.deltarpm # calculate update sizes + oldrpms = {} pinfo = {} reposize = {} for index, po in enumerate(pkgs): if not po.repo.deltarpm: continue + if po.state == TS_UPDATE: pass + elif po.name in ayum.conf.installonlypkgs: pass + else: + names = oldrpms.get(po.repo) + if names is None: + # load all locally cached rpms + names = oldrpms[po.repo] = {} + for rpmfn in os.listdir(po.repo.pkgdir): + m = re.match('^(.+)-(.+)-(.+)\.(.+)\.rpm$', rpmfn) + if m: + n, v, r, a = m.groups() + names.setdefault((n, a), set()).add((v, r)) + if (po.name, po.arch) not in names: + continue pinfo.setdefault(po.repo, {})[po.pkgtup] = index reposize[po.repo] = reposize.get(po.repo, 0) + po.size @@ -131,6 +146,7 @@ class DeltaInfo: if index is not None: po = pkgs[index] best = po.size * (repo.deltarpm_percentage / 100.0) + have = oldrpms.get(repo, {}).get((name, arch), {}) for el in el.findall('delta'): size = int(el.find('size').text) if size >= best: @@ -140,12 +156,12 @@ class DeltaInfo: epoch = el.get('oldepoch') ver = el.get('oldversion') rel = el.get('oldrelease') - if ayum.rpmdb.searchNevra(name, epoch, ver, rel, arch): - oldrpm = None - else: + if (ver, rel) in have: oldrpm = '%s/%s-%s-%s.%s.rpm' % (repo.pkgdir, name, ver, rel, arch) - if not os.access(oldrpm, os.R_OK): + else: + if not ayum.rpmdb.searchNevra(name, epoch, ver, rel, arch): continue + oldrpm = None best = size remote = el.find('filename').text diff --git a/yumcommands.py b/yumcommands.py index 153a0af..2368ba3 100644 --- a/yumcommands.py +++ b/yumcommands.py @@ -1303,6 +1303,7 @@ class MakeCacheCommand(YumCommand): fname_map = {'group_gz' : 'groups.xml', 'pkgtags' : 'pkgtags.sqlite', 'updateinfo' : 'updateinfo.xml', + 'prestodelta': 'prestodelta.xml', } for repo in base.repos.listEnabled(): for MD in repo.repoXML.fileTypes(): -- 1.7.11.7 _______________________________________________ Yum-devel mailing list Yum-devel@lists.baseurl.org http://lists.baseurl.org/mailman/listinfo/yum-devel