[yum-commits] Branch 'yum-3_2_X' - 5 commits - yum/__init__.py yum/misc.py yum/packageSack.py yum/sqlitesack.py
James Antill
james at osuosl.org
Thu Sep 23 17:08:14 UTC 2010
yum/__init__.py | 5 +++--
yum/misc.py | 18 +++++++++++++++++-
yum/packageSack.py | 36 ++++++++++++++++++++++++++----------
yum/sqlitesack.py | 19 +++++++++++++++----
4 files changed, 61 insertions(+), 17 deletions(-)
New commits:
commit ca04b3ab742aa6fc65707b029891790d46e6cd24
Author: James Antill <james at and.org>
Date: Thu Sep 23 13:05:30 2010 -0400
Use repo_gen_decompress for decompressing the pkgtags.
diff --git a/yum/__init__.py b/yum/__init__.py
index 4a6c279..1cf1f81 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -799,7 +799,8 @@ class YumBase(depsolve.Depsolve):
# fetch the sqlite tagdb
try:
tag_md = repo.retrieveMD('pkgtags')
- tag_sqlite = yum.misc.decompress(tag_md)
+ tag_sqlite = misc.repo_gen_decompress(tag_md,
+ 'pkgtags.sqlite')
# feed it into _tags.add()
self._tags.add(repo.id, tag_sqlite)
except (Errors.RepoError, Errors.PkgTagsError), e:
commit 9ae59676aa787e4e37303b347847af51b20bd590
Author: James Antill <james at and.org>
Date: Thu Sep 23 13:05:00 2010 -0400
Use repo_gen_decompress for decompressing the groupfile.
diff --git a/yum/__init__.py b/yum/__init__.py
index 5c689e5..4a6c279 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -761,7 +761,7 @@ class YumBase(depsolve.Depsolve):
groupfile = repo.getGroups()
# open it up as a file object so iterparse can cope with our compressed file
if groupfile:
- groupfile = misc.decompress(groupfile)
+ groupfile = misc.repo_gen_decompress(groupfile, 'groups.xml')
try:
self._comps.add(groupfile)
commit 8c6e00abb3511aa55dc43fe676d3a99730ac5ab7
Author: James Antill <james at and.org>
Date: Thu Sep 23 13:01:13 2010 -0400
Add repo_gen_decompress() API, for caching decompressions (fixes non-unique).
diff --git a/yum/misc.py b/yum/misc.py
index cf0ff85..4fa5ed9 100644
--- a/yum/misc.py
+++ b/yum/misc.py
@@ -1036,7 +1036,7 @@ def get_uuid(savepath):
return myid
-def decompress(filename, dest=None, fn_only=False):
+def decompress(filename, dest=None, fn_only=False, check_timestamps=False):
"""take a filename and decompress it into the same relative location.
if the file is not compressed just return the file"""
@@ -1067,10 +1067,26 @@ def decompress(filename, dest=None, fn_only=False):
ztype = None
if ztype and not fn_only:
+ if check_timestamps:
+ fi = stat_f(filename)
+ fo = stat_f(out)
+ if fi and fo and fo.st_mtime > fi.st_mtime:
+ return out
+
_decompress_chunked(filename, out, ztype)
return out
+def repo_gen_decompress(filename, generated_name):
+ """ This is a wrapper around decompress, where we work out a cached
+ generated name, and use check_timestamps. filename _must_ be from
+ a repo. and generated_name is the type of the file. """
+ dest = os.path.dirname(filename)
+ dest += '/gen'
+ if not os.path.exists(dest):
+ os.makedirs(dest, mode=0755)
+ dest += '/' + generated_name
+ return decompress(filename, dest=dest, check_timestamps=True)
def read_in_items_from_dot_dir(thisglob, line_as_list=True):
"""takes a glob of a dir (like /etc/foo.d/*.foo)
commit 1df8b7df7c07050ec2654e733daa056b8cd75b56
Author: James Antill <james at and.org>
Date: Fri Sep 17 15:54:08 2010 -0400
Don't convert obsoletes into packages, saves ~40% of runtime on Fedora.
diff --git a/yum/packageSack.py b/yum/packageSack.py
index 3ffaf75..153edbb 100644
--- a/yum/packageSack.py
+++ b/yum/packageSack.py
@@ -444,13 +444,26 @@ class MetaSack(PackageSackBase):
nobsdict = {}
last_name = ''
last_pkg = None
- for pkg in reversed(sorted(self.searchNames(names))):
- if last_name == pkg.name and not pkg.verEQ(last_pkg):
+ # It takes about 0.2 of a second to convert these into packages, just
+ # so we can sort them, which is ~40% of this functions time. So we sort
+ # the pkgtups "by hand".
+ def _pkgtup_nevr_cmp(x, y):
+ """ Compare two pkgtup's (ignore arch): n, a, e, v, r. """
+ ret = cmp(x[0], y[0])
+ if ret: return ret
+ # This is negated so we get higher versions first, in the list.
+ return -compareEVR((x[2], x[3], x[4]), (y[2], y[3], y[4]))
+ def _pkgtup_nevr_eq(x, y):
+ return _pkgtup_nevr_cmp(x, y) == 0
+ for pkgtup in sorted(self.searchNames(names, return_pkgtups=True),
+ cmp=_pkgtup_nevr_cmp):
+ name = pkgtup[0]
+ if last_name == name and not _pkgtup_nevr_eq(last_pkgtup, pkgtup):
continue
- last_name = pkg.name
- last_pkg = pkg
- if pkg.pkgtup in obsdict:
- nobsdict[pkg.pkgtup] = obsdict[pkg.pkgtup]
+ last_name = name
+ last_pkgtup = pkgtup
+ if pkgtup in obsdict:
+ nobsdict[pkgtup] = obsdict[pkgtup]
return nobsdict
def searchFiles(self, name):
commit 438977a89185ae8812b0fd5ebd15e3f56dc08f4a
Author: James Antill <james at and.org>
Date: Fri Sep 17 15:53:23 2010 -0400
Add argument to searchNames() to get it to return pkgtups.
diff --git a/yum/packageSack.py b/yum/packageSack.py
index d822394..3ffaf75 100644
--- a/yum/packageSack.py
+++ b/yum/packageSack.py
@@ -24,6 +24,7 @@ import re
import fnmatch
import misc
from packages import parsePackages
+from rpmUtils.miscutils import compareEVR
class PackageSackVersion:
def __init__(self):
@@ -98,7 +99,7 @@ class PackageSackBase(object):
"""return list of pkgobjects matching the nevra requested"""
raise NotImplementedError()
- def searchNames(self, names=[]):
+ def searchNames(self, names=[], return_pkgtups=False):
raise NotImplementedError()
def searchPO(self, po):
@@ -405,8 +406,8 @@ class MetaSack(PackageSackBase):
"""return list of pkgobjects matching the nevra requested"""
return self._computeAggregateListResult("searchNevra", name, epoch, ver, rel, arch)
- def searchNames(self, names=[]):
- return self._computeAggregateListResult("searchNames", names)
+ def searchNames(self, names=[], return_pkgtups=False):
+ return self._computeAggregateListResult("searchNames", names, return_pkgtups)
def getProvides(self, name, flags=None, version=(None, None, None)):
"""return dict { packages -> list of matching provides }"""
@@ -671,7 +672,7 @@ class PackageSack(PackageSackBase):
result.append(po)
return result
- def searchNames(self, names=[]):
+ def searchNames(self, names=[], return_pkgtups=False):
"""return list of pkgobjects matching the names requested"""
self._checkIndexes(failure='build')
result = []
@@ -681,6 +682,8 @@ class PackageSack(PackageSackBase):
continue
done.add(name)
result.extend(self.nevra.get((name, None, None, None, None), []))
+ if return_pkgtups:
+ return [pkg.pkgtup for pkg in result]
return result
def getProvides(self, name, flags=None, version=(None, None, None)):
diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index 820f003..fb8333f 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -1263,7 +1263,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
return self._search("requires", name, flags, version)
@catchSqliteException
- def searchNames(self, names=[]):
+ def searchNames(self, names=[], return_pkgtups=False):
"""return a list of packages matching any of the given names. This is
only a match on package name, nothing else"""
@@ -1283,6 +1283,8 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
else:
names.append(pkgname)
+ if return_pkgtups:
+ returnList = [pkg.pkgtup for pkg in returnList]
if not names:
return returnList
@@ -1290,7 +1292,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
if len(names) > max_entries:
# Unique is done at user_names time, above.
for names in seq_max_split(names, max_entries):
- returnList.extend(self.searchNames(names))
+ returnList.extend(self.searchNames(names, return_pkgtups))
return returnList
pat_sqls = []
@@ -1304,10 +1306,19 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
cur = cache.cursor()
executeSQL(cur, qsql, names)
+ if return_pkgtups:
+ for ob in cur:
+ pkgtup = self._pkgtupByKeyData(repo, ob['pkgKey'], ob)
+ if pkgtup is None:
+ continue
+ returnList.append(pkgtup)
+ continue
+
self._sql_pkgKey2po(repo, cur, returnList, have_data=True)
- # Mark all the processed pkgnames as fully loaded
- self._pkgnames_loaded.update([name for name in names])
+ if not return_pkgtups:
+ # Mark all the processed pkgnames as fully loaded
+ self._pkgnames_loaded.update([name for name in names])
return returnList
More information about the Yum-commits
mailing list