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
[email protected]
http://lists.baseurl.org/mailman/listinfo/yum-devel