[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