[yum-git] Branch 'yum-3_2_X' - 6 commits - yum/depsolve.py yum/misc.py yum/yumRepo.py

James Antill james at linux.duke.edu
Tue Jul 22 17:19:40 UTC 2008


 yum/depsolve.py |   27 +++++++++++++++++++++++++--
 yum/misc.py     |   13 ++++++++++---
 yum/yumRepo.py  |   17 ++++++++++++-----
 3 files changed, 47 insertions(+), 10 deletions(-)

New commits:
commit 8042b26a6261dbd3937d6d00161d189f58023890
Merge: c186791... 3646e64...
Author: James Antill <james at and.org>
Date:   Tue Jul 22 13:15:30 2008 -0400

    Merge branch 'yum-3_2_X' of ssh://login.linux.duke.edu/home/groups/yum/git/yum into yum-3_2_X
    
    * 'yum-3_2_X' of ssh://login.linux.duke.edu/home/groups/yum/git/yum:
      add a __version_info__ tuple of ints derived from __version__
      Add parameters to selectGroup()
      new german translation updates from Fabian Affolter
      silence the "No package matched to remove" lines during groupremove operations.

commit c1867919a7ced82c6b48dd1f2b71d209d76a7c0c
Merge: 80bb298... 6a344d1...
Author: James Antill <james at and.org>
Date:   Tue Jul 22 13:15:03 2008 -0400

    Merge branch 'repo-sacks' into yum-3_2_X
    
    * repo-sacks:
      Don't create sacks for repos that we don't care about

commit 80bb298618570c85a2ac72b37c9009ebf1af235e
Author: James Antill <james at and.org>
Date:   Wed Jun 11 12:36:18 2008 -0400

     Try and solve the 666 requires on a single package problem, the
    kernel people want to try this for ABI stuff (each symbol is a provides).

diff --git a/yum/depsolve.py b/yum/depsolve.py
index 2577cef..ee57915 100644
--- a/yum/depsolve.py
+++ b/yum/depsolve.py
@@ -396,7 +396,24 @@ class Depsolve(object):
 
         return checkdeps, missingdep
         
+    def _quickWhatProvides(self, name, flags, version):
+        if self._last_req is None:
+            return False
 
+        if flags == 0:
+            flags = None
+        if type(version) in (types.StringType, types.NoneType, types.UnicodeType):
+            (r_e, r_v, r_r) = rpmUtils.miscutils.stringToVersion(version)
+        elif type(version) in (types.TupleType, types.ListType): # would this ever be a ListType?
+            (r_e, r_v, r_r) = version
+        
+        # Quick lookup, lots of reqs for one pkg:
+        po = self._last_req
+        if po.checkPrco('provides', (name, flags, (r_e, r_v, r_r))):
+            self.verbose_logger.debug(_('Quick matched %s to require for %s'), po, name)
+            return True
+        return False
+        
     def _requiringFromTransaction(self, requiringPo, requirement, errorlist):
         """processes the dependency resolution for a dep where requiring 
            package is in the transaction set"""
@@ -427,8 +444,10 @@ class Depsolve(object):
         #                   - if they are the same
         #                       - be confused but continue
 
-        provSack = self.whatProvides(needname, needflags, needversion)
+        if self._quickWhatProvides(needname, needflags, needversion):
+            return checkdeps, missingdep
 
+        provSack = self.whatProvides(needname, needflags, needversion)
         # get rid of things that are already in the rpmdb - b/c it's pointless to use them here
 
         for pkg in provSack.returnPackages():
@@ -483,8 +502,8 @@ class Depsolve(object):
                     _('%s already in ts, skipping this one'), pkg)
                 # FIXME: Remove this line, if it is not needed ?
                 # checkdeps = 1
+                self._last_req = pkg
                 return checkdeps, missingdep
-        
 
         # find the best one 
 
@@ -496,6 +515,7 @@ class Depsolve(object):
             for txmbr in results:
                 if pkg == txmbr.po:
                     checkdeps = True
+                    self._last_req = pkg
                     return checkdeps, missingdep
 
         # find out which arch of the ones we can choose from is closest
@@ -531,11 +551,13 @@ class Depsolve(object):
             txmbr = self.tsInfo.addUpdate(best, inst[0])
             txmbr.setAsDep(po=requiringPo)
             txmbr.reason = "dep"
+            self._last_req = best
         else:
             self.verbose_logger.debug(_('TSINFO: Marking %s as install for %s'), best,
                 requiringPo)
             txmbr = self.tsInfo.addInstall(best)
             txmbr.setAsDep(po=requiringPo)
+            self._last_req = best
 
             # if we had other packages with this name.arch that we found
             # before, they're not going to be installed anymore, so we
@@ -627,6 +649,7 @@ class Depsolve(object):
 
         self.po_with_problems = set()
         self._working_po = None
+        self._last_req = None
         self.tsInfo.resetResolved(hard=False)
 
         CheckDeps = True
commit 6a344d1b1f99e0eb8789c087759feaa3f3f1c696
Merge: 7550b27... c50a61a...
Author: James Antill <james at and.org>
Date:   Tue Jul 22 12:16:26 2008 -0400

    Merge conflict

diff --cc yum/yumRepo.py
index 47ef8f1,b032b57..7723534
--- a/yum/yumRepo.py
+++ b/yum/yumRepo.py
@@@ -251,21 -251,19 +251,26 @@@ class YumRepository(Repository, config.
          # callback function for handling media
          self.mediafunc = None
          
 +        self._sack = None
 +
 +        self._grabfunc = None
 +        self._grab = None
 +
 +    def _getSack(self):
+         # FIXME: Note that having the repo hold the sack, which holds "repos"
+         # is not only confusing but creates a circular dep.
+         #  Atm. we don't leak memory because RepoStorage.close() is called,
+         # which calls repo.close() which calls sack.close() which removes the
+         # repos from the sack ... thus. breaking the cycle.
 -        self.sack = sqlitesack.YumSqlitePackageSack(
 +        if self._sack is None:
 +            self._sack = sqlitesack.YumSqlitePackageSack(
                  sqlitesack.YumAvailablePackageSqlite)
 -
 -        self._grabfunc = None
 -        self._grab = None
 +        return self._sack
 +    sack = property(_getSack)
  
      def close(self):
 -        self.sack.close()
 +        if self._sack is not None:
 +            self.sack.close()
          Repository.close(self)
      
      def _resetSack(self):
commit c50a61a50042eff0bc6cb9a323b2dbf0292a1ad8
Author: James Antill <james at and.org>
Date:   Sun Jul 20 17:26:36 2008 -0400

    Make 'import gpgme' less fatal ... it isn't required, yet

diff --git a/yum/misc.py b/yum/misc.py
index a587eb6..caae307 100644
--- a/yum/misc.py
+++ b/yum/misc.py
@@ -16,7 +16,10 @@ import pwd
 import fnmatch
 import bz2
 from stat import *
-import gpgme
+try:
+    import gpgme
+except ImportError:
+    gpgme = None
 
 from Errors import MiscError
 
@@ -322,6 +325,9 @@ def keyInstalled(ts, keyid, timestamp):
     return -1
 
 def import_key_to_pubring(rawkey, repo_cachedir):
+    if gpgme is None:
+        return False
+
     gpgdir = '%s/gpgdir' % repo_cachedir
     if not os.path.exists(gpgdir):
         os.makedirs(gpgdir)
@@ -334,12 +340,13 @@ def import_key_to_pubring(rawkey, repo_cachedir):
     fp.close()
     ctx.import_(key_fo)
     key_fo.close()
+    return True
     
 def return_keyids_from_pubring(gpgdir):
-    ctx = gpgme.Context()
-    if not os.path.exists(gpgdir):
+    if gpgme is None or not os.path.exists(gpgdir):
         return []
         
+    ctx = gpgme.Context()
     os.environ['GNUPGHOME'] = gpgdir
     keyids = []
     for k in ctx.keylist():
commit 7550b27dcd446f058ea5d8108a0b0b329f1340a5
Author: James Antill <james at and.org>
Date:   Wed Mar 26 14:21:09 2008 -0400

     Don't create sacks for repos that we don't care about

diff --git a/yum/yumRepo.py b/yum/yumRepo.py
index 0585f99..47ef8f1 100644
--- a/yum/yumRepo.py
+++ b/yum/yumRepo.py
@@ -251,14 +251,21 @@ class YumRepository(Repository, config.RepoConf):
         # callback function for handling media
         self.mediafunc = None
         
-        self.sack = sqlitesack.YumSqlitePackageSack(
-                sqlitesack.YumAvailablePackageSqlite)
+        self._sack = None
 
         self._grabfunc = None
         self._grab = None
 
+    def _getSack(self):
+        if self._sack is None:
+            self._sack = sqlitesack.YumSqlitePackageSack(
+                sqlitesack.YumAvailablePackageSqlite)
+        return self._sack
+    sack = property(_getSack)
+
     def close(self):
-        self.sack.close()
+        if self._sack is not None:
+            self.sack.close()
         Repository.close(self)
     
     def _resetSack(self):



More information about the Yum-cvs-commits mailing list