[yum] update to latest HEAD.

Zdeněk Pavlas zpavlas at fedoraproject.org
Thu Jun 14 12:37:35 UTC 2012


commit aa9ef143d5199866b08b994aab9891277f6fc0d9
Author: Zdeněk Pavlas <zpavlas at redhat.com>
Date:   Thu Jun 14 14:37:26 2012 +0200

    update to latest HEAD.

 yum-HEAD.patch |  409 +++++++++++++++++++++++++++++++++-----------------------
 yum.spec       |    8 +-
 2 files changed, 246 insertions(+), 171 deletions(-)
---
diff --git a/yum-HEAD.patch b/yum-HEAD.patch
index de0e1fc..441a370 100644
--- a/yum-HEAD.patch
+++ b/yum-HEAD.patch
@@ -150733,7 +150733,7 @@ index abd203f..65c62a9 100644
  - 3.4.1
  - umask bug fix.
 diff --git a/yum/__init__.py b/yum/__init__.py
-index 99039e0..4650639 100644
+index 99039e0..090882c 100644
 --- a/yum/__init__.py
 +++ b/yum/__init__.py
 @@ -46,8 +46,13 @@ import operator
@@ -151185,7 +151185,15 @@ index 99039e0..4650639 100644
          warnings.warn(_('doGroupSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -829,7 +938,7 @@ class YumBase(depsolve.Depsolve):
+@@ -822,14 +931,13 @@ 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.repo_gen_decompress(groupfile, 'groups.xml',
+-                                                     cached=repo.cache)
++                groupfile = misc.repo_gen_decompress(groupfile, 'groups.xml')
+                 # Do we want a RepoError here?
+                 
              try:
                  self._comps.add(groupfile)
              except (Errors.GroupsError,Errors.CompsException), e:
@@ -151194,7 +151202,7 @@ index 99039e0..4650639 100644
                  self.logger.critical(msg)
              else:
                  repo.groups_added = True
-@@ -837,7 +946,10 @@ class YumBase(depsolve.Depsolve):
+@@ -837,7 +945,10 @@ class YumBase(depsolve.Depsolve):
          if self._comps.compscount == 0:
              raise Errors.GroupsError, _('No Groups Available in any repository')
  
@@ -151206,7 +151214,14 @@ index 99039e0..4650639 100644
          self.verbose_logger.debug('group time: %0.3f' % (time.time() - group_st))                
          return self._comps
  
-@@ -868,7 +980,7 @@ class YumBase(depsolve.Depsolve):
+@@ -862,13 +973,11 @@ class YumBase(depsolve.Depsolve):
+                 # fetch the sqlite tagdb
+                 try:
+                     tag_md = repo.retrieveMD('pkgtags')
+-                    tag_sqlite  = misc.repo_gen_decompress(tag_md,
+-                                                           'pkgtags.sqlite',
+-                                                           cached=repo.cache)
++                    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:
@@ -151215,7 +151230,7 @@ index 99039e0..4650639 100644
                      self.logger.critical(msg)
                      
                  
-@@ -881,9 +993,18 @@ class YumBase(depsolve.Depsolve):
+@@ -881,9 +990,18 @@ class YumBase(depsolve.Depsolve):
          if self._history is None:
              pdb_path = self.conf.persistdir + "/history"
              self._history = yum.history.YumHistory(root=self.conf.installroot,
@@ -151235,7 +151250,7 @@ index 99039e0..4650639 100644
      # properties so they auto-create themselves with defaults
      repos = property(fget=lambda self: self._getRepos(),
                       fset=lambda self, value: setattr(self, "_repos", value),
-@@ -921,6 +1042,11 @@ class YumBase(depsolve.Depsolve):
+@@ -921,6 +1039,11 @@ class YumBase(depsolve.Depsolve):
                         fdel=lambda self: setattr(self, "_history", None),
                         doc="Yum History Object")
  
@@ -151247,7 +151262,7 @@ index 99039e0..4650639 100644
      pkgtags = property(fget=lambda self: self._getTags(),
                         fset=lambda self, value: setattr(self, "_tags",value),
                         fdel=lambda self: setattr(self, "_tags", None),
-@@ -928,9 +1054,10 @@ class YumBase(depsolve.Depsolve):
+@@ -928,9 +1051,10 @@ class YumBase(depsolve.Depsolve):
      
      
      def doSackFilelistPopulate(self):
@@ -151261,7 +151276,7 @@ index 99039e0..4650639 100644
          necessary = False
          
          # I can't think of a nice way of doing this, we have to have the sack here
-@@ -951,8 +1078,12 @@ class YumBase(depsolve.Depsolve):
+@@ -951,8 +1075,12 @@ class YumBase(depsolve.Depsolve):
              self.repos.populateSack(mdtype='filelists')
             
      def yumUtilsMsg(self, func, prog):
@@ -151276,7 +151291,7 @@ index 99039e0..4650639 100644
          if self.rpmdb.contains(name="yum-utils"):
              return
  
-@@ -964,8 +1095,17 @@ class YumBase(depsolve.Depsolve):
+@@ -964,8 +1092,17 @@ class YumBase(depsolve.Depsolve):
               (hibeg, prog, hiend))
  
      def buildTransaction(self, unfinished_transactions_check=True):
@@ -151296,7 +151311,7 @@ index 99039e0..4650639 100644
          if (unfinished_transactions_check and
              misc.find_unfinished_transactions(yumlibpath=self.conf.persistdir)):
              msg = _('There are unfinished transactions remaining. You might ' \
-@@ -1004,7 +1144,7 @@ class YumBase(depsolve.Depsolve):
+@@ -1004,7 +1141,7 @@ class YumBase(depsolve.Depsolve):
              # If transaction was changed by postresolve plugins then we should run skipbroken again
              (rescode, restring) = self._doSkipBroken(rescode, restring, clear_skipped=False )
  
@@ -151305,7 +151320,7 @@ index 99039e0..4650639 100644
              self.tsInfo.pkgSack.dropCachedData()
  
          # FIXME: This is horrible, see below and yummain. Maybe create a real
-@@ -1242,13 +1382,15 @@ class YumBase(depsolve.Depsolve):
+@@ -1242,13 +1379,15 @@ class YumBase(depsolve.Depsolve):
          if None in pkgtup:
              return None
          return pkgtup
@@ -151325,7 +151340,7 @@ index 99039e0..4650639 100644
          if pkgtup is None:
              return
          self._not_found_i[pkgtup] = YumNotFoundPackage(pkgtup)
-@@ -1454,8 +1596,14 @@ class YumBase(depsolve.Depsolve):
+@@ -1454,8 +1593,14 @@ class YumBase(depsolve.Depsolve):
          return probs
  
      def runTransaction(self, cb):
@@ -151341,7 +151356,7 @@ index 99039e0..4650639 100644
          self.plugins.run('pretrans')
  
          #  We may want to put this other places, eventually, but for now it's
-@@ -1516,10 +1664,23 @@ class YumBase(depsolve.Depsolve):
+@@ -1516,10 +1661,23 @@ class YumBase(depsolve.Depsolve):
                  pass
          self._ts_save_file = None
          
@@ -151365,7 +151380,7 @@ index 99039e0..4650639 100644
          
          # make resultobject - just a plain yumgenericholder object
          resultobject = misc.GenericHolder()
-@@ -1567,13 +1728,24 @@ class YumBase(depsolve.Depsolve):
+@@ -1567,13 +1725,24 @@ class YumBase(depsolve.Depsolve):
          self.plugins.run('posttrans')
          # sync up what just happened versus what is in the rpmdb
          if not self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST):
@@ -151395,7 +151410,7 @@ index 99039e0..4650639 100644
          # check to see that the rpmdb and the tsInfo roughly matches
          # push package object metadata outside of rpmdb into yumdb
          # delete old yumdb metadata entries
-@@ -1584,9 +1756,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1584,9 +1753,16 @@ class YumBase(depsolve.Depsolve):
          #    that there is not also an install of this pkg in the tsInfo (reinstall)
          # for any kind of install add from_repo to the yumdb, and the cmdline
          # and the install reason
@@ -151412,7 +151427,7 @@ index 99039e0..4650639 100644
          for txmbr in self.tsInfo:
              if txmbr.output_state in TS_INSTALL_STATES:
                  if not self.rpmdb.contains(po=txmbr.po):
-@@ -1596,7 +1775,9 @@ class YumBase(depsolve.Depsolve):
+@@ -1596,7 +1772,9 @@ class YumBase(depsolve.Depsolve):
                                             ' but is not!' % txmbr.po))
                      # Note: Get Panu to do te.Failed() so we don't have to
                      txmbr.output_state = TS_FAILED
@@ -151422,7 +151437,7 @@ index 99039e0..4650639 100644
                  po = self.getInstalledPackageObject(txmbr.pkgtup)
                  rpo = txmbr.po
                  po.yumdb_info.from_repo = rpo.repoid
-@@ -1630,6 +1811,10 @@ class YumBase(depsolve.Depsolve):
+@@ -1630,6 +1808,10 @@ class YumBase(depsolve.Depsolve):
                      if md:
                          po.yumdb_info.from_repo_timestamp = str(md.timestamp)
  
@@ -151433,7 +151448,7 @@ index 99039e0..4650639 100644
                  loginuid = misc.getloginuid()
                  if txmbr.updates or txmbr.downgrades or txmbr.reinstall:
                      if txmbr.updates:
-@@ -1640,11 +1825,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1640,11 +1822,16 @@ class YumBase(depsolve.Depsolve):
                          opo = po
                      if 'installed_by' in opo.yumdb_info:
                          po.yumdb_info.installed_by = opo.yumdb_info.installed_by
@@ -151450,7 +151465,7 @@ index 99039e0..4650639 100644
          # Remove old ones after installing new ones, so we can copy values.
          for txmbr in self.tsInfo:
              if txmbr.output_state in TS_INSTALL_STATES:
-@@ -1662,10 +1852,13 @@ class YumBase(depsolve.Depsolve):
+@@ -1662,10 +1849,13 @@ class YumBase(depsolve.Depsolve):
                                                 ' but is not!' % txmbr.po))
                          # Note: Get Panu to do te.Failed() so we don't have to
                          txmbr.output_state = TS_FAILED
@@ -151464,7 +151479,7 @@ index 99039e0..4650639 100644
                  self.verbose_logger.log(logginglevels.DEBUG_2, 'What is this? %s' % txmbr.po)
  
          self.plugins.run('postverifytrans')
-@@ -1680,10 +1873,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1680,10 +1870,11 @@ class YumBase(depsolve.Depsolve):
          self.verbose_logger.debug('VerifyTransaction time: %0.3f' % (time.time() - vt_st))
  
      def costExcludePackages(self):
@@ -151480,7 +151495,7 @@ index 99039e0..4650639 100644
          # if all the repo.costs are equal then don't bother running things
          costs = {}
          for r in self.repos.listEnabled():
-@@ -1705,10 +1899,12 @@ class YumBase(depsolve.Depsolve):
+@@ -1705,10 +1896,12 @@ class YumBase(depsolve.Depsolve):
              done = True
  
      def excludePackages(self, repo=None):
@@ -151496,7 +151511,7 @@ index 99039e0..4650639 100644
          if "all" in self.conf.disable_excludes:
              return
          
-@@ -1735,9 +1931,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1735,9 +1928,11 @@ class YumBase(depsolve.Depsolve):
              self.pkgSack.addPackageExcluder(repoid, exid,'exclude.match', match)
  
      def includePackages(self, repo):
@@ -151511,7 +151526,7 @@ index 99039e0..4650639 100644
          includelist = repo.getIncludePkgList()
          
          if len(includelist) == 0:
-@@ -1757,8 +1955,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1757,8 +1952,11 @@ class YumBase(depsolve.Depsolve):
          self.pkgSack.addPackageExcluder(repo.id, exid, 'exclude.marked')
          
      def doLock(self, lockfile = YUM_PID_FILE):
@@ -151525,7 +151540,7 @@ index 99039e0..4650639 100644
          if self.conf.uid != 0:
              #  If we are a user, assume we are using the root cache ... so don't
              # bother locking.
-@@ -1774,38 +1975,26 @@ class YumBase(depsolve.Depsolve):
+@@ -1774,38 +1972,26 @@ class YumBase(depsolve.Depsolve):
          
          mypid=str(os.getpid())    
          while not self._lock(lockfile, mypid, 0644):
@@ -151579,7 +151594,7 @@ index 99039e0..4650639 100644
          # if we're not root then we don't lock - just return nicely
          #  Note that we can get here from __del__, so if we haven't created
          # YumBase.conf we don't want to do so here as creating stuff inside
-@@ -1830,31 +2019,69 @@ class YumBase(depsolve.Depsolve):
+@@ -1830,31 +2016,69 @@ class YumBase(depsolve.Depsolve):
          self._unlock(lockfile)
          self._lockfile = None
          
@@ -151659,7 +151674,7 @@ index 99039e0..4650639 100644
          failed = False
  
          if type(fo) is types.InstanceType:
-@@ -1894,9 +2121,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1894,9 +2118,16 @@ class YumBase(depsolve.Depsolve):
          
          
      def verifyChecksum(self, fo, checksumType, csum):
@@ -151679,7 +151694,7 @@ index 99039e0..4650639 100644
          try:
              filesum = misc.checksum(checksumType, fo)
          except Errors.MiscError, e:
-@@ -1908,6 +2142,17 @@ class YumBase(depsolve.Depsolve):
+@@ -1908,6 +2139,17 @@ class YumBase(depsolve.Depsolve):
          return 0
  
      def downloadPkgs(self, pkglist, callback=None, callback_total=None):
@@ -151697,7 +151712,7 @@ index 99039e0..4650639 100644
          def mediasort(apo, bpo):
              # FIXME: we should probably also use the mediaid; else we
              # could conceivably ping-pong between different disc1's
-@@ -1979,8 +2224,9 @@ class YumBase(depsolve.Depsolve):
+@@ -1979,8 +2221,9 @@ class YumBase(depsolve.Depsolve):
              urlgrabber.progress.text_meter_total_size(remote_size)
          beg_download = time.time()
          i = 0
@@ -151708,7 +151723,7 @@ index 99039e0..4650639 100644
          for po in remote_pkgs:
              #  Recheck if the file is there, works around a couple of weird
              # edge cases.
-@@ -1992,52 +2238,47 @@ class YumBase(depsolve.Depsolve):
+@@ -1992,52 +2235,47 @@ class YumBase(depsolve.Depsolve):
                      remote_size -= po.size
                      if hasattr(urlgrabber.progress, 'text_meter_total_size'):
                          urlgrabber.progress.text_meter_total_size(remote_size,
@@ -151787,7 +151802,7 @@ index 99039e0..4650639 100644
          if hasattr(urlgrabber.progress, 'text_meter_total_size'):
              urlgrabber.progress.text_meter_total_size(0)
          if callback_total is not None and not errors:
-@@ -2052,7 +2293,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2052,7 +2290,22 @@ class YumBase(depsolve.Depsolve):
          return errors
  
      def verifyHeader(self, fo, po, raiseError):
@@ -151811,7 +151826,7 @@ index 99039e0..4650639 100644
          if type(fo) is types.InstanceType:
              fo = fo.filename
              
-@@ -2076,9 +2332,12 @@ class YumBase(depsolve.Depsolve):
+@@ -2076,9 +2329,12 @@ class YumBase(depsolve.Depsolve):
          return 1
          
      def downloadHeader(self, po):
@@ -151826,7 +151841,7 @@ index 99039e0..4650639 100644
          if hasattr(po, 'pkgtype') and po.pkgtype == 'local':
              return
                  
-@@ -2122,15 +2381,17 @@ class YumBase(depsolve.Depsolve):
+@@ -2122,15 +2378,17 @@ class YumBase(depsolve.Depsolve):
              return
  
      def sigCheckPkg(self, po):
@@ -151852,7 +151867,7 @@ index 99039e0..4650639 100644
          if self._override_sigchecks:
              check = False
              hasgpgkey = 0
-@@ -2181,6 +2442,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2181,6 +2439,9 @@ class YumBase(depsolve.Depsolve):
          return result, msg
  
      def cleanUsedHeadersPackages(self):
@@ -151862,7 +151877,7 @@ index 99039e0..4650639 100644
          filelist = []
          for txmbr in self.tsInfo:
              if txmbr.po.state not in TS_INSTALL_STATES:
-@@ -2218,27 +2482,42 @@ class YumBase(depsolve.Depsolve):
+@@ -2218,27 +2479,42 @@ class YumBase(depsolve.Depsolve):
                      _('%s removed'), fn)
          
      def cleanHeaders(self):
@@ -151907,7 +151922,7 @@ index 99039e0..4650639 100644
          cachedir = self.conf.persistdir + "/rpmdb-indexes/"
          if not os.path.exists(cachedir):
              filelist = []
-@@ -2272,8 +2551,29 @@ class YumBase(depsolve.Depsolve):
+@@ -2272,8 +2548,29 @@ class YumBase(depsolve.Depsolve):
  
      def doPackageLists(self, pkgnarrow='all', patterns=None, showdups=None,
                         ignore_case=False):
@@ -151939,7 +151954,7 @@ index 99039e0..4650639 100644
          if showdups is None:
              showdups = self.conf.showdupesfromrepos
          ygh = misc.GenericHolder(iter=pkgnarrow)
-@@ -2323,10 +2623,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2323,10 +2620,22 @@ class YumBase(depsolve.Depsolve):
                      key = (pkg.name, pkg.arch)
                      if pkg.pkgtup in dinst:
                          reinstall_available.append(pkg)
@@ -151965,7 +151980,7 @@ index 99039e0..4650639 100644
  
          # produce the updates list of tuples
          elif pkgnarrow == 'updates':
-@@ -2461,14 +2773,13 @@ class YumBase(depsolve.Depsolve):
+@@ -2461,14 +2770,13 @@ class YumBase(depsolve.Depsolve):
  
          
      def findDeps(self, pkgs):
@@ -151985,7 +152000,7 @@ index 99039e0..4650639 100644
          results = {}
  
          for pkg in pkgs:
-@@ -2495,10 +2806,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2495,10 +2803,22 @@ class YumBase(depsolve.Depsolve):
      # pre 3.2.10 API used to always showdups, so that's the default atm.
      def searchGenerator(self, fields, criteria, showdups=True, keys=False, 
                                               searchtags=True, searchrpmdb=True):
@@ -152012,7 +152027,7 @@ index 99039e0..4650639 100644
          sql_fields = []
          for f in fields:
              sql_fields.append(RPM_TO_SQLITE.get(f, f))
-@@ -2661,6 +2984,14 @@ class YumBase(depsolve.Depsolve):
+@@ -2661,6 +2981,14 @@ class YumBase(depsolve.Depsolve):
                      yield (po, vs)
  
      def searchPackageTags(self, criteria):
@@ -152027,7 +152042,7 @@ index 99039e0..4650639 100644
          results = {} # name = [(criteria, taglist)]
          for c in criteria:
              c = c.lower()
-@@ -2677,11 +3008,16 @@ class YumBase(depsolve.Depsolve):
+@@ -2677,11 +3005,16 @@ class YumBase(depsolve.Depsolve):
          return results
          
      def searchPackages(self, fields, criteria, callback=None):
@@ -152049,7 +152064,7 @@ index 99039e0..4650639 100644
          warnings.warn(_('searchPackages() will go away in a future version of Yum.\
                        Use searchGenerator() instead. \n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)           
-@@ -2700,13 +3036,23 @@ class YumBase(depsolve.Depsolve):
+@@ -2700,13 +3033,23 @@ class YumBase(depsolve.Depsolve):
      
      def searchPackageProvides(self, args, callback=None,
                                callback_has_matchfor=False):
@@ -152077,7 +152092,7 @@ index 99039e0..4650639 100644
              else:
                  isglob = True
                  canBeFile = misc.re_filename(arg)
-@@ -2723,7 +3069,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2723,7 +3066,7 @@ class YumBase(depsolve.Depsolve):
                  where = self.returnPackagesByDep(arg)
              else:
                  usedDepString = False
@@ -152086,7 +152101,7 @@ index 99039e0..4650639 100644
              self.verbose_logger.log(logginglevels.DEBUG_1,
                 P_('Searching %d package', 'Searching %d packages', len(where)), len(where))
              
-@@ -2817,25 +3163,93 @@ class YumBase(depsolve.Depsolve):
+@@ -2817,25 +3160,93 @@ class YumBase(depsolve.Depsolve):
              
          return matches
  
@@ -152191,7 +152206,7 @@ index 99039e0..4650639 100644
                  if uservisible:
                      if grp.user_visible:
                          installed.append(grp)
-@@ -2848,12 +3262,29 @@ class YumBase(depsolve.Depsolve):
+@@ -2848,12 +3259,29 @@ class YumBase(depsolve.Depsolve):
                  else:
                      available.append(grp)
              
@@ -152224,7 +152239,7 @@ index 99039e0..4650639 100644
          txmbrs_used = []
          
          thesegroups = self.comps.return_groups(grpid)
-@@ -2861,20 +3292,28 @@ class YumBase(depsolve.Depsolve):
+@@ -2861,20 +3289,28 @@ class YumBase(depsolve.Depsolve):
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
  
          for thisgroup in thesegroups:
@@ -152255,7 +152270,7 @@ index 99039e0..4650639 100644
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -2898,13 +3337,18 @@ class YumBase(depsolve.Depsolve):
+@@ -2898,13 +3334,18 @@ class YumBase(depsolve.Depsolve):
                              self.tsInfo.remove(txmbr.po.pkgtup)
          
          
@@ -152281,7 +152296,7 @@ index 99039e0..4650639 100644
          """
  
          if not self.comps.has_group(grpid):
-@@ -2934,12 +3378,47 @@ class YumBase(depsolve.Depsolve):
+@@ -2934,12 +3375,47 @@ class YumBase(depsolve.Depsolve):
              if 'optional' in package_types:
                  pkgs.extend(thisgroup.optional_packages)
  
@@ -152330,7 +152345,7 @@ index 99039e0..4650639 100644
                  except Errors.InstallError, e:
                      self.verbose_logger.debug(_('No package named %s available to be installed'),
                          pkg)
-@@ -2953,6 +3432,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2953,6 +3429,7 @@ class YumBase(depsolve.Depsolve):
                  group_conditionals = enable_group_conditionals
  
              count_cond_test = 0
@@ -152338,7 +152353,7 @@ index 99039e0..4650639 100644
              if group_conditionals:
                  for condreq, cond in thisgroup.conditional_packages.iteritems():
                      if self.isPackageInstalled(cond):
-@@ -2997,10 +3477,14 @@ class YumBase(depsolve.Depsolve):
+@@ -2997,10 +3474,14 @@ class YumBase(depsolve.Depsolve):
          return txmbrs_used
  
      def deselectGroup(self, grpid, force=False):
@@ -152357,7 +152372,7 @@ index 99039e0..4650639 100644
          
          if not self.comps.has_group(grpid):
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -3035,12 +3519,21 @@ class YumBase(depsolve.Depsolve):
+@@ -3035,12 +3516,21 @@ class YumBase(depsolve.Depsolve):
                              self.tsInfo.remove(pkg.pkgtup)
          
      def getPackageObject(self, pkgtup, allow_missing=False):
@@ -152385,7 +152400,7 @@ index 99039e0..4650639 100644
          # look it up in the self.localPackages first:
          for po in self.localPackages:
              if po.pkgtup == pkgtup:
-@@ -3049,7 +3542,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3049,7 +3539,7 @@ class YumBase(depsolve.Depsolve):
          pkgs = self.pkgSack.searchPkgTuple(pkgtup)
  
          if len(pkgs) == 0:
@@ -152394,7 +152409,7 @@ index 99039e0..4650639 100644
              if allow_missing: #  This can happen due to excludes after .up has
                  return None   # happened.
              raise Errors.DepError, _('Package tuple %s could not be found in packagesack') % str(pkgtup)
-@@ -3065,13 +3558,21 @@ class YumBase(depsolve.Depsolve):
+@@ -3065,13 +3555,21 @@ class YumBase(depsolve.Depsolve):
          return result
  
      def getInstalledPackageObject(self, pkgtup):
@@ -152421,7 +152436,7 @@ index 99039e0..4650639 100644
              raise Errors.RpmDBError, _('Package tuple %s could not be found in rpmdb') % str(pkgtup)
  
          # Dito. FIXME from getPackageObject() for len() > 1 ... :)
-@@ -3079,9 +3580,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3079,9 +3577,11 @@ class YumBase(depsolve.Depsolve):
          return po
          
      def gpgKeyCheck(self):
@@ -152435,7 +152450,7 @@ index 99039e0..4650639 100644
          gpgkeyschecked = self.conf.cachedir + '/.gpgkeyschecked.yum'
          if os.path.exists(gpgkeyschecked):
              return 1
-@@ -3106,9 +3609,13 @@ class YumBase(depsolve.Depsolve):
+@@ -3106,9 +3606,13 @@ class YumBase(depsolve.Depsolve):
              return 1
  
      def returnPackagesByDep(self, depstring):
@@ -152451,7 +152466,7 @@ index 99039e0..4650639 100644
          if not depstring:
              return []
  
-@@ -3135,9 +3642,16 @@ class YumBase(depsolve.Depsolve):
+@@ -3135,9 +3639,16 @@ class YumBase(depsolve.Depsolve):
          return self.pkgSack.getProvides(depname, depflags, depver).keys()
  
      def returnPackageByDep(self, depstring):
@@ -152471,7 +152486,7 @@ index 99039e0..4650639 100644
          # we get all sorts of randomness here
          errstring = depstring
          if type(depstring) not in types.StringTypes:
-@@ -3149,16 +3663,22 @@ class YumBase(depsolve.Depsolve):
+@@ -3149,16 +3660,22 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _('No Package found for %s') % errstring
          
          ps = ListPackageSack(pkglist)
@@ -152498,7 +152513,7 @@ index 99039e0..4650639 100644
          if not depstring:
              return []
  
-@@ -3184,12 +3704,47 @@ class YumBase(depsolve.Depsolve):
+@@ -3184,12 +3701,47 @@ class YumBase(depsolve.Depsolve):
  
          return self.rpmdb.getProvides(depname, depflags, depver).keys()
  
@@ -152548,7 +152563,7 @@ index 99039e0..4650639 100644
          
          
          if len(pkglist) == 0:
-@@ -3198,14 +3753,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3198,14 +3750,23 @@ class YumBase(depsolve.Depsolve):
          if len(pkglist) == 1:
              return pkglist[0]
  
@@ -152578,7 +152593,7 @@ index 99039e0..4650639 100644
          returnlist = []
          compatArchList = self.arch.get_arch_list(arch)
          multiLib = []
-@@ -3222,9 +3786,9 @@ class YumBase(depsolve.Depsolve):
+@@ -3222,9 +3783,9 @@ class YumBase(depsolve.Depsolve):
                  singleLib.append(po)
                  
          # we now have three lists.  find the best package(s) of each
@@ -152591,7 +152606,7 @@ index 99039e0..4650639 100644
  
          if single_name and multi and single and multi.name != single.name:
              # Sinlge _must_ match multi, if we want a single package name
-@@ -3238,7 +3802,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3238,7 +3799,7 @@ class YumBase(depsolve.Depsolve):
          # if there's a noarch and it's newer than the multilib, we want
          # just the noarch.  otherwise, we want multi + single
          elif multi:
@@ -152600,7 +152615,7 @@ index 99039e0..4650639 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3246,7 +3810,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3246,7 +3807,7 @@ class YumBase(depsolve.Depsolve):
                  if single: returnlist.append(single)
          # similar for the non-multilib case
          elif single:
@@ -152609,7 +152624,7 @@ index 99039e0..4650639 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3350,23 +3914,27 @@ class YumBase(depsolve.Depsolve):
+@@ -3350,23 +3911,27 @@ class YumBase(depsolve.Depsolve):
              done = True
  
              slow = next_func(slow)
@@ -152642,7 +152657,7 @@ index 99039e0..4650639 100644
      def _at_groupremove(self, pattern):
          " Do groupremove via. leading @ on the cmd line, for remove."
          assert pattern[0] == '@'
-@@ -3398,7 +3966,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3398,7 +3963,7 @@ class YumBase(depsolve.Depsolve):
      def _minus_deselect(self, pattern):
          """ Remove things from the transaction, like kickstart. """
          assert pattern[0] == '-'
@@ -152651,7 +152666,7 @@ index 99039e0..4650639 100644
  
          if pat and pat[0] == '@':
              pat = pat[1:]
-@@ -3437,14 +4005,61 @@ class YumBase(depsolve.Depsolve):
+@@ -3437,14 +4002,61 @@ class YumBase(depsolve.Depsolve):
              if flag not in self.tsInfo.probFilterFlags:
                  self.tsInfo.probFilterFlags.append(flag)
  
@@ -152719,7 +152734,7 @@ index 99039e0..4650639 100644
          pkgs = []
          was_pattern = False
          if po:
-@@ -3477,20 +4092,12 @@ class YumBase(depsolve.Depsolve):
+@@ -3477,20 +4089,12 @@ class YumBase(depsolve.Depsolve):
                      self.verbose_logger.debug(_('Checking for virtual provide or file-provide for %s'), 
                          arg)
  
@@ -152746,7 +152761,7 @@ index 99039e0..4650639 100644
              else:
                  nevra_dict = self._nevra_kwarg_parse(kwargs)
  
-@@ -3577,8 +4184,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3577,8 +4181,8 @@ class YumBase(depsolve.Depsolve):
                      continue
              
              # make sure this shouldn't be passed to update:
@@ -152757,7 +152772,7 @@ index 99039e0..4650639 100644
                  txmbrs = self.update(po=po)
                  tx_return.extend(txmbrs)
                  continue
-@@ -3587,7 +4194,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3587,7 +4191,7 @@ class YumBase(depsolve.Depsolve):
              # something else in the repo. Unless there is a obsoletion loop,
              # at which point ignore everything.
              obsoleting_pkg = None
@@ -152766,7 +152781,7 @@ index 99039e0..4650639 100644
                  obsoleting_pkg = self._test_loop(po, self._pkg2obspkg)
              if obsoleting_pkg is not None:
                  # this is not a definitive check but it'll make sure we don't
-@@ -3600,23 +4207,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3600,23 +4204,23 @@ class YumBase(depsolve.Depsolve):
                      already_obs = pkgs[0]
  
                  if already_obs:
@@ -152797,7 +152812,7 @@ index 99039e0..4650639 100644
                      continue
  
              # make sure we don't have a name.arch of this already installed
-@@ -3630,7 +4237,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3630,7 +4234,7 @@ class YumBase(depsolve.Depsolve):
                          found = True
                          break
                  if not found:
@@ -152806,7 +152821,7 @@ index 99039e0..4650639 100644
                      txmbrs = self.update(po=po)
                      tx_return.extend(txmbrs)
                      continue
-@@ -3719,14 +4326,33 @@ class YumBase(depsolve.Depsolve):
+@@ -3719,14 +4323,33 @@ class YumBase(depsolve.Depsolve):
          return txmbr
  
      def update(self, po=None, requiringPo=None, update_to=False, **kwargs):
@@ -152847,7 +152862,7 @@ index 99039e0..4650639 100644
          # check for args - if no po nor kwargs, do them all
          # if po, do it, ignore all else
          # if no po do kwargs
-@@ -3765,7 +4391,12 @@ class YumBase(depsolve.Depsolve):
+@@ -3765,7 +4388,12 @@ class YumBase(depsolve.Depsolve):
                      if new is None:
                          continue
                      tx_return.extend(self.update(po=new))
@@ -152861,7 +152876,7 @@ index 99039e0..4650639 100644
              return tx_return
  
          # complications
-@@ -3787,7 +4418,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3787,7 +4415,7 @@ class YumBase(depsolve.Depsolve):
                  return self._minus_deselect(kwargs['pattern'])
  
              if kwargs['pattern'] and kwargs['pattern'][0] == '@':
@@ -152870,7 +152885,7 @@ index 99039e0..4650639 100644
  
              arg = kwargs['pattern']
              if not update_to:
-@@ -3920,6 +4551,18 @@ class YumBase(depsolve.Depsolve):
+@@ -3920,6 +4548,18 @@ class YumBase(depsolve.Depsolve):
                      tx_return.append(txmbr)
                          
          for available_pkg in availpkgs:
@@ -152889,7 +152904,7 @@ index 99039e0..4650639 100644
              #  Make sure we're not installing a package which is obsoleted by
              # something else in the repo. Unless there is a obsoletion loop,
              # at which point ignore everything.
-@@ -3985,11 +4628,18 @@ class YumBase(depsolve.Depsolve):
+@@ -3985,11 +4625,18 @@ class YumBase(depsolve.Depsolve):
          return tx_return
          
      def remove(self, po=None, **kwargs):
@@ -152913,7 +152928,7 @@ index 99039e0..4650639 100644
          if not po and not kwargs:
              raise Errors.RemoveError, 'Nothing specified to remove'
          
-@@ -4055,17 +4705,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4055,17 +4702,19 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def installLocal(self, pkg, po=None, updateonly=False):
@@ -152943,7 +152958,7 @@ index 99039e0..4650639 100644
          # read in the package into a YumLocalPackage Object
          # append it to self.localPackages
          # check if it can be installed or updated based on nevra versus rpmdb
-@@ -4183,16 +4835,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4183,16 +4832,15 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def reinstallLocal(self, pkg, po=None):
@@ -152968,7 +152983,7 @@ index 99039e0..4650639 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4215,9 +4866,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4215,9 +4863,19 @@ class YumBase(depsolve.Depsolve):
          return self.reinstall(po=po)
  
      def reinstall(self, po=None, **kwargs):
@@ -152991,7 +153006,7 @@ index 99039e0..4650639 100644
          self._add_prob_flags(rpm.RPMPROB_FILTER_REPLACEPKG,
                               rpm.RPMPROB_FILTER_REPLACENEWFILES,
                               rpm.RPMPROB_FILTER_REPLACEOLDFILES)
-@@ -4259,16 +4920,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4259,16 +4917,15 @@ class YumBase(depsolve.Depsolve):
          return tx_mbrs
          
      def downgradeLocal(self, pkg, po=None):
@@ -153016,7 +153031,7 @@ index 99039e0..4650639 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4309,13 +4969,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4309,13 +4966,19 @@ class YumBase(depsolve.Depsolve):
          return False
          
      def downgrade(self, po=None, **kwargs):
@@ -153043,7 +153058,7 @@ index 99039e0..4650639 100644
          if not po and not kwargs:
              raise Errors.DowngradeError, 'Nothing specified to downgrade'
  
-@@ -4421,6 +5087,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4421,6 +5084,9 @@ class YumBase(depsolve.Depsolve):
                  warned_nas.add(na)
                  continue
  
@@ -153053,7 +153068,7 @@ index 99039e0..4650639 100644
              if pkg.verGE(lipkg):
                  if na not in warned_nas:
                      msg = _('Only Upgrade available on package: %s') % pkg
-@@ -4457,7 +5126,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4457,7 +5123,7 @@ class YumBase(depsolve.Depsolve):
          if e and v and r:
              evr = '%s:%s-%s' % (e, v, r)
          elif v and r:
@@ -153062,7 +153077,7 @@ index 99039e0..4650639 100644
          elif e and v:
              evr = '%s:%s' % (e, v)
          elif v: # e and r etc. is just too weird to print
-@@ -4500,12 +5169,24 @@ class YumBase(depsolve.Depsolve):
+@@ -4500,12 +5166,24 @@ class YumBase(depsolve.Depsolve):
  
          return returndict
  
@@ -153090,7 +153105,7 @@ index 99039e0..4650639 100644
          old_conf_obs = self.conf.obsoletes
          self.conf.obsoletes = False
          done = False
-@@ -4515,19 +5196,46 @@ class YumBase(depsolve.Depsolve):
+@@ -4515,19 +5193,46 @@ class YumBase(depsolve.Depsolve):
                      done = True
          for pkg in transaction.trans_data:
              if pkg.state == 'Downgrade':
@@ -153137,7 +153152,7 @@ index 99039e0..4650639 100644
                  if self.install(pkgtup=pkg.pkgtup):
                      done = True
          for pkg in transaction.trans_data:
-@@ -4538,8 +5246,14 @@ class YumBase(depsolve.Depsolve):
+@@ -4538,8 +5243,14 @@ class YumBase(depsolve.Depsolve):
          return done
  
      def history_undo(self, transaction):
@@ -153154,7 +153169,7 @@ index 99039e0..4650639 100644
          # NOTE: This is somewhat basic atm. ... for instance we don't check
          #       that we are going from the old new version. However it's still
          #       better than the RHN rollback code, and people pay for that :).
-@@ -4616,7 +5330,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4616,7 +5327,7 @@ class YumBase(depsolve.Depsolve):
  
          except urlgrabber.grabber.URLGrabError, e:
              raise Errors.YumBaseError(_('GPG key retrieval failed: ') +
@@ -153163,7 +153178,7 @@ index 99039e0..4650639 100644
                                        
          # check for a .asc file accompanying it - that's our gpg sig on the key
          # suck it down and do the check
-@@ -4649,7 +5363,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4649,7 +5360,7 @@ class YumBase(depsolve.Depsolve):
              keys_info = misc.getgpgkeyinfo(rawkey, multiple=True)
          except ValueError, e:
              raise Errors.YumBaseError(_('Invalid GPG Key from %s: %s') % 
@@ -153172,7 +153187,7 @@ index 99039e0..4650639 100644
          keys = []
          for keyinfo in keys_info:
              thiskey = {}
-@@ -4674,39 +5388,49 @@ class YumBase(depsolve.Depsolve):
+@@ -4674,39 +5385,49 @@ class YumBase(depsolve.Depsolve):
              if pkgs:
                  pkgs = sorted(pkgs)[-1]
                  msg = (_('Importing %s key 0x%s:\n'
@@ -153240,7 +153255,7 @@ index 99039e0..4650639 100644
          user_cb_fail = False
          for keyurl in keyurls:
              keys = self._retrievePublicKey(keyurl, repo)
-@@ -4725,7 +5449,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4725,7 +5446,9 @@ class YumBase(depsolve.Depsolve):
                      # Try installing/updating GPG key
                      self._getKeyImportMessage(info, keyurl)
                      rc = False
@@ -153251,7 +153266,7 @@ index 99039e0..4650639 100644
                          rc = True
                          
                      # grab the .sig/.asc for the keyurl, if it exists
-@@ -4751,8 +5477,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4751,8 +5474,8 @@ class YumBase(depsolve.Depsolve):
                  ts = self.rpmdb.readOnlyTS()
                  result = ts.pgpImportPubkey(misc.procgpgkey(info['raw_key']))
                  if result != 0:
@@ -153262,7 +153277,7 @@ index 99039e0..4650639 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
  
-@@ -4760,18 +5486,20 @@ class YumBase(depsolve.Depsolve):
+@@ -4760,18 +5483,20 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _("Didn't install any keys")
  
          if not key_installed:
@@ -153288,7 +153303,7 @@ index 99039e0..4650639 100644
      
      def _getAnyKeyForRepo(self, repo, destdir, keyurl_list, is_cakey=False, callback=None):
          """
-@@ -4788,6 +5516,18 @@ class YumBase(depsolve.Depsolve):
+@@ -4788,6 +5513,18 @@ class YumBase(depsolve.Depsolve):
          """
  
          key_installed = False
@@ -153307,7 +153322,7 @@ index 99039e0..4650639 100644
          user_cb_fail = False
          for keyurl in keyurl_list:
              keys = self._retrievePublicKey(keyurl, repo, getSig=not is_cakey)
-@@ -4819,8 +5559,11 @@ class YumBase(depsolve.Depsolve):
+@@ -4819,8 +5556,11 @@ class YumBase(depsolve.Depsolve):
                  if not key_installed:
                      self._getKeyImportMessage(info, keyurl, keytype)
                      rc = False
@@ -153320,7 +153335,7 @@ index 99039e0..4650639 100644
                      elif callback:
                          rc = callback({"repo": repo, "userid": info['userid'],
                                          "hexkeyid": info['hexkeyid'], "keyurl": keyurl,
-@@ -4835,7 +5578,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4835,7 +5575,8 @@ class YumBase(depsolve.Depsolve):
                  # Import the key
                  result = misc.import_key_to_pubring(info['raw_key'], info['hexkeyid'], gpgdir=destdir)
                  if not result:
@@ -153330,7 +153345,7 @@ index 99039e0..4650639 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
                  # write out the key id to imported_cakeys in the repos basedir
-@@ -4851,36 +5595,35 @@ class YumBase(depsolve.Depsolve):
+@@ -4851,36 +5592,35 @@ class YumBase(depsolve.Depsolve):
                              pass
  
          if not key_installed and user_cb_fail:
@@ -153383,7 +153398,7 @@ index 99039e0..4650639 100644
          self._getAnyKeyForRepo(repo, repo.gpgcadir, repo.gpgcakey, is_cakey=True, callback=callback)
  
      def _limit_installonly_pkgs(self):
-@@ -4927,6 +5670,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4927,6 +5667,7 @@ class YumBase(depsolve.Depsolve):
          ts = self.rpmdb.readOnlyTS()
          (cur_kernel_v, cur_kernel_r) = misc.get_running_kernel_version_release(ts)
          install_only_names = set(self.conf.installonlypkgs)
@@ -153391,7 +153406,7 @@ index 99039e0..4650639 100644
          for m in self.tsInfo.getMembers():
              if m.ts_state not in ('i', 'u'):
                  continue
-@@ -4937,12 +5681,21 @@ class YumBase(depsolve.Depsolve):
+@@ -4937,12 +5678,21 @@ class YumBase(depsolve.Depsolve):
              if not po_names.intersection(install_only_names):
                  continue
  
@@ -153417,7 +153432,7 @@ index 99039e0..4650639 100644
              for po in installed:
                  if (po.version, po.release) == (cur_kernel_v, cur_kernel_r): 
                      # don't remove running
-@@ -4959,19 +5712,22 @@ class YumBase(depsolve.Depsolve):
+@@ -4959,19 +5709,22 @@ class YumBase(depsolve.Depsolve):
              txmbr.depends_on.append(rel)
  
      def processTransaction(self, callback=None,rpmTestDisplay=None, rpmDisplay=None):
@@ -153453,7 +153468,7 @@ index 99039e0..4650639 100644
          
          if not callback:
              callback = callbacks.ProcessTransNoOutputCallback()
-@@ -5114,13 +5870,19 @@ class YumBase(depsolve.Depsolve):
+@@ -5114,13 +5867,19 @@ class YumBase(depsolve.Depsolve):
          return results
  
      def add_enable_repo(self, repoid, baseurls=[], mirrorlist=None, **kwargs):
@@ -153480,7 +153495,7 @@ index 99039e0..4650639 100644
          # out of place fixme - maybe we should make this the default repo addition
          # routine and use it from getReposFromConfigFile(), etc.
          newrepo = yumRepo.YumRepository(repoid)
-@@ -5167,9 +5929,15 @@ class YumBase(depsolve.Depsolve):
+@@ -5167,9 +5926,15 @@ class YumBase(depsolve.Depsolve):
  
      def setCacheDir(self, force=False, tmpdir=None, reuse=True,
                      suffix='/$basearch/$releasever'):
@@ -153499,7 +153514,7 @@ index 99039e0..4650639 100644
          if not force and os.geteuid() == 0:
              return True # We are root, not forced, so happy with the global dir.
          if tmpdir is None:
-@@ -5179,7 +5947,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5179,7 +5944,7 @@ class YumBase(depsolve.Depsolve):
          try:
              cachedir = misc.getCacheDir(tmpdir, reuse)
          except (IOError, OSError), e:
@@ -153508,7 +153523,7 @@ index 99039e0..4650639 100644
              cachedir = None
              
          if cachedir is None:
-@@ -5190,6 +5958,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5190,6 +5955,7 @@ class YumBase(depsolve.Depsolve):
              self.prerepoconf.cachedir = cachedir
          else:
              self.repos.setCacheDir(cachedir)
@@ -153516,7 +153531,7 @@ index 99039e0..4650639 100644
          self.conf.cachedir = cachedir
          return True # We got a new cache dir
  
-@@ -5220,13 +5989,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5220,13 +5986,24 @@ class YumBase(depsolve.Depsolve):
          self.history.write_addon_data('config-repos', myrepos)
          
      def verify_plugins_cb(self, verify_package):
@@ -153544,7 +153559,7 @@ index 99039e0..4650639 100644
          if self.tsInfo._unresolvedMembers:
              if auto:
                  self.logger.critical(_("Dependencies not solved. Will not save unresolved transaction."))
-@@ -5234,7 +6014,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5234,7 +6011,7 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError(_("Dependencies not solved. Will not save unresolved transaction."))
          
          if not filename:
@@ -153553,7 +153568,7 @@ index 99039e0..4650639 100644
              fd,filename = tempfile.mkstemp(suffix='.yumtx', prefix=prefix)
              f = os.fdopen(fd, 'w')
          else:
-@@ -5244,13 +6024,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5244,13 +6021,17 @@ class YumBase(depsolve.Depsolve):
          
          msg = "%s\n" % self.rpmdb.simpleVersion(main_only=True)[0]
          msg += "%s\n" % self.ts.getTsFlags()
@@ -153574,7 +153589,7 @@ index 99039e0..4650639 100644
          msg += "%s\n" % len(self.tsInfo.getMembers())
          for txmbr in self.tsInfo.getMembers():
              msg += txmbr._dump()
-@@ -5260,13 +6044,25 @@ class YumBase(depsolve.Depsolve):
+@@ -5260,13 +6041,25 @@ class YumBase(depsolve.Depsolve):
          except (IOError, OSError), e:
              self._ts_save_file = None
              if auto:
@@ -153606,7 +153621,7 @@ index 99039e0..4650639 100644
          # check rpmversion - if not match throw a fit
          # check repoversions  (and repos)- if not match throw a fit
          # load each txmbr - if pkgs being updated don't exist, bail w/error
-@@ -5276,26 +6072,45 @@ class YumBase(depsolve.Depsolve):
+@@ -5276,26 +6069,45 @@ class YumBase(depsolve.Depsolve):
          try:
              data = open(filename, 'r').readlines()
          except (IOError, OSError), e:
@@ -153654,7 +153669,7 @@ index 99039e0..4650639 100644
              if ignorerpm:
                  msg += _(" ignoring, as requested.")
                  self.logger.critical(_(msg))
-@@ -5318,8 +6133,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5318,8 +6130,17 @@ class YumBase(depsolve.Depsolve):
          numrepos = int(data[2].strip())
          repos = []
          rindex=3+numrepos
@@ -153673,7 +153688,7 @@ index 99039e0..4650639 100644
  
          # pkgs/txmbrs
          numpkgs = int(data[rindex].strip())
-@@ -5329,6 +6153,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5329,6 +6150,7 @@ class YumBase(depsolve.Depsolve):
          pkgcount = 0
          pkgprob = False
          curpkg = None
@@ -153681,7 +153696,7 @@ index 99039e0..4650639 100644
          for l in data[pkgstart:]:
              l = l.rstrip()
              # our main txmbrs
-@@ -5438,6 +6263,11 @@ class YumBase(depsolve.Depsolve):
+@@ -5438,6 +6260,11 @@ class YumBase(depsolve.Depsolve):
                  msg += _(" aborting.")
                  raise Errors.YumBaseError(msg)
              
@@ -153693,7 +153708,7 @@ index 99039e0..4650639 100644
          return self.tsInfo.getMembers()
  
      def _remove_old_deps(self):
-@@ -5470,18 +6300,6 @@ class YumBase(depsolve.Depsolve):
+@@ -5470,18 +6297,6 @@ class YumBase(depsolve.Depsolve):
                      if requiring == required: # if they are self-requiring skip them
                          continue
                          
@@ -153712,7 +153727,7 @@ index 99039e0..4650639 100644
                      #for tbi_pkg in self.tsInfo.getMembersWithState(output_states=TS_INSTALL_STATES):
                      #   for reqtuple in tbi_pkg.po.requires:
                      #        if required.provides_for(reqtuple):
-@@ -5533,7 +6351,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5533,7 +6348,24 @@ class YumBase(depsolve.Depsolve):
                      # Debugging output
                      self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has revdep %s which was user-installed."), pkg, curpkg)
                      ok_to_remove[pkg] = False
@@ -153737,7 +153752,7 @@ index 99039e0..4650639 100644
                  visited[curpkg] = True
              all_leaves_visited = True
              leaves = curpkg.requiring_packages()
-@@ -5547,4 +6382,3 @@ class YumBase(depsolve.Depsolve):
+@@ -5547,4 +6379,3 @@ class YumBase(depsolve.Depsolve):
          # Debugging output
          self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has no user-installed revdeps."), pkg)
          return False
@@ -156165,7 +156180,7 @@ index aaa4f25..51895fd 100755
                  continue
  
 diff --git a/yum/misc.py b/yum/misc.py
-index 2f6ddfe..59aff5d 100644
+index 2f6ddfe..968b5eb 100644
 --- a/yum/misc.py
 +++ b/yum/misc.py
 @@ -8,6 +8,7 @@ import os
@@ -156245,7 +156260,7 @@ index 2f6ddfe..59aff5d 100644
  
  
  def get_my_lang_code():
-@@ -1105,17 +1129,26 @@ def decompress(filename, dest=None, fn_only=False, check_timestamps=False):
+@@ -1105,17 +1129,28 @@ def decompress(filename, dest=None, fn_only=False, check_timestamps=False):
              out = filename.replace('.xz', '')
          
      else:
@@ -156262,7 +156277,9 @@ index 2f6ddfe..59aff5d 100644
 +        fi = stat_f(filename)
 +        fo = stat_f(out)
 +        if fi and fo:
-+            if fo.st_mtime == fi.st_mtime:
++            # Eliminate sub second precision in mtime before comparision,
++            # see http://bugs.python.org/issue14127
++            if int(fo.st_mtime) == int(fi.st_mtime):
                  return out
 +            if fn_only:
 +                # out exists but not valid
@@ -156302,10 +156319,29 @@ index 4af563a..47832fc 100644
          self.obsoletes = {} #obs[obsoletename] = [pkg1, pkg2, pkg3] 
                   #the package lists are packages that obsolete the key name
 diff --git a/yum/packages.py b/yum/packages.py
-index 5ef9951..da31971 100644
+index 5ef9951..f67169f 100644
 --- a/yum/packages.py
 +++ b/yum/packages.py
-@@ -243,34 +243,87 @@ class PackageObject(object):
+@@ -106,14 +106,16 @@ def buildPkgRefDict(pkgs, casematch=True):
+     return pkgdict
+        
+ def parsePackages(pkgs, usercommands, casematch=0,
+-                  unique='repo-epoch-name-version-release-arch'):
++                  unique='repo-epoch-name-version-release-arch',
++                  pkgdict=None):
+     """matches up the user request versus a pkg list:
+        for installs/updates available pkgs should be the 'others list' 
+        for removes it should be the installed list of pkgs
+        takes an optional casematch option to determine if case should be matched
+        exactly. Defaults to not matching."""
+ 
+-    pkgdict = buildPkgRefDict(pkgs, bool(casematch))
++    if pkgdict is None:
++        pkgdict = buildPkgRefDict(pkgs, bool(casematch))
+     exactmatch = []
+     matched = []
+     unmatched = []
+@@ -243,34 +245,87 @@ class PackageObject(object):
          
      def _ui_envra(self):
          if self.epoch == '0':
@@ -156413,7 +156449,7 @@ index 5ef9951..da31971 100644
      def __str__(self):
          return self.ui_envra
  
-@@ -481,15 +534,14 @@ class RpmBase(object):
+@@ -481,15 +536,14 @@ class RpmBase(object):
              if prcotuple in self._prco_lookup[prcotype]:
                  return 1
  
@@ -156437,7 +156473,7 @@ index 5ef9951..da31971 100644
  
          return 0
  
-@@ -611,15 +663,18 @@ class RpmBase(object):
+@@ -611,15 +665,18 @@ class RpmBase(object):
      dirlist = property(fget=lambda self: self.returnFileEntries(ftype='dir'))
      ghostlist = property(fget=lambda self: self.returnFileEntries(ftype='ghost'))
      requires = property(fget=lambda self: self.returnPrco('requires'))
@@ -156456,7 +156492,7 @@ index 5ef9951..da31971 100644
      conflicts_print = property(fget=lambda self: self.returnPrco('conflicts', True))
      obsoletes_print = property(fget=lambda self: self.returnPrco('obsoletes', True))
      changelog = property(fget=lambda self: self.returnChangelog())
-@@ -1083,7 +1138,7 @@ class YumAvailablePackage(PackageObject, RpmBase):
+@@ -1083,7 +1140,7 @@ class YumAvailablePackage(PackageObject, RpmBase):
           misc.to_unicode(misc.to_xml(self.summary)), 
           misc.to_unicode(misc.to_xml(self.description)), 
           packager, url, self.filetime, 
@@ -156465,7 +156501,7 @@ index 5ef9951..da31971 100644
          
          msg += self._return_remote_location()
          return msg
-@@ -1133,7 +1188,7 @@ class YumAvailablePackage(PackageObject, RpmBase):
+@@ -1133,7 +1190,7 @@ class YumAvailablePackage(PackageObject, RpmBase):
          msg = ""
          mylist = getattr(self, pcotype)
          if mylist: msg = "\n    <rpm:%s>\n" % pcotype
@@ -156474,7 +156510,7 @@ index 5ef9951..da31971 100644
              pcostring = '''      <rpm:entry name="%s"''' % misc.to_xml(name, attrib=True)
              if flags:
                  pcostring += ''' flags="%s"''' % misc.to_xml(flags, attrib=True)
-@@ -1161,11 +1216,11 @@ class YumAvailablePackage(PackageObject, RpmBase):
+@@ -1161,11 +1218,11 @@ class YumAvailablePackage(PackageObject, RpmBase):
              dirs = self.returnFileEntries('dir', primary_only=True)
              ghosts = self.returnFileEntries('ghost', primary_only=True)
                  
@@ -156489,7 +156525,7 @@ index 5ef9951..da31971 100644
              msg += """    <file type="ghost">%s</file>\n""" % misc.to_xml(fn)
          
          return msg
-@@ -1194,8 +1249,8 @@ class YumAvailablePackage(PackageObject, RpmBase):
+@@ -1194,8 +1251,8 @@ class YumAvailablePackage(PackageObject, RpmBase):
                          continue
                      newlist.append(i)
                  mylist = newlist
@@ -156500,7 +156536,7 @@ index 5ef9951..da31971 100644
              if name.startswith('rpmlib('):
                  continue
              # this drops out requires that the pkg provides for itself.
-@@ -1217,13 +1272,16 @@ class YumAvailablePackage(PackageObject, RpmBase):
+@@ -1217,13 +1274,16 @@ class YumAvailablePackage(PackageObject, RpmBase):
                      prcostring += ''' ver="%s"''' % misc.to_xml(v, attrib=True)
                  if r:
                      prcostring += ''' rel="%s"''' % misc.to_xml(r, attrib=True)
@@ -156519,7 +156555,7 @@ index 5ef9951..da31971 100644
          return msg
  
      def _dump_changelog(self, clog_limit):
-@@ -1272,6 +1330,13 @@ class YumAvailablePackage(PackageObject, RpmBase):
+@@ -1272,6 +1332,13 @@ class YumAvailablePackage(PackageObject, RpmBase):
          return misc.to_utf8(msg)
  
  
@@ -156533,7 +156569,7 @@ index 5ef9951..da31971 100644
  
  #  This is a tweak on YumAvailablePackage() and is a base class for packages
  # which are actual rpms.
-@@ -1299,7 +1364,8 @@ class YumHeaderPackage(YumAvailablePackage):
+@@ -1299,7 +1366,8 @@ class YumHeaderPackage(YumAvailablePackage):
          self.pkgid = self.hdr[rpm.RPMTAG_SHA1HEADER]
          if not self.pkgid:
              self.pkgid = "%s.%s" %(self.hdr['name'], self.hdr['buildtime'])
@@ -156543,7 +156579,7 @@ index 5ef9951..da31971 100644
          self.__mode_cache = {}
          self.__prcoPopulated = False
  
-@@ -1353,6 +1419,12 @@ class YumHeaderPackage(YumAvailablePackage):
+@@ -1353,6 +1421,12 @@ class YumHeaderPackage(YumAvailablePackage):
                  continue
  
              lst = hdr[getattr(rpm, 'RPMTAG_%sFLAGS' % tag)]
@@ -156556,7 +156592,7 @@ index 5ef9951..da31971 100644
              flag = map(rpmUtils.miscutils.flagToString, lst)
              flag = map(misc.share_data, flag)
  
-@@ -1363,6 +1435,10 @@ class YumHeaderPackage(YumAvailablePackage):
+@@ -1363,6 +1437,10 @@ class YumHeaderPackage(YumAvailablePackage):
  
              prcotype = tag2prco[tag]
              self.prco[prcotype] = map(misc.share_data, zip(name,flag,vers))
@@ -156567,7 +156603,7 @@ index 5ef9951..da31971 100644
      
      def tagByName(self, tag):
          warnings.warn("tagByName() will go away in a furture version of Yum.\n",
-@@ -1447,7 +1523,7 @@ class YumHeaderPackage(YumAvailablePackage):
+@@ -1447,7 +1525,7 @@ class YumHeaderPackage(YumAvailablePackage):
          raise NotImplementedError()
  
      def _size(self):
@@ -157162,7 +157198,7 @@ index bfc49b7..9ddcae6 100644
      b = parsever(b)
  
 diff --git a/yum/repos.py b/yum/repos.py
-index 3793bad..4b1d52e 100644
+index 3793bad..3cbbe25 100644
 --- a/yum/repos.py
 +++ b/yum/repos.py
 @@ -22,6 +22,7 @@ import misc
@@ -157173,7 +157209,7 @@ index 3793bad..4b1d52e 100644
  
  from weakref import proxy as weakref
  
-@@ -67,6 +68,38 @@ class RepoStorage:
+@@ -67,6 +68,40 @@ class RepoStorage:
          self._cache_enabled_repos = []
          self.quick_enable_disable = {}
  
@@ -157187,13 +157223,15 @@ index 3793bad..4b1d52e 100644
 +
 +        repos = []
 +        for repo in self.listEnabled():
++            if repo.cache:
++                continue
 +            if repo._async and repo._commonLoadRepoXML(repo):
 +                mdtypes = repo._mdpolicy2mdtypes()
 +                downloading = repo._commonRetrieveDataMD_list(mdtypes)
 +                repos.append((repo, downloading, [False]))
 +
 +        # with sizes first, then without sizes..
-+	for no_size in (False, True):
++        for no_size in (False, True):
 +            for repo, downloading, error in repos:
 +                def failfunc(obj, error=error):
 +                    error[0] = True
@@ -157212,7 +157250,7 @@ index 3793bad..4b1d52e 100644
      def doSetup(self, thisrepo = None):
          
          self.ayum.plugins.run('prereposetup')
-@@ -89,6 +122,7 @@ class RepoStorage:
+@@ -89,6 +124,7 @@ class RepoStorage:
                  self.disableRepo(repo.id)
                  
          self._setup = True
@@ -157220,7 +157258,7 @@ index 3793bad..4b1d52e 100644
          self.ayum.plugins.run('postreposetup')
          
      def __str__(self):
-@@ -223,8 +257,9 @@ class RepoStorage:
+@@ -223,8 +259,9 @@ class RepoStorage:
          
          self._cachedir = cachedir
          for repo in self.repos.values():
@@ -157232,13 +157270,15 @@ index 3793bad..4b1d52e 100644
  
  
      def setProgressBar(self, obj):
-@@ -288,6 +323,14 @@ class RepoStorage:
+@@ -288,6 +325,16 @@ class RepoStorage:
          else:
              data = [ mdtype ]
           
 +        if hasattr(urlgrabber.grabber, 'parallel_wait'):
 +            # download all metadata in parallel
 +            for repo in myrepos:
++                if repo.cache:
++                    continue
 +                if repo._async:
 +                    sack = repo.getPackageSack()
 +                    sack._retrieve_async(repo, data)
@@ -157561,7 +157601,7 @@ index 2cb1acb..7da6a08 100644
          self._md[item] = val
  
 diff --git a/yum/yumRepo.py b/yum/yumRepo.py
-index e5e9ece..57a1a29 100644
+index e5e9ece..1cb4ae2 100644
 --- a/yum/yumRepo.py
 +++ b/yum/yumRepo.py
 @@ -20,10 +20,12 @@ import time
@@ -157647,7 +157687,7 @@ index e5e9ece..57a1a29 100644
 +                #  Use generated dir. and handle compression types metadata
 +                # parser doesn't understand.
 +                gen = mymdtype + '.xml'
-+                ret = misc.repo_gen_decompress(xml, gen, cached=repo.cache)
++                ret = misc.repo_gen_decompress(xml, gen)
 +                if not ret:
 +                    raise URLGrabError(-1, 'Decompress DB failed')
 +                xml = ret
@@ -157655,7 +157695,7 @@ index e5e9ece..57a1a29 100644
                  xmldata = repo.repoXML.getData(mymdtype)
                  (ctype, csum) = xmldata.checksum
                  dobj = repo_cache_function(xml, csum)
-@@ -193,6 +244,25 @@ class YumPackageSack(packageSack.PackageSack):
+@@ -193,6 +244,24 @@ class YumPackageSack(packageSack.PackageSack):
          # get rid of all this stuff we don't need now
          del repo.cacheHandler
  
@@ -157672,8 +157712,7 @@ index e5e9ece..57a1a29 100644
 +                             check_can_fail=fast, fast=fast):
 +            return None
 +
-+        ret = misc.repo_gen_decompress(compressed_fn, db_un_fn,
-+                                       cached=repo.cache)
++        ret = misc.repo_gen_decompress(compressed_fn, db_un_fn)
 +        if ret:
 +            return self._check_uncompressed_db_fn(repo, mdtype, ret)
 +        return None
@@ -157681,7 +157720,7 @@ index e5e9ece..57a1a29 100644
      def _check_uncompressed_db(self, repo, mdtype):
          """return file name of uncompressed db is good, None if not"""
          mydbdata = repo.repoXML.getData(mdtype)
-@@ -201,9 +271,11 @@ class YumPackageSack(packageSack.PackageSack):
+@@ -201,9 +270,11 @@ class YumPackageSack(packageSack.PackageSack):
          compressed_fn = repo.cachedir + '/' + fname
          db_un_fn = misc.decompress(compressed_fn, fn_only=True)
  
@@ -157694,7 +157733,7 @@ index e5e9ece..57a1a29 100644
          if os.path.exists(db_un_fn):
              if skip_old_DBMD_check and repo._using_old_MD:
                  return db_un_fn
-@@ -285,6 +357,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -285,6 +356,7 @@ class YumRepository(Repository, config.RepoConf):
  
          self._grabfunc = None
          self._grab = None
@@ -157702,7 +157741,7 @@ index e5e9ece..57a1a29 100644
  
      def __cmp__(self, other):
          """ Sort yum repos. by cost, and then by alphanumeric on their id. """
-@@ -431,25 +504,18 @@ class YumRepository(Repository, config.RepoConf):
+@@ -431,25 +503,18 @@ class YumRepository(Repository, config.RepoConf):
          self._proxy_dict = {} # zap it
          proxy_string = None
          empty = (None, '_none_', '')
@@ -157736,7 +157775,7 @@ index e5e9ece..57a1a29 100644
  
          if proxy_string is not None:
              self._proxy_dict['http'] = proxy_string
-@@ -488,8 +554,20 @@ class YumRepository(Repository, config.RepoConf):
+@@ -488,8 +553,20 @@ class YumRepository(Repository, config.RepoConf):
                                      copy_local=self.copy_local,
                                      reget='simple',
                                      **ugopts)
@@ -157758,7 +157797,7 @@ index e5e9ece..57a1a29 100644
                               failure_callback=self.mirror_failure_obj)
  
      def _default_grabopts(self, cache=True):
-@@ -499,6 +577,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -499,6 +576,7 @@ class YumRepository(Repository, config.RepoConf):
                   'throttle': self.throttle,
                   'proxies': self.proxy_dict,
                   'timeout': self.timeout,
@@ -157766,7 +157805,17 @@ index e5e9ece..57a1a29 100644
                   'http_headers': tuple(self.__headersListFromDict(cache=cache)),
                   'ssl_verify_peer': self.sslverify,
                   'ssl_verify_host': self.sslverify,
-@@ -751,7 +830,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -531,9 +609,6 @@ class YumRepository(Repository, config.RepoConf):
+         if os.path.exists(dpath) and os.path.isdir(dpath):
+             return
+ 
+-        if self.cache:
+-            raise Errors.RepoError, "Cannot access repository dir %s" % dpath
+-
+         try:
+             os.makedirs(dpath, mode=0755)
+         except OSError, e:
+@@ -751,7 +826,7 @@ class YumRepository(Repository, config.RepoConf):
  
      def _getFile(self, url=None, relative=None, local=None, start=None, end=None,
              copy_local=None, checkfunc=None, text=None, reget='simple', 
@@ -157775,7 +157824,7 @@ index e5e9ece..57a1a29 100644
          """retrieve file from the mirrorgroup for the repo
             relative to local, optionally get range from
             start to end, also optionally retrieve from a specific baseurl"""
-@@ -796,6 +875,16 @@ class YumRepository(Repository, config.RepoConf):
+@@ -796,6 +871,16 @@ class YumRepository(Repository, config.RepoConf):
              except Errors.MediaError, e:
                  verbose_logger.log(logginglevels.DEBUG_2, "Error getting package from media; falling back to url %s" %(e,))
  
@@ -157792,7 +157841,7 @@ index e5e9ece..57a1a29 100644
          if url and scheme != "media":
              ugopts = self._default_grabopts(cache=cache)
              ug = URLGrabber(progress_obj = self.callback,
-@@ -835,7 +924,8 @@ class YumRepository(Repository, config.RepoConf):
+@@ -835,7 +920,8 @@ class YumRepository(Repository, config.RepoConf):
                                             reget = reget,
                                             checkfunc=checkfunc,
                                             http_headers=headers,
@@ -157802,7 +157851,7 @@ index e5e9ece..57a1a29 100644
                                             )
              except URLGrabError, e:
                  errstr = "failure: %s from %s: %s" % (relative, self.id, e)
-@@ -847,7 +937,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -847,7 +933,7 @@ class YumRepository(Repository, config.RepoConf):
          return result
      __get = _getFile
  
@@ -157811,7 +157860,7 @@ index e5e9ece..57a1a29 100644
          remote = package.relativepath
          local = package.localPkg()
          basepath = package.basepath
-@@ -864,6 +954,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -864,6 +950,7 @@ class YumRepository(Repository, config.RepoConf):
                          text=text,
                          cache=cache,
                          size=package.size,
@@ -157819,7 +157868,7 @@ index e5e9ece..57a1a29 100644
                          )
  
      def getHeader(self, package, checkfunc = None, reget = 'simple',
-@@ -1020,7 +1111,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1020,7 +1107,7 @@ class YumRepository(Repository, config.RepoConf):
              if grab_can_fail:
                  return None
              raise Errors.RepoError, 'Error downloading file %s: %s' % (local, e)
@@ -157828,7 +157877,7 @@ index e5e9ece..57a1a29 100644
              misc.unlink_f(tfname)
              if grab_can_fail:
                  return None
-@@ -1260,6 +1351,9 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1260,6 +1347,9 @@ class YumRepository(Repository, config.RepoConf):
          return True
  
      def _check_db_version(self, mdtype, repoXML=None):
@@ -157838,7 +157887,7 @@ index e5e9ece..57a1a29 100644
          if repoXML is None:
              repoXML = self.repoXML
          if mdtype in repoXML.repoData:
-@@ -1277,11 +1371,11 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1277,11 +1367,11 @@ class YumRepository(Repository, config.RepoConf):
              return None
  
          if not file_check:
@@ -157853,7 +157902,7 @@ index e5e9ece..57a1a29 100644
              if not os.path.exists(local):
                  local = misc.decompress(local, fn_only=True)
                  compressed = True
-@@ -1302,6 +1396,17 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1302,6 +1392,17 @@ class YumRepository(Repository, config.RepoConf):
              into the delete list, this means metadata can change filename
              without us leaking it. """
  
@@ -157871,7 +157920,7 @@ index e5e9ece..57a1a29 100644
          def _mdtype_eq(omdtype, odata, nmdtype, ndata):
              """ Check if two returns from _get_mdtype_data() are equal. """
              if ndata is None:
-@@ -1333,8 +1438,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1333,8 +1434,7 @@ class YumRepository(Repository, config.RepoConf):
  
          # Inited twice atm. ... sue me
          self._oldRepoMDData['new_MD_files'] = []
@@ -157881,7 +157930,7 @@ index e5e9ece..57a1a29 100644
          for mdtype in all_mdtypes:
              (nmdtype, ndata) = self._get_mdtype_data(mdtype)
  
-@@ -1371,43 +1475,16 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1371,43 +1471,16 @@ class YumRepository(Repository, config.RepoConf):
              # No old repomd data, but we might still have uncompressed MD
              if self._groupCheckDataMDValid(ndata, nmdtype, mdtype):
                  continue
@@ -157896,7 +157945,9 @@ index e5e9ece..57a1a29 100644
 -        if len(downloading_with_size) == 1:
 -            downloading_no_size.extend(downloading_with_size)
 -            downloading_with_size = []
--
++    def _commonRetrieveDataMD_done(self, downloading):
++        """ Uncompress the downloaded metadata """
+ 
 -        remote_size = 0
 -        local_size  = 0
 -        for (ndata, nmdtype) in downloading_with_size: # Get total size...
@@ -157913,9 +157964,7 @@ index e5e9ece..57a1a29 100644
 -            if not self._retrieveMD(nmdtype, retrieve_can_fail=True):
 -                self._revertOldRepoXML()
 -                return False
-+    def _commonRetrieveDataMD_done(self, downloading):
-+        """ Uncompress the downloaded metadata """
- 
+-
 -        for (ndata, nmdtype) in downloading_with_size + downloading_no_size:
 +        for (ndata, nmdtype) in downloading:
              local = self._get_mdtype_fname(ndata, False)
@@ -157930,7 +157979,7 @@ index e5e9ece..57a1a29 100644
  
      def _groupLoadRepoXML(self, text=None, mdtypes=None):
          """ Retrieve the new repomd.xml from the repository, then check it
-@@ -1421,7 +1498,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1421,7 +1494,7 @@ class YumRepository(Repository, config.RepoConf):
              self._commonRetrieveDataMD(mdtypes)
  
      def _mdpolicy2mdtypes(self):
@@ -157939,7 +157988,7 @@ index e5e9ece..57a1a29 100644
                       'group:primary' : ['primary'],
                       'group:small'   : ["primary", "updateinfo"],
                       'group:main'    : ["primary", "group", "filelists",
-@@ -1436,6 +1513,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1436,6 +1509,7 @@ class YumRepository(Repository, config.RepoConf):
          if not mdtypes or 'group:all' in mdtypes:
              mdtypes = None
          else:
@@ -157947,7 +157996,7 @@ index e5e9ece..57a1a29 100644
              mdtypes = sorted(list(mdtypes))
          return mdtypes
  
-@@ -1451,12 +1529,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1451,12 +1525,7 @@ class YumRepository(Repository, config.RepoConf):
      def _getRepoXML(self):
          if self._repoXML:
              return self._repoXML
@@ -157961,7 +158010,7 @@ index e5e9ece..57a1a29 100644
          return self._repoXML
  
  
-@@ -1514,7 +1587,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1514,7 +1583,7 @@ class YumRepository(Repository, config.RepoConf):
          return self._checkMD(fn, mdtype, openchecksum)
  
      def _checkMD(self, fn, mdtype, openchecksum=False,
@@ -157970,7 +158019,7 @@ index e5e9ece..57a1a29 100644
          """ Internal function, use .checkMD() from outside yum. """
  
          thisdata = data # So the argument name is nicer
-@@ -1537,6 +1610,18 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1537,6 +1606,18 @@ class YumRepository(Repository, config.RepoConf):
          if size is not None:
              size = int(size)
  
@@ -157989,7 +158038,7 @@ index e5e9ece..57a1a29 100644
          try: # get the local checksum
              l_csum = self._checksum(r_ctype, file, datasize=size)
          except Errors.RepoError, e:
-@@ -1551,15 +1636,13 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1551,15 +1632,13 @@ class YumRepository(Repository, config.RepoConf):
                  return None
              raise URLGrabError(-1, 'Metadata file does not match checksum')
  
@@ -158006,9 +158055,29 @@ index e5e9ece..57a1a29 100644
          """ Internal function, use .retrieveMD() from outside yum. """
          #  Note that this can raise Errors.RepoMDError if mdtype doesn't exist
          # for this repo.
-@@ -1597,7 +1680,9 @@ class YumRepository(Repository, config.RepoConf):
-                 return local # it's the same return the local one
+@@ -1575,6 +1654,12 @@ class YumRepository(Repository, config.RepoConf):
+             # got it, move along
+             return local
  
++        if (os.path.exists(local) or
++            self._preload_md_from_system_cache(os.path.basename(local))):
++            if self._checkMD(local, mdtype, check_can_fail=True):
++                self.retrieved[mdtype] = 1
++                return local # it's the same return the local one
++
+         if self.cache == 1:
+             if os.path.exists(local):
+                 try:
+@@ -1590,14 +1675,10 @@ class YumRepository(Repository, config.RepoConf):
+                     "Caching enabled but no local cache of %s from %s" % (local,
+                            self)
+ 
+-        if (os.path.exists(local) or
+-            self._preload_md_from_system_cache(os.path.basename(local))):
+-            if self._checkMD(local, mdtype, check_can_fail=True):
+-                self.retrieved[mdtype] = 1
+-                return local # it's the same return the local one
+-
          try:
 -            checkfunc = (self.checkMD, (mdtype,), {})
 +            def checkfunc(obj):
@@ -158017,7 +158086,7 @@ index e5e9ece..57a1a29 100644
              text = "%s/%s" % (self.id, mdtype)
              if thisdata.size is None:
                  reget = None
-@@ -1613,8 +1698,9 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1613,8 +1694,9 @@ class YumRepository(Repository, config.RepoConf):
                                    checkfunc=checkfunc, 
                                    text=text,
                                    cache=self.http_caching == 'all',
@@ -158029,7 +158098,7 @@ index e5e9ece..57a1a29 100644
              if retrieve_can_fail:
                  return None
              raise
-@@ -1624,7 +1710,6 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1624,7 +1706,6 @@ class YumRepository(Repository, config.RepoConf):
              raise Errors.RepoError, \
                  "Could not retrieve %s matching remote checksum from %s" % (local, self)
          else:
diff --git a/yum.spec b/yum.spec
index aac80d8..8ba36c5 100644
--- a/yum.spec
+++ b/yum.spec
@@ -18,7 +18,7 @@
 Summary: RPM package installer/updater/manager
 Name: yum
 Version: 3.4.3
-Release: 27%{?dist}
+Release: 28%{?dist}
 License: GPLv2+
 Group: System Environment/Base
 Source0: http://yum.baseurl.org/download/3.4/%{name}-%{version}.tar.gz
@@ -313,6 +313,12 @@ exit 0
 %endif
 
 %changelog
+* Thu Jun 14 2012 Zdenek Pavlas <zpavlas at redhat.com> - 3.4.3-28
+- update to latest HEAD.
+- No async downloading when --cacheonly.  BZ 830523
+- misc.decompress(): compare mtime without sub second precision. BZ 831918
+- preload_from_sys to user dir with --cacheonly, BZ 830523
+
 * Fri Jun  8 2012 James Antill <james at fedoraproject.org> - 3.4.3-27
 - update to latest HEAD.
 - Fix for ppc64p7 detection.


More information about the scm-commits mailing list