[yum-git] 5 commits - yum/__init__.py yum/misc.py yum/packageSack.py yum/packages.py yum/rpmsack.py yum/sqlitesack.py yum/yumRepo.py

James Antill james at linux.duke.edu
Wed Mar 26 14:08:50 UTC 2008


 yum/__init__.py    |    4 +++-
 yum/misc.py        |    5 +++++
 yum/packageSack.py |    3 ++-
 yum/packages.py    |   31 ++++++++++++++++++-------------
 yum/rpmsack.py     |    8 ++++++++
 yum/sqlitesack.py  |   12 +++++-------
 yum/yumRepo.py     |    1 +
 7 files changed, 42 insertions(+), 22 deletions(-)

New commits:
commit c81a339b7c861954f69c5f991b029cb6dd60f1bb
Author: James Antill <james at and.org>
Date:   Wed Mar 26 10:08:32 2008 -0400

    Warn users when their MD is being updated

diff --git a/yum/yumRepo.py b/yum/yumRepo.py
index 1ec69ea..22fcde3 100644
--- a/yum/yumRepo.py
+++ b/yum/yumRepo.py
@@ -878,6 +878,7 @@ class YumRepository(Repository, config.RepoConf):
             if omdtype == nmdtype and olddata.checksum == newdata.checksum:
                 continue
             if olddata.timestamp > newdata.timestamp:
+                logger.warning(_("Not using downloaded repomd.xml because it is older than what we have"))
                 return False
         return True
 
commit ae78446d9d6f275e70bf1aaf1fbc507e56b09aa1
Author: James Antill <james at and.org>
Date:   Tue Mar 25 20:53:14 2008 -0400

    Generalize sqlite's share_data, saves 9MB 5% RSS on Fed-8 => rawhide

diff --git a/yum/misc.py b/yum/misc.py
index 9447f90..44f85d4 100644
--- a/yum/misc.py
+++ b/yum/misc.py
@@ -20,6 +20,11 @@ import gpgme
 
 from Errors import MiscError
 
+_share_data_store = {}
+def share_data(value):
+    """ Take a value and use the same value from the store,
+        if the value isn't in the store this one becomes the shared version. """
+    return _share_data_store.setdefault(value, value)
 
 _re_compiled_glob_match = None
 def re_glob(s):
diff --git a/yum/packages.py b/yum/packages.py
index 6246c2a..1606e93 100644
--- a/yum/packages.py
+++ b/yum/packages.py
@@ -705,16 +705,16 @@ class YumHeaderPackage(YumAvailablePackage):
         YumAvailablePackage.__init__(self, repo)
 
         self.hdr = hdr
-        self.name = self.hdr['name']
-        self.arch = self.hdr['arch']
-        self.epoch = self.doepoch()
-        self.version = self.hdr['version']
-        self.release = self.hdr['release']
+        self.name = misc.share_data(self.hdr['name'])
+        self.arch = misc.share_data(self.hdr['arch'])
+        self.epoch = misc.share_data(self.doepoch())
+        self.version = misc.share_data(self.hdr['version'])
+        self.release = misc.share_data(self.hdr['release'])
         self.ver = self.version
         self.rel = self.release
         self.pkgtup = (self.name, self.arch, self.epoch, self.version, self.release)
-        self.summary = self.hdr['summary'].replace('\n', '')
-        self.description = self.hdr['description']
+        self.summary = misc.share_data(self.hdr['summary'].replace('\n', ''))
+        self.description = misc.share_data(self.hdr['description'])
         self.pkgid = self.hdr[rpm.RPMTAG_SHA1HEADER]
         if not self.pkgid:
             self.pkgid = "%s.%s" %(self.hdr['name'], self.hdr['buildtime'])
@@ -743,23 +743,28 @@ class YumHeaderPackage(YumAvailablePackage):
     def _populatePrco(self):
         "Populate the package object with the needed PRCO interface."
 
-        tag2prco = { "OBSOLETE": "obsoletes",
-                     "CONFLICT": "conflicts",
-                     "REQUIRE": "requires",
-                     "PROVIDE": "provides" }
+        tag2prco = { "OBSOLETE": misc.share_data("obsoletes"),
+                     "CONFLICT": misc.share_data("conflicts"),
+                     "REQUIRE":  misc.share_data("requires"),
+                     "PROVIDE":  misc.share_data("provides") }
         hdr = self._get_hdr()
         for tag in tag2prco:
             name = hdr[getattr(rpm, 'RPMTAG_%sNAME' % tag)]
+            name = map(misc.share_data, name)
+            if name is None:
+                continue
 
             lst = hdr[getattr(rpm, 'RPMTAG_%sFLAGS' % tag)]
             flag = map(rpmUtils.miscutils.flagToString, lst)
+            flag = map(misc.share_data, flag)
 
             lst = hdr[getattr(rpm, 'RPMTAG_%sVERSION' % tag)]
             vers = map(rpmUtils.miscutils.stringToVersion, lst)
+            vers = map(lambda x: (misc.share_data(x[0]), misc.share_data(x[1]),
+                                  misc.share_data(x[2])), vers)
 
             prcotype = tag2prco[tag]
-            if name is not None:
-                self.prco[prcotype] = zip(name, flag, vers)
+            self.prco[prcotype] = map(misc.share_data, zip(name,flag,vers))
     
     def tagByName(self, tag):
         warnings.warn("tagByName() will go away in a furture version of Yum.\n",
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index 3ebb246..3c82723 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -120,6 +120,7 @@ class RPMDBPackageSack(PackageSackBase):
         self._tup2pkg = {}
         self._completely_loaded = False
         self._simple_pkgtup_list = []
+        misc._share_data_store = {}
 
     def readOnlyTS(self):
         if not self.ts:
diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index a58c8f0..be34cdc 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -45,11 +45,8 @@ def catchSqliteException(func):
     newFunc.__dict__.update(func.__dict__)
     return newFunc
 
-_store = {}
 def _share_data(value):
-    """ Take a value and use the same value from the store,
-        if the value isn't in the store this one becomes the shared version. """
-    return _store.setdefault(value, value)
+    return misc.share_data(value)
 
 class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase):
     def __init__(self, repo, db_obj):
@@ -137,7 +134,9 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase):
                          (self.pkgId,)).fetchone()
         value = r[0]
         if varname in {'vendor' : 1, 'packager' : 1, 'buildhost' : 1,
-                       'license' : 1, 'group' : 1}:
+                       'license' : 1, 'group' : 1,
+                       'summary' : 1, 'description' : 1, 'sourcerpm' : 1,
+                       'url' : 1}:
             value  = _share_data(value)
         setattr(self, varname, value)
             
@@ -296,8 +295,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
             'provides' : { },
             'requires' : { },
             }
-        global _store
-        _store = {}
+        misc._share_data_store = {}
 
     @catchSqliteException
     def close(self):
commit e3215be149c97aa7207d6e829b5d3b220b7697e6
Author: James Antill <james at and.org>
Date:   Tue Mar 25 20:38:10 2008 -0400

    Drop caches from rpmsack too

diff --git a/yum/__init__.py b/yum/__init__.py
index 6d810c7..cba31e7 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -626,6 +626,8 @@ class YumBase(depsolve.Depsolve):
         if self.tsInfo.changed:
             (rescode, restring) = self.resolveDeps()
         self.tsInfo.pkgSack.dropCachedData()
+        self.pkgSack.dropCachedData()
+        self.rpmdb.dropCachedData()
 
         # if depsolve failed and skipbroken is enabled
         # The remove the broken packages from the transactions and
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index 3a24f2f..3ebb246 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -114,6 +114,13 @@ class RPMDBPackageSack(PackageSackBase):
 
     pkglist = property(_get_pkglist, None)
 
+    def dropCachedData(self):
+        self._idx2pkg = {}
+        self._name2pkg = {}
+        self._tup2pkg = {}
+        self._completely_loaded = False
+        self._simple_pkgtup_list = []
+
     def readOnlyTS(self):
         if not self.ts:
             self.ts =  initReadOnlyTransaction(root=self.root)
commit cdbc27a30326f5cbeda778d52dc52276071f91f7
Author: James Antill <james at and.org>
Date:   Tue Mar 25 20:13:55 2008 -0400

    Might as well make list extras faster too :)

diff --git a/yum/__init__.py b/yum/__init__.py
index bf1791a..6d810c7 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -1357,7 +1357,7 @@ class YumBase(depsolve.Depsolve):
             # we must compare the installed set versus the repo set
             # anything installed but not in a repo is an extra
             avail = self.pkgSack.simplePkgList(patterns=patterns)
-            for po in self.rpmdb:
+            for po in self.rpmdb.returnPackages(patterns=patterns):
                 if po.pkgtup not in avail:
                     extras.append(po)
 
commit 3612c1fa83183a245767919bec82e8d5026a186e
Author: James Antill <james at and.org>
Date:   Tue Mar 25 20:13:35 2008 -0400

    Minor re_glob, plus comment that matchPackageNames() function needs to die

diff --git a/yum/packageSack.py b/yum/packageSack.py
index 17e9164..975a39b 100644
--- a/yum/packageSack.py
+++ b/yum/packageSack.py
@@ -160,6 +160,7 @@ class PackageSackBase(object):
     def searchAll(self, arg, query_type):
         raise NotImplementedError()
     
+    # FIXME: This needs to be merged with how "yum list" works.
     def matchPackageNames(self, pkgspecs):
         """take a list strings and match the packages in the sack against it
            this will match against:
@@ -180,7 +181,7 @@ class PackageSackBase(object):
 
         specs = {}
         for p in pkgspecs:
-            if re.search('[\*\[\]\{\}\?]', p):
+            if misc.re_glob(p):
                 restring = fnmatch.translate(p)
                 specs[p] = re.compile(restring)
             else:



More information about the Yum-cvs-commits mailing list