[yum] update to latest HEAD

James Antill james at fedoraproject.org
Tue Apr 8 13:40:32 UTC 2014


commit 50e204e778dd2454456460b680dbacb4fbf3f19d
Author: James Antill <james at and.org>
Date:   Tue Apr 8 09:40:18 2014 -0400

    update to latest HEAD
    
    - Fix for weird anaconda C NULL exception traceback. BZ 1058297.
    - Fix apkgs setup for removing packages. BZ 1019960.
    - Fix typo, so we can find the suggests/etc. tables.
    - Change 'size' option to 'maxsize' in yum.logrotate. BZ 1005879.
    - Mask st_mode to fix verifying permissions for ghost files. BZ 1045415.
    - normpath() file URIs. BZ 1009499.

 yum-HEAD.patch |  378 +++++++++++++++++++++++++++++++-------------------------
 yum.spec       |   11 ++-
 2 files changed, 220 insertions(+), 169 deletions(-)
---
diff --git a/yum-HEAD.patch b/yum-HEAD.patch
index e64a7c5..49b50b9 100644
--- a/yum-HEAD.patch
+++ b/yum-HEAD.patch
@@ -5310,6 +5310,19 @@ index f1e06e8..fa99eb7 100644
  } &&
  complete -F _yum -o filenames yum yummain.py
  
+diff --git a/etc/yum.logrotate b/etc/yum.logrotate
+index e587f96..e716c01 100644
+--- a/etc/yum.logrotate
++++ b/etc/yum.logrotate
+@@ -1,7 +1,7 @@
+ /var/log/yum.log {
+     missingok
+     notifempty
+-    size 30k
++    maxsize 30k
+     yearly
+     create 0600 root root
+ }
 diff --git a/output.py b/output.py
 index b6aa277..2787d86 100755
 --- a/output.py
@@ -187046,7 +187059,7 @@ index c1af4ad..2c2f022 100644
      pass
      
 diff --git a/yum/__init__.py b/yum/__init__.py
-index 99039e0..84ca658 100644
+index 99039e0..ac01435 100644
 --- a/yum/__init__.py
 +++ b/yum/__init__.py
 @@ -21,6 +21,7 @@ The Yum RPM software updater.
@@ -187379,7 +187392,11 @@ index 99039e0..84ca658 100644
          # Read .repo files from directories specified by the reposdir option
          # (typically /etc/yum/repos.d)
          repo_config_age = self.conf.config_file_age
-@@ -466,18 +565,22 @@ class YumBase(depsolve.Depsolve):
+@@ -463,21 +562,26 @@ class YumBase(depsolve.Depsolve):
+             # if we don't do this then anaconda likes to not  work.
+             if os.path.exists(self.conf.installroot+'/'+reposdir):
+                 reposdir = self.conf.installroot + '/' + reposdir
++            reposdir = os.path.normpath(reposdir)
  
              if os.path.isdir(reposdir):
                  for repofn in sorted(glob.glob('%s/*.repo' % reposdir)):
@@ -187407,7 +187424,7 @@ index 99039e0..84ca658 100644
          repo = yumRepo.YumRepository(section)
          try:
              repo.populate(parser, section, self.conf)
-@@ -493,38 +596,40 @@ class YumBase(depsolve.Depsolve):
+@@ -493,38 +597,40 @@ class YumBase(depsolve.Depsolve):
          repo.name = to_unicode(repo.name)
  
          # Set attributes not from the config file
@@ -187470,7 +187487,7 @@ index 99039e0..84ca658 100644
          if isinstance(self.plugins, plugins.YumPlugins):
              raise RuntimeError(_("plugins already initialised"))
  
-@@ -533,6 +638,8 @@ class YumBase(depsolve.Depsolve):
+@@ -533,6 +639,8 @@ class YumBase(depsolve.Depsolve):
  
      
      def doRpmDBSetup(self):
@@ -187479,7 +187496,7 @@ index 99039e0..84ca658 100644
          warnings.warn(_('doRpmDBSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -552,7 +659,8 @@ class YumBase(depsolve.Depsolve):
+@@ -552,7 +660,8 @@ class YumBase(depsolve.Depsolve):
          return self._rpmdb
  
      def closeRpmDB(self):
@@ -187489,7 +187506,7 @@ index 99039e0..84ca658 100644
          if self._rpmdb is not None:
              self._rpmdb.ts = None
              self._rpmdb.dropCachedData()
-@@ -561,12 +669,19 @@ class YumBase(depsolve.Depsolve):
+@@ -561,12 +670,19 @@ class YumBase(depsolve.Depsolve):
          self._tsInfo = None
          self._up = None
          self.comps = None
@@ -187509,7 +187526,7 @@ index 99039e0..84ca658 100644
          warnings.warn(_('doRepoSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -577,6 +692,12 @@ class YumBase(depsolve.Depsolve):
+@@ -577,6 +693,12 @@ class YumBase(depsolve.Depsolve):
          if hasattr(self, 'prerepoconf'):
              self.conf # touch the config class first
  
@@ -187522,7 +187539,7 @@ index 99039e0..84ca658 100644
              self.getReposFromConfig()
  
          #  For rhnplugin, and in theory other stuff, calling
-@@ -588,7 +709,8 @@ class YumBase(depsolve.Depsolve):
+@@ -588,7 +710,8 @@ class YumBase(depsolve.Depsolve):
              prerepoconf = self.prerepoconf
              del self.prerepoconf
  
@@ -187532,7 +187549,7 @@ index 99039e0..84ca658 100644
              self.repos.callback = prerepoconf.callback
              self.repos.setFailureCallback(prerepoconf.failure_callback)
              self.repos.setInterruptCallback(prerepoconf.interrupt_callback)
-@@ -602,24 +724,6 @@ class YumBase(depsolve.Depsolve):
+@@ -602,24 +725,6 @@ class YumBase(depsolve.Depsolve):
  
  
          if doSetup:
@@ -187557,7 +187574,7 @@ index 99039e0..84ca658 100644
              repo_st = time.time()        
              self._repos.doSetup(thisrepo)
              self.verbose_logger.debug('repo time: %0.3f' % (time.time() - repo_st))        
-@@ -630,6 +734,14 @@ class YumBase(depsolve.Depsolve):
+@@ -630,6 +735,14 @@ class YumBase(depsolve.Depsolve):
          self._repos = RepoStorage(self)
      
      def doSackSetup(self, archlist=None, thisrepo=None):
@@ -187572,7 +187589,7 @@ index 99039e0..84ca658 100644
          warnings.warn(_('doSackSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -711,6 +823,9 @@ class YumBase(depsolve.Depsolve):
+@@ -711,6 +824,9 @@ class YumBase(depsolve.Depsolve):
              
             
      def doUpdateSetup(self):
@@ -187582,7 +187599,7 @@ index 99039e0..84ca658 100644
          warnings.warn(_('doUpdateSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -765,6 +880,8 @@ class YumBase(depsolve.Depsolve):
+@@ -765,6 +881,8 @@ class YumBase(depsolve.Depsolve):
          return self._up
      
      def doGroupSetup(self):
@@ -187591,7 +187608,7 @@ index 99039e0..84ca658 100644
          warnings.warn(_('doGroupSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -776,7 +893,12 @@ class YumBase(depsolve.Depsolve):
+@@ -776,7 +894,12 @@ class YumBase(depsolve.Depsolve):
              # if we unset the comps object, we need to undo which repos have
              # been added to the group file as well
              if self._repos:
@@ -187605,7 +187622,7 @@ index 99039e0..84ca658 100644
                      repo.groups_added = False
          self._comps = val
      
-@@ -813,6 +935,21 @@ class YumBase(depsolve.Depsolve):
+@@ -813,6 +936,21 @@ class YumBase(depsolve.Depsolve):
          overwrite = self.conf.overwrite_groups
          self._comps = comps.Comps(overwrite_groups = overwrite)
  
@@ -187627,7 +187644,7 @@ index 99039e0..84ca658 100644
          for repo in reposWithGroups:
              if repo.groups_added: # already added the groups from this repo
                  continue
-@@ -820,16 +957,14 @@ class YumBase(depsolve.Depsolve):
+@@ -820,16 +958,14 @@ class YumBase(depsolve.Depsolve):
              self.verbose_logger.log(logginglevels.DEBUG_4,
                  _('Adding group file from repository: %s'), repo)
              groupfile = repo.getGroups()
@@ -187649,7 +187666,7 @@ index 99039e0..84ca658 100644
                  self.logger.critical(msg)
              else:
                  repo.groups_added = True
-@@ -837,7 +972,10 @@ class YumBase(depsolve.Depsolve):
+@@ -837,7 +973,10 @@ class YumBase(depsolve.Depsolve):
          if self._comps.compscount == 0:
              raise Errors.GroupsError, _('No Groups Available in any repository')
  
@@ -187661,7 +187678,7 @@ index 99039e0..84ca658 100644
          self.verbose_logger.debug('group time: %0.3f' % (time.time() - group_st))                
          return self._comps
  
-@@ -868,22 +1006,72 @@ class YumBase(depsolve.Depsolve):
+@@ -868,22 +1007,72 @@ class YumBase(depsolve.Depsolve):
                      # feed it into _tags.add()
                      self._tags.add(repo.id, tag_sqlite)
                  except (Errors.RepoError, Errors.PkgTagsError), e:
@@ -187736,7 +187753,7 @@ index 99039e0..84ca658 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,16 +1109,31 @@ class YumBase(depsolve.Depsolve):
+@@ -921,16 +1110,31 @@ class YumBase(depsolve.Depsolve):
                         fdel=lambda self: setattr(self, "_history", None),
                         doc="Yum History Object")
  
@@ -187772,7 +187789,7 @@ index 99039e0..84ca658 100644
          necessary = False
          
          # I can't think of a nice way of doing this, we have to have the sack here
-@@ -951,25 +1154,37 @@ class YumBase(depsolve.Depsolve):
+@@ -951,25 +1155,37 @@ class YumBase(depsolve.Depsolve):
              self.repos.populateSack(mdtype='filelists')
             
      def yumUtilsMsg(self, func, prog):
@@ -187821,7 +187838,7 @@ index 99039e0..84ca658 100644
              self.logger.critical(msg)
              self.yumUtilsMsg(self.logger.critical, "yum-complete-transaction")
              time.sleep(3)
-@@ -1004,7 +1219,7 @@ class YumBase(depsolve.Depsolve):
+@@ -1004,7 +1220,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 )
  
@@ -187830,7 +187847,7 @@ index 99039e0..84ca658 100644
              self.tsInfo.pkgSack.dropCachedData()
  
          # FIXME: This is horrible, see below and yummain. Maybe create a real
-@@ -1044,6 +1259,39 @@ class YumBase(depsolve.Depsolve):
+@@ -1044,6 +1260,39 @@ class YumBase(depsolve.Depsolve):
                  if first.verEQ(other):
                      continue
                  msg = _('Protected multilib versions: %s != %s')
@@ -187870,7 +187887,7 @@ index 99039e0..84ca658 100644
                  xrestring.append(msg % (first, other))
          if xrestring:
              rescode = 1
-@@ -1227,7 +1475,7 @@ class YumBase(depsolve.Depsolve):
+@@ -1227,7 +1476,7 @@ class YumBase(depsolve.Depsolve):
                  self.verbose_logger.info(msg)
              self.skipped_packages.extend(skipped_list)   # make the skipped packages public
          else:
@@ -187879,7 +187896,7 @@ index 99039e0..84ca658 100644
              self.verbose_logger.info("Skip-broken could not solve problems")
              return 1, orig_restring
          return rescode, restring
-@@ -1242,13 +1490,15 @@ class YumBase(depsolve.Depsolve):
+@@ -1242,13 +1491,15 @@ class YumBase(depsolve.Depsolve):
          if None in pkgtup:
              return None
          return pkgtup
@@ -187899,7 +187916,7 @@ index 99039e0..84ca658 100644
          if pkgtup is None:
              return
          self._not_found_i[pkgtup] = YumNotFoundPackage(pkgtup)
-@@ -1267,7 +1517,7 @@ class YumBase(depsolve.Depsolve):
+@@ -1267,7 +1518,7 @@ class YumBase(depsolve.Depsolve):
              for pkg in txmbr.obsoleted_by:
                  # check if the obsoleting txmbr is in the transaction
                  # else remove the obsoleted txmbr
@@ -187908,7 +187925,7 @@ index 99039e0..84ca658 100644
                  if not self.tsInfo.exists(pkg.pkgtup):
                      self.verbose_logger.debug('SKIPBROKEN: Remove extra obsoleted %s (%s)' % (txmbr.po,pkg) )
                      self.tsInfo.remove(txmbr.po.pkgtup)
-@@ -1275,14 +1525,14 @@ class YumBase(depsolve.Depsolve):
+@@ -1275,14 +1526,14 @@ class YumBase(depsolve.Depsolve):
      def _checkUpdatedLeftovers(self):
          """ 
          If multiple packages is updated the same package
@@ -187925,7 +187942,7 @@ index 99039e0..84ca658 100644
                  if not self.tsInfo.exists(pkg.pkgtup):
                      self.verbose_logger.debug('SKIPBROKEN: Remove extra updated %s (%s)' % (txmbr.po,pkg) )
                      self.tsInfo.remove(txmbr.po.pkgtup)
-@@ -1379,9 +1629,19 @@ class YumBase(depsolve.Depsolve):
+@@ -1379,9 +1630,19 @@ class YumBase(depsolve.Depsolve):
  
      def _getDepsToRemove(self,po, deptree, toRemove):
          for dep in deptree.get(po, []): # Loop trough all deps of po
@@ -187945,7 +187962,7 @@ index 99039e0..84ca658 100644
              toRemove.add(dep)
              self._getDepsToRemove(dep, deptree, toRemove)
  
-@@ -1454,7 +1714,46 @@ class YumBase(depsolve.Depsolve):
+@@ -1454,7 +1715,46 @@ class YumBase(depsolve.Depsolve):
          return probs
  
      def runTransaction(self, cb):
@@ -187993,7 +188010,7 @@ index 99039e0..84ca658 100644
  
          self.plugins.run('pretrans')
  
-@@ -1516,10 +1815,23 @@ class YumBase(depsolve.Depsolve):
+@@ -1516,10 +1816,23 @@ class YumBase(depsolve.Depsolve):
                  pass
          self._ts_save_file = None
          
@@ -188017,7 +188034,7 @@ index 99039e0..84ca658 100644
          
          # make resultobject - just a plain yumgenericholder object
          resultobject = misc.GenericHolder()
-@@ -1544,8 +1856,7 @@ class YumBase(depsolve.Depsolve):
+@@ -1544,8 +1857,7 @@ class YumBase(depsolve.Depsolve):
                                            errors=errors)
  
                            
@@ -188027,7 +188044,7 @@ index 99039e0..84ca658 100644
              self.cleanUsedHeadersPackages()
          
          for i in ('ts_all_fn', 'ts_done_fn'):
-@@ -1567,13 +1878,35 @@ class YumBase(depsolve.Depsolve):
+@@ -1567,13 +1879,35 @@ 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):
@@ -188068,7 +188085,7 @@ index 99039e0..84ca658 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,24 +1917,58 @@ class YumBase(depsolve.Depsolve):
+@@ -1584,24 +1918,58 @@ 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
@@ -188129,7 +188146,7 @@ index 99039e0..84ca658 100644
                  if hasattr(self, 'args') and self.args:
                      po.yumdb_info.command_line = ' '.join(self.args)
                  elif hasattr(self, 'cmds') and self.cmds:
-@@ -1630,6 +1997,10 @@ class YumBase(depsolve.Depsolve):
+@@ -1630,6 +1998,10 @@ class YumBase(depsolve.Depsolve):
                      if md:
                          po.yumdb_info.from_repo_timestamp = str(md.timestamp)
  
@@ -188140,7 +188157,7 @@ index 99039e0..84ca658 100644
                  loginuid = misc.getloginuid()
                  if txmbr.updates or txmbr.downgrades or txmbr.reinstall:
                      if txmbr.updates:
-@@ -1640,11 +2011,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1640,11 +2012,16 @@ class YumBase(depsolve.Depsolve):
                          opo = po
                      if 'installed_by' in opo.yumdb_info:
                          po.yumdb_info.installed_by = opo.yumdb_info.installed_by
@@ -188157,7 +188174,7 @@ index 99039e0..84ca658 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 +2038,13 @@ class YumBase(depsolve.Depsolve):
+@@ -1662,10 +2039,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
@@ -188171,7 +188188,7 @@ index 99039e0..84ca658 100644
                  self.verbose_logger.log(logginglevels.DEBUG_2, 'What is this? %s' % txmbr.po)
  
          self.plugins.run('postverifytrans')
-@@ -1680,10 +2059,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1680,10 +2060,11 @@ class YumBase(depsolve.Depsolve):
          self.verbose_logger.debug('VerifyTransaction time: %0.3f' % (time.time() - vt_st))
  
      def costExcludePackages(self):
@@ -188187,7 +188204,7 @@ index 99039e0..84ca658 100644
          # if all the repo.costs are equal then don't bother running things
          costs = {}
          for r in self.repos.listEnabled():
-@@ -1705,10 +2085,12 @@ class YumBase(depsolve.Depsolve):
+@@ -1705,10 +2086,12 @@ class YumBase(depsolve.Depsolve):
              done = True
  
      def excludePackages(self, repo=None):
@@ -188203,7 +188220,7 @@ index 99039e0..84ca658 100644
          if "all" in self.conf.disable_excludes:
              return
          
-@@ -1735,9 +2117,14 @@ class YumBase(depsolve.Depsolve):
+@@ -1735,9 +2118,14 @@ class YumBase(depsolve.Depsolve):
              self.pkgSack.addPackageExcluder(repoid, exid,'exclude.match', match)
  
      def includePackages(self, repo):
@@ -188221,7 +188238,7 @@ index 99039e0..84ca658 100644
          includelist = repo.getIncludePkgList()
          
          if len(includelist) == 0:
-@@ -1757,8 +2144,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1757,8 +2145,11 @@ class YumBase(depsolve.Depsolve):
          self.pkgSack.addPackageExcluder(repo.id, exid, 'exclude.marked')
          
      def doLock(self, lockfile = YUM_PID_FILE):
@@ -188235,7 +188252,7 @@ index 99039e0..84ca658 100644
          if self.conf.uid != 0:
              #  If we are a user, assume we are using the root cache ... so don't
              # bother locking.
-@@ -1773,39 +2163,39 @@ class YumBase(depsolve.Depsolve):
+@@ -1773,39 +2164,39 @@ class YumBase(depsolve.Depsolve):
          lockfile = os.path.normpath(lockfile) # get rid of silly preceding extra /
          
          mypid=str(os.getpid())    
@@ -188303,7 +188320,7 @@ index 99039e0..84ca658 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 +2220,74 @@ class YumBase(depsolve.Depsolve):
+@@ -1830,31 +2221,74 @@ class YumBase(depsolve.Depsolve):
          self._unlock(lockfile)
          self._lockfile = None
          
@@ -188390,7 +188407,7 @@ index 99039e0..84ca658 100644
          failed = False
  
          if type(fo) is types.InstanceType:
-@@ -1877,10 +2310,10 @@ class YumBase(depsolve.Depsolve):
+@@ -1877,10 +2311,10 @@ class YumBase(depsolve.Depsolve):
              cursize = os.stat(fo)[6]
              totsize = long(po.size)
              if cursize >= totsize and not po.repo.cache:
@@ -188404,7 +188421,7 @@ index 99039e0..84ca658 100644
                      os.unlink(fo)
  
              if raiseError:
-@@ -1894,9 +2327,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1894,9 +2328,16 @@ class YumBase(depsolve.Depsolve):
          
          
      def verifyChecksum(self, fo, checksumType, csum):
@@ -188424,7 +188441,7 @@ index 99039e0..84ca658 100644
          try:
              filesum = misc.checksum(checksumType, fo)
          except Errors.MiscError, e:
-@@ -1908,13 +2348,26 @@ class YumBase(depsolve.Depsolve):
+@@ -1908,13 +2349,26 @@ class YumBase(depsolve.Depsolve):
          return 0
  
      def downloadPkgs(self, pkglist, callback=None, callback_total=None):
@@ -188452,7 +188469,7 @@ index 99039e0..84ca658 100644
              if a is None:
                  return -1
              if b is None:
-@@ -1925,12 +2378,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1925,12 +2379,11 @@ class YumBase(depsolve.Depsolve):
                  return 1
              return 0
          
@@ -188467,7 +188484,7 @@ index 99039e0..84ca658 100644
  
          #  We close the history DB here because some plugins (presto) use
          # threads. And sqlite really doesn't like threads. And while I don't
-@@ -1943,116 +2395,215 @@ class YumBase(depsolve.Depsolve):
+@@ -1943,116 +2396,215 @@ class YumBase(depsolve.Depsolve):
          self.history.close()
  
          self.plugins.run('predownload', pkglist=pkglist)
@@ -188772,7 +188789,7 @@ index 99039e0..84ca658 100644
          if type(fo) is types.InstanceType:
              fo = fo.filename
              
-@@ -2076,9 +2627,12 @@ class YumBase(depsolve.Depsolve):
+@@ -2076,9 +2628,12 @@ class YumBase(depsolve.Depsolve):
          return 1
          
      def downloadHeader(self, po):
@@ -188787,7 +188804,7 @@ index 99039e0..84ca658 100644
          if hasattr(po, 'pkgtype') and po.pkgtype == 'local':
              return
                  
-@@ -2122,15 +2676,17 @@ class YumBase(depsolve.Depsolve):
+@@ -2122,15 +2677,17 @@ class YumBase(depsolve.Depsolve):
              return
  
      def sigCheckPkg(self, po):
@@ -188813,7 +188830,7 @@ index 99039e0..84ca658 100644
          if self._override_sigchecks:
              check = False
              hasgpgkey = 0
-@@ -2181,6 +2737,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2181,6 +2738,9 @@ class YumBase(depsolve.Depsolve):
          return result, msg
  
      def cleanUsedHeadersPackages(self):
@@ -188823,7 +188840,7 @@ index 99039e0..84ca658 100644
          filelist = []
          for txmbr in self.tsInfo:
              if txmbr.po.state not in TS_INSTALL_STATES:
-@@ -2189,6 +2748,8 @@ class YumBase(depsolve.Depsolve):
+@@ -2189,6 +2749,8 @@ class YumBase(depsolve.Depsolve):
                  continue
              if txmbr.po.repoid not in self.repos.repos:
                  continue
@@ -188832,7 +188849,7 @@ index 99039e0..84ca658 100644
              
              # make sure it's not a local file
              repo = self.repos.repos[txmbr.po.repoid]
-@@ -2218,27 +2779,42 @@ class YumBase(depsolve.Depsolve):
+@@ -2218,27 +2780,42 @@ class YumBase(depsolve.Depsolve):
                      _('%s removed'), fn)
          
      def cleanHeaders(self):
@@ -188877,7 +188894,7 @@ index 99039e0..84ca658 100644
          cachedir = self.conf.persistdir + "/rpmdb-indexes/"
          if not os.path.exists(cachedir):
              filelist = []
-@@ -2271,9 +2847,31 @@ class YumBase(depsolve.Depsolve):
+@@ -2271,9 +2848,31 @@ class YumBase(depsolve.Depsolve):
          return 0, [msg]
  
      def doPackageLists(self, pkgnarrow='all', patterns=None, showdups=None,
@@ -188912,7 +188929,7 @@ index 99039e0..84ca658 100644
          if showdups is None:
              showdups = self.conf.showdupesfromrepos
          ygh = misc.GenericHolder(iter=pkgnarrow)
-@@ -2295,6 +2893,8 @@ class YumBase(depsolve.Depsolve):
+@@ -2295,6 +2894,8 @@ class YumBase(depsolve.Depsolve):
              ndinst = {} # Newest versions by name.arch
              for po in self.rpmdb.returnPackages(patterns=patterns,
                                                  ignore_case=ic):
@@ -188921,7 +188938,7 @@ index 99039e0..84ca658 100644
                  dinst[po.pkgtup] = po
                  if showdups:
                      continue
-@@ -2304,8 +2904,13 @@ class YumBase(depsolve.Depsolve):
+@@ -2304,8 +2905,13 @@ class YumBase(depsolve.Depsolve):
              installed = dinst.values()
                          
              if showdups:
@@ -188936,7 +188953,7 @@ index 99039e0..84ca658 100644
              else:
                  try:
                      avail = self.pkgSack.returnNewestByNameArch(patterns=patterns,
-@@ -2323,16 +2928,31 @@ class YumBase(depsolve.Depsolve):
+@@ -2323,16 +2929,31 @@ class YumBase(depsolve.Depsolve):
                      key = (pkg.name, pkg.arch)
                      if pkg.pkgtup in dinst:
                          reinstall_available.append(pkg)
@@ -188971,7 +188988,7 @@ index 99039e0..84ca658 100644
                  if len(matches) > 1:
                      updates.append(matches[0])
                      self.verbose_logger.log(logginglevels.DEBUG_1,
-@@ -2352,13 +2972,19 @@ class YumBase(depsolve.Depsolve):
+@@ -2352,13 +2973,19 @@ class YumBase(depsolve.Depsolve):
          elif pkgnarrow == 'installed':
              installed = self.rpmdb.returnPackages(patterns=patterns,
                                                    ignore_case=ic)
@@ -188992,7 +189009,7 @@ index 99039e0..84ca658 100644
              else:
                  try:
                      avail = self.pkgSack.returnNewestByNameArch(patterns=patterns,
-@@ -2392,9 +3018,21 @@ class YumBase(depsolve.Depsolve):
+@@ -2392,9 +3019,21 @@ class YumBase(depsolve.Depsolve):
              avail = set(avail)
              for po in self.rpmdb.returnPackages(patterns=patterns,
                                                  ignore_case=ic):
@@ -189014,7 +189031,7 @@ index 99039e0..84ca658 100644
          # obsoleting packages (and what they obsolete)
          elif pkgnarrow == 'obsoletes':
              self.conf.obsoletes = 1
-@@ -2402,6 +3040,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2402,6 +3041,7 @@ class YumBase(depsolve.Depsolve):
              for (pkgtup, instTup) in self.up.getObsoletesTuples():
                  (n,a,e,v,r) = pkgtup
                  pkgs = self.pkgSack.searchNevra(name=n, arch=a, ver=v, rel=r, epoch=e)
@@ -189022,7 +189039,7 @@ index 99039e0..84ca658 100644
                  instpo = self.getInstalledPackageObject(instTup)
                  for po in pkgs:
                      obsoletes.append(po)
-@@ -2433,7 +3072,12 @@ class YumBase(depsolve.Depsolve):
+@@ -2433,7 +3073,12 @@ class YumBase(depsolve.Depsolve):
              recentlimit = now-(self.conf.recent*86400)
              if showdups:
                  avail = self.pkgSack.returnPackages(patterns=patterns,
@@ -189036,7 +189053,7 @@ index 99039e0..84ca658 100644
              else:
                  try:
                      avail = self.pkgSack.returnNewestByNameArch(patterns=patterns,
-@@ -2461,14 +3105,13 @@ class YumBase(depsolve.Depsolve):
+@@ -2461,14 +3106,13 @@ class YumBase(depsolve.Depsolve):
  
          
      def findDeps(self, pkgs):
@@ -189056,7 +189073,7 @@ index 99039e0..84ca658 100644
          results = {}
  
          for pkg in pkgs:
-@@ -2495,10 +3138,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2495,10 +3139,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):
@@ -189083,7 +189100,7 @@ index 99039e0..84ca658 100644
          sql_fields = []
          for f in fields:
              sql_fields.append(RPM_TO_SQLITE.get(f, f))
-@@ -2614,7 +3269,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2614,7 +3270,7 @@ class YumBase(depsolve.Depsolve):
          # ...but without showdups we want to output _just_ #3, which requires
          # we find the newest EVR po for the best "matching value". Without keys
          # it's the same, except we just want the newest EVR.
@@ -189092,7 +189109,7 @@ index 99039e0..84ca658 100644
          # either, so it's pretty thankless. HTH. HAND.
          # By default just sort using package sorting
          sort_func = operator.itemgetter(0)
-@@ -2661,6 +3316,14 @@ class YumBase(depsolve.Depsolve):
+@@ -2661,6 +3317,14 @@ class YumBase(depsolve.Depsolve):
                      yield (po, vs)
  
      def searchPackageTags(self, criteria):
@@ -189107,7 +189124,7 @@ index 99039e0..84ca658 100644
          results = {} # name = [(criteria, taglist)]
          for c in criteria:
              c = c.lower()
-@@ -2677,11 +3340,16 @@ class YumBase(depsolve.Depsolve):
+@@ -2677,11 +3341,16 @@ class YumBase(depsolve.Depsolve):
          return results
          
      def searchPackages(self, fields, criteria, callback=None):
@@ -189129,7 +189146,7 @@ index 99039e0..84ca658 100644
          warnings.warn(_('searchPackages() will go away in a future version of Yum.\
                        Use searchGenerator() instead. \n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)           
-@@ -2700,13 +3368,23 @@ class YumBase(depsolve.Depsolve):
+@@ -2700,13 +3369,23 @@ class YumBase(depsolve.Depsolve):
      
      def searchPackageProvides(self, args, callback=None,
                                callback_has_matchfor=False):
@@ -189157,7 +189174,7 @@ index 99039e0..84ca658 100644
              else:
                  isglob = True
                  canBeFile = misc.re_filename(arg)
-@@ -2723,7 +3401,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2723,7 +3402,7 @@ class YumBase(depsolve.Depsolve):
                  where = self.returnPackagesByDep(arg)
              else:
                  usedDepString = False
@@ -189166,7 +189183,7 @@ index 99039e0..84ca658 100644
              self.verbose_logger.log(logginglevels.DEBUG_1,
                 P_('Searching %d package', 'Searching %d packages', len(where)), len(where))
              
-@@ -2817,29 +3495,170 @@ class YumBase(depsolve.Depsolve):
+@@ -2817,29 +3496,170 @@ class YumBase(depsolve.Depsolve):
              
          return matches
  
@@ -189359,7 +189376,7 @@ index 99039e0..84ca658 100644
                      installed.append(grp)
              else:
                  if uservisible:
-@@ -2847,34 +3666,97 @@ class YumBase(depsolve.Depsolve):
+@@ -2847,34 +3667,97 @@ class YumBase(depsolve.Depsolve):
                          available.append(grp)
                  else:
                      available.append(grp)
@@ -189465,7 +189482,7 @@ index 99039e0..84ca658 100644
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -2898,18 +3780,53 @@ class YumBase(depsolve.Depsolve):
+@@ -2898,18 +3781,53 @@ class YumBase(depsolve.Depsolve):
                              self.tsInfo.remove(txmbr.po.pkgtup)
          
          
@@ -189529,7 +189546,7 @@ index 99039e0..84ca658 100644
          txmbrs_used = []
          thesegroups = self.comps.return_groups(grpid)
       
-@@ -2920,12 +3837,18 @@ class YumBase(depsolve.Depsolve):
+@@ -2920,12 +3838,18 @@ class YumBase(depsolve.Depsolve):
          if group_package_types:
              package_types = group_package_types
  
@@ -189548,7 +189565,7 @@ index 99039e0..84ca658 100644
              pkgs = []
              if 'mandatory' in package_types:
                  pkgs.extend(thisgroup.mandatory_packages)
-@@ -2934,12 +3857,56 @@ class YumBase(depsolve.Depsolve):
+@@ -2934,12 +3858,56 @@ class YumBase(depsolve.Depsolve):
              if 'optional' in package_types:
                  pkgs.extend(thisgroup.optional_packages)
  
@@ -189606,7 +189623,7 @@ index 99039e0..84ca658 100644
                  except Errors.InstallError, e:
                      self.verbose_logger.debug(_('No package named %s available to be installed'),
                          pkg)
-@@ -2953,7 +3920,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2953,7 +3921,9 @@ class YumBase(depsolve.Depsolve):
                  group_conditionals = enable_group_conditionals
  
              count_cond_test = 0
@@ -189617,7 +189634,7 @@ index 99039e0..84ca658 100644
                  for condreq, cond in thisgroup.conditional_packages.iteritems():
                      if self.isPackageInstalled(cond):
                          try:
-@@ -2990,17 +3959,23 @@ class YumBase(depsolve.Depsolve):
+@@ -2990,17 +3960,23 @@ class YumBase(depsolve.Depsolve):
                          if cond not in self.tsInfo.conditionals:
                              self.tsInfo.conditionals[cond] = []
                          self.tsInfo.conditionals[cond].extend(pkgs)
@@ -189648,7 +189665,7 @@ index 99039e0..84ca658 100644
          
          if not self.comps.has_group(grpid):
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -3008,7 +3983,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3008,7 +3984,8 @@ class YumBase(depsolve.Depsolve):
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
@@ -189658,7 +189675,7 @@ index 99039e0..84ca658 100644
          for thisgroup in thesegroups:
              thisgroup.selected = False
              
-@@ -3034,13 +4010,114 @@ class YumBase(depsolve.Depsolve):
+@@ -3034,13 +4011,114 @@ class YumBase(depsolve.Depsolve):
                          for pkg in self.tsInfo.conditionals.get(txmbr.name, []):
                              self.tsInfo.remove(pkg.pkgtup)
          
@@ -189779,7 +189796,7 @@ index 99039e0..84ca658 100644
          # look it up in the self.localPackages first:
          for po in self.localPackages:
              if po.pkgtup == pkgtup:
-@@ -3049,7 +4126,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3049,7 +4127,7 @@ class YumBase(depsolve.Depsolve):
          pkgs = self.pkgSack.searchPkgTuple(pkgtup)
  
          if len(pkgs) == 0:
@@ -189788,7 +189805,7 @@ index 99039e0..84ca658 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 +4142,21 @@ class YumBase(depsolve.Depsolve):
+@@ -3065,13 +4143,21 @@ class YumBase(depsolve.Depsolve):
          return result
  
      def getInstalledPackageObject(self, pkgtup):
@@ -189815,7 +189832,7 @@ index 99039e0..84ca658 100644
              raise Errors.RpmDBError, _('Package tuple %s could not be found in rpmdb') % str(pkgtup)
  
          # Dito. FIXME from getPackageObject() for len() > 1 ... :)
-@@ -3079,9 +4164,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3079,9 +4165,11 @@ class YumBase(depsolve.Depsolve):
          return po
          
      def gpgKeyCheck(self):
@@ -189829,7 +189846,7 @@ index 99039e0..84ca658 100644
          gpgkeyschecked = self.conf.cachedir + '/.gpgkeyschecked.yum'
          if os.path.exists(gpgkeyschecked):
              return 1
-@@ -3106,9 +4193,13 @@ class YumBase(depsolve.Depsolve):
+@@ -3106,9 +4194,13 @@ class YumBase(depsolve.Depsolve):
              return 1
  
      def returnPackagesByDep(self, depstring):
@@ -189845,7 +189862,7 @@ index 99039e0..84ca658 100644
          if not depstring:
              return []
  
-@@ -3132,12 +4223,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3132,12 +4224,23 @@ class YumBase(depsolve.Depsolve):
                          raise Errors.YumBaseError, _('Invalid version flag from: %s') % str(depstring)
                      depflags = SYMBOLFLAGS[flagsymbol]
  
@@ -189872,7 +189889,7 @@ index 99039e0..84ca658 100644
          # we get all sorts of randomness here
          errstring = depstring
          if type(depstring) not in types.StringTypes:
-@@ -3149,16 +4251,22 @@ class YumBase(depsolve.Depsolve):
+@@ -3149,16 +4252,22 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _('No Package found for %s') % errstring
          
          ps = ListPackageSack(pkglist)
@@ -189899,7 +189916,7 @@ index 99039e0..84ca658 100644
          if not depstring:
              return []
  
-@@ -3182,14 +4290,53 @@ class YumBase(depsolve.Depsolve):
+@@ -3182,14 +4291,53 @@ class YumBase(depsolve.Depsolve):
                          raise Errors.YumBaseError, _('Invalid version flag from: %s') % str(depstring)
                      depflags = SYMBOLFLAGS[flagsymbol]
  
@@ -189955,7 +189972,7 @@ index 99039e0..84ca658 100644
          
          
          if len(pkglist) == 0:
-@@ -3198,14 +4345,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3198,14 +4346,23 @@ class YumBase(depsolve.Depsolve):
          if len(pkglist) == 1:
              return pkglist[0]
  
@@ -189985,7 +190002,7 @@ index 99039e0..84ca658 100644
          returnlist = []
          compatArchList = self.arch.get_arch_list(arch)
          multiLib = []
-@@ -3222,9 +4378,9 @@ class YumBase(depsolve.Depsolve):
+@@ -3222,9 +4379,9 @@ class YumBase(depsolve.Depsolve):
                  singleLib.append(po)
                  
          # we now have three lists.  find the best package(s) of each
@@ -189998,7 +190015,7 @@ index 99039e0..84ca658 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 +4394,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3238,7 +4395,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:
@@ -190007,7 +190024,7 @@ index 99039e0..84ca658 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3246,7 +4402,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3246,7 +4403,7 @@ class YumBase(depsolve.Depsolve):
                  if single: returnlist.append(single)
          # similar for the non-multilib case
          elif single:
@@ -190016,7 +190033,7 @@ index 99039e0..84ca658 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3350,28 +4506,71 @@ class YumBase(depsolve.Depsolve):
+@@ -3350,28 +4507,71 @@ class YumBase(depsolve.Depsolve):
              done = True
  
              slow = next_func(slow)
@@ -190098,7 +190115,7 @@ index 99039e0..84ca658 100644
          try:
              txmbrs = self.groupRemove(group_string)
          except yum.Errors.GroupsError:
-@@ -3387,6 +4586,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3387,6 +4587,8 @@ class YumBase(depsolve.Depsolve):
          assert pattern[0] == '@'
          grpid = pattern[1:]
  
@@ -190107,7 +190124,7 @@ index 99039e0..84ca658 100644
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -3398,7 +4599,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3398,7 +4600,11 @@ class YumBase(depsolve.Depsolve):
      def _minus_deselect(self, pattern):
          """ Remove things from the transaction, like kickstart. """
          assert pattern[0] == '-'
@@ -190120,7 +190137,7 @@ index 99039e0..84ca658 100644
  
          if pat and pat[0] == '@':
              pat = pat[1:]
-@@ -3437,14 +4642,87 @@ class YumBase(depsolve.Depsolve):
+@@ -3437,14 +4643,87 @@ class YumBase(depsolve.Depsolve):
              if flag not in self.tsInfo.probFilterFlags:
                  self.tsInfo.probFilterFlags.append(flag)
  
@@ -190214,7 +190231,7 @@ index 99039e0..84ca658 100644
          pkgs = []
          was_pattern = False
          if po:
-@@ -3464,9 +4742,14 @@ class YumBase(depsolve.Depsolve):
+@@ -3464,9 +4743,14 @@ class YumBase(depsolve.Depsolve):
                  if kwargs['pattern'] and kwargs['pattern'][0] == '@':
                      return self._at_groupinstall(kwargs['pattern'])
  
@@ -190229,7 +190246,7 @@ index 99039e0..84ca658 100644
                                                        ignore_case=False)
                  pkgs.extend(mypkgs)
                  # if we have anything left unmatched, let's take a look for it
-@@ -3477,20 +4760,14 @@ class YumBase(depsolve.Depsolve):
+@@ -3477,20 +4761,14 @@ class YumBase(depsolve.Depsolve):
                      self.verbose_logger.debug(_('Checking for virtual provide or file-provide for %s'), 
                          arg)
  
@@ -190258,7 +190275,7 @@ index 99039e0..84ca658 100644
              else:
                  nevra_dict = self._nevra_kwarg_parse(kwargs)
  
-@@ -3499,6 +4776,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3499,6 +4777,8 @@ class YumBase(depsolve.Depsolve):
                       ver=nevra_dict['version'], rel=nevra_dict['release'])
                  self._add_not_found_a(pkgs, nevra_dict)
                  
@@ -190267,7 +190284,7 @@ index 99039e0..84ca658 100644
              if pkgs:
                  # if was_pattern or nevra-dict['arch'] is none, take the list
                  # of arches based on our multilib_compat config and 
-@@ -3577,17 +4856,21 @@ class YumBase(depsolve.Depsolve):
+@@ -3577,17 +4857,21 @@ class YumBase(depsolve.Depsolve):
                      continue
              
              # make sure this shouldn't be passed to update:
@@ -190293,7 +190310,7 @@ index 99039e0..84ca658 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 +4883,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3600,23 +4884,23 @@ class YumBase(depsolve.Depsolve):
                      already_obs = pkgs[0]
  
                  if already_obs:
@@ -190324,7 +190341,7 @@ index 99039e0..84ca658 100644
                      continue
  
              # make sure we don't have a name.arch of this already installed
-@@ -3630,8 +4913,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3630,8 +4914,8 @@ class YumBase(depsolve.Depsolve):
                          found = True
                          break
                  if not found:
@@ -190335,7 +190352,7 @@ index 99039e0..84ca658 100644
                      tx_return.extend(txmbrs)
                      continue
  
-@@ -3719,19 +5002,47 @@ class YumBase(depsolve.Depsolve):
+@@ -3719,19 +5003,47 @@ class YumBase(depsolve.Depsolve):
          return txmbr
  
      def update(self, po=None, requiringPo=None, update_to=False, **kwargs):
@@ -190390,7 +190407,7 @@ index 99039e0..84ca658 100644
          tx_return = []
          if not po and not kwargs: # update everything (the easy case)
              self.verbose_logger.log(logginglevels.DEBUG_2, _('Updating Everything'))
-@@ -3765,7 +5076,15 @@ class YumBase(depsolve.Depsolve):
+@@ -3765,7 +5077,15 @@ class YumBase(depsolve.Depsolve):
                      if new is None:
                          continue
                      tx_return.extend(self.update(po=new))
@@ -190407,7 +190424,7 @@ index 99039e0..84ca658 100644
              return tx_return
  
          # complications
-@@ -3787,13 +5106,16 @@ class YumBase(depsolve.Depsolve):
+@@ -3787,13 +5107,16 @@ class YumBase(depsolve.Depsolve):
                  return self._minus_deselect(kwargs['pattern'])
  
              if kwargs['pattern'] and kwargs['pattern'][0] == '@':
@@ -190426,7 +190443,7 @@ index 99039e0..84ca658 100644
  
              if not instpkgs and not availpkgs:
                  depmatches = []
-@@ -3805,6 +5127,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3805,6 +5128,8 @@ class YumBase(depsolve.Depsolve):
                  except yum.Errors.YumBaseError, e:
                      self.logger.critical(_('%s') % e)
  
@@ -190435,7 +190452,7 @@ index 99039e0..84ca658 100644
                  if update_to:
                      availpkgs.extend(depmatches)
                  else:
-@@ -3816,9 +5140,12 @@ class YumBase(depsolve.Depsolve):
+@@ -3816,9 +5141,12 @@ class YumBase(depsolve.Depsolve):
              try:
                  if update_to:
                      m = []
@@ -190449,7 +190466,7 @@ index 99039e0..84ca658 100644
                      m = self.pkgSack.returnNewestByNameArch(patterns=pats)
              except Errors.PackageSackError:
                  m = []
-@@ -3843,7 +5170,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3843,7 +5171,7 @@ class YumBase(depsolve.Depsolve):
                      availpkgs = self._compare_providers(availpkgs, requiringPo)
                      availpkgs = map(lambda x: x[0], availpkgs)
                  elif not availpkgs:
@@ -190458,7 +190475,7 @@ index 99039e0..84ca658 100644
         
          # for any thing specified
          # get the list of available pkgs matching it (or take the po)
-@@ -3879,6 +5206,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3879,6 +5207,7 @@ class YumBase(depsolve.Depsolve):
                      if obsoleting_pkg is None:
                          continue
                      obs_pkgs.append(obsoleting_pkg)
@@ -190466,7 +190483,7 @@ index 99039e0..84ca658 100644
                  for obsoleting_pkg in packagesNewestByName(obs_pkgs):
                      tx_return.extend(self.install(po=obsoleting_pkg))
              for available_pkg in availpkgs:
-@@ -3920,11 +5248,29 @@ class YumBase(depsolve.Depsolve):
+@@ -3920,11 +5249,29 @@ class YumBase(depsolve.Depsolve):
                      tx_return.append(txmbr)
                          
          for available_pkg in availpkgs:
@@ -190496,7 +190513,7 @@ index 99039e0..84ca658 100644
                  self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is obsoleted: %s'), available_pkg)
                  tx_return.extend(self.update(po=obsoleting_pkg))
                  continue
-@@ -3985,11 +5331,18 @@ class YumBase(depsolve.Depsolve):
+@@ -3985,11 +5332,18 @@ class YumBase(depsolve.Depsolve):
          return tx_return
          
      def remove(self, po=None, **kwargs):
@@ -190520,7 +190537,7 @@ index 99039e0..84ca658 100644
          if not po and not kwargs:
              raise Errors.RemoveError, 'Nothing specified to remove'
          
-@@ -4008,6 +5361,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4008,6 +5362,10 @@ class YumBase(depsolve.Depsolve):
                      return self._at_groupremove(kwargs['pattern'])
  
                  (e,m,u) = self.rpmdb.matchPackageNames([kwargs['pattern']])
@@ -190531,7 +190548,7 @@ index 99039e0..84ca658 100644
                  pkgs.extend(e)
                  pkgs.extend(m)
                  if u:
-@@ -4018,6 +5375,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4018,6 +5376,10 @@ class YumBase(depsolve.Depsolve):
                      except yum.Errors.YumBaseError, e:
                          self.logger.critical(_('%s') % e)
                      
@@ -190542,7 +190559,7 @@ index 99039e0..84ca658 100644
                      if not depmatches:
                          arg = to_unicode(arg)
                          self.logger.critical(_('No Match for argument: %s') % to_unicode(arg))
-@@ -4055,17 +5416,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4055,17 +5417,19 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def installLocal(self, pkg, po=None, updateonly=False):
@@ -190572,7 +190589,7 @@ index 99039e0..84ca658 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 +5546,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4183,16 +5547,15 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def reinstallLocal(self, pkg, po=None):
@@ -190597,7 +190614,7 @@ index 99039e0..84ca658 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4215,13 +5577,29 @@ class YumBase(depsolve.Depsolve):
+@@ -4215,13 +5578,29 @@ class YumBase(depsolve.Depsolve):
          return self.reinstall(po=po)
  
      def reinstall(self, po=None, **kwargs):
@@ -190630,7 +190647,7 @@ index 99039e0..84ca658 100644
          tx_mbrs = []
          if po: # The po, is the "available" po ... we want the installed po
              tx_mbrs.extend(self.remove(pkgtup=po.pkgtup))
-@@ -4240,10 +5618,11 @@ class YumBase(depsolve.Depsolve):
+@@ -4240,10 +5619,11 @@ class YumBase(depsolve.Depsolve):
              # pkgs that are obsolete.
              old_conf_obs = self.conf.obsoletes
              self.conf.obsoletes = False
@@ -190644,7 +190661,7 @@ index 99039e0..84ca658 100644
              self.conf.obsoletes = old_conf_obs
              if len(members) == 0:
                  self.tsInfo.remove(item.pkgtup)
-@@ -4259,16 +5638,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4259,16 +5639,15 @@ class YumBase(depsolve.Depsolve):
          return tx_mbrs
          
      def downgradeLocal(self, pkg, po=None):
@@ -190669,7 +190686,7 @@ index 99039e0..84ca658 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4309,13 +5687,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4309,13 +5688,19 @@ class YumBase(depsolve.Depsolve):
          return False
          
      def downgrade(self, po=None, **kwargs):
@@ -190696,7 +190713,7 @@ index 99039e0..84ca658 100644
          if not po and not kwargs:
              raise Errors.DowngradeError, 'Nothing specified to downgrade'
  
-@@ -4397,6 +5781,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4397,6 +5782,10 @@ class YumBase(depsolve.Depsolve):
          # installed version. Indexed fromn the latest installed pkgtup.
          downgrade_apkgs = {}
          for pkg in sorted(apkgs):
@@ -190707,7 +190724,7 @@ index 99039e0..84ca658 100644
              na  = (pkg.name, pkg.arch)
  
              # Here we allow downgrades from .i386 => .noarch, or .i586 => .i386
-@@ -4421,6 +5809,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4421,6 +5810,9 @@ class YumBase(depsolve.Depsolve):
                  warned_nas.add(na)
                  continue
  
@@ -190717,7 +190734,7 @@ index 99039e0..84ca658 100644
              if pkg.verGE(lipkg):
                  if na not in warned_nas:
                      msg = _('Only Upgrade available on package: %s') % pkg
-@@ -4457,7 +5848,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4457,7 +5849,7 @@ class YumBase(depsolve.Depsolve):
          if e and v and r:
              evr = '%s:%s-%s' % (e, v, r)
          elif v and r:
@@ -190726,7 +190743,7 @@ index 99039e0..84ca658 100644
          elif e and v:
              evr = '%s:%s' % (e, v)
          elif v: # e and r etc. is just too weird to print
-@@ -4500,12 +5891,24 @@ class YumBase(depsolve.Depsolve):
+@@ -4500,12 +5892,24 @@ class YumBase(depsolve.Depsolve):
  
          return returndict
  
@@ -190754,7 +190771,7 @@ index 99039e0..84ca658 100644
          old_conf_obs = self.conf.obsoletes
          self.conf.obsoletes = False
          done = False
-@@ -4515,19 +5918,46 @@ class YumBase(depsolve.Depsolve):
+@@ -4515,19 +5919,46 @@ class YumBase(depsolve.Depsolve):
                      done = True
          for pkg in transaction.trans_data:
              if pkg.state == 'Downgrade':
@@ -190801,7 +190818,7 @@ index 99039e0..84ca658 100644
                  if self.install(pkgtup=pkg.pkgtup):
                      done = True
          for pkg in transaction.trans_data:
-@@ -4538,8 +5968,14 @@ class YumBase(depsolve.Depsolve):
+@@ -4538,8 +5969,14 @@ class YumBase(depsolve.Depsolve):
          return done
  
      def history_undo(self, transaction):
@@ -190818,7 +190835,7 @@ index 99039e0..84ca658 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 +6052,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4616,7 +6053,7 @@ class YumBase(depsolve.Depsolve):
  
          except urlgrabber.grabber.URLGrabError, e:
              raise Errors.YumBaseError(_('GPG key retrieval failed: ') +
@@ -190827,7 +190844,7 @@ index 99039e0..84ca658 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 +6085,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4649,7 +6086,7 @@ class YumBase(depsolve.Depsolve):
              keys_info = misc.getgpgkeyinfo(rawkey, multiple=True)
          except ValueError, e:
              raise Errors.YumBaseError(_('Invalid GPG Key from %s: %s') % 
@@ -190836,7 +190853,7 @@ index 99039e0..84ca658 100644
          keys = []
          for keyinfo in keys_info:
              thiskey = {}
-@@ -4674,39 +6110,49 @@ class YumBase(depsolve.Depsolve):
+@@ -4674,39 +6111,49 @@ class YumBase(depsolve.Depsolve):
              if pkgs:
                  pkgs = sorted(pkgs)[-1]
                  msg = (_('Importing %s key 0x%s:\n'
@@ -190904,7 +190921,7 @@ index 99039e0..84ca658 100644
          user_cb_fail = False
          for keyurl in keyurls:
              keys = self._retrievePublicKey(keyurl, repo)
-@@ -4725,7 +6171,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4725,7 +6172,9 @@ class YumBase(depsolve.Depsolve):
                      # Try installing/updating GPG key
                      self._getKeyImportMessage(info, keyurl)
                      rc = False
@@ -190915,7 +190932,7 @@ index 99039e0..84ca658 100644
                          rc = True
                          
                      # grab the .sig/.asc for the keyurl, if it exists
-@@ -4751,8 +6199,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4751,8 +6200,8 @@ class YumBase(depsolve.Depsolve):
                  ts = self.rpmdb.readOnlyTS()
                  result = ts.pgpImportPubkey(misc.procgpgkey(info['raw_key']))
                  if result != 0:
@@ -190926,7 +190943,7 @@ index 99039e0..84ca658 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
  
-@@ -4760,18 +6208,20 @@ class YumBase(depsolve.Depsolve):
+@@ -4760,18 +6209,20 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _("Didn't install any keys")
  
          if not key_installed:
@@ -190952,7 +190969,7 @@ index 99039e0..84ca658 100644
      
      def _getAnyKeyForRepo(self, repo, destdir, keyurl_list, is_cakey=False, callback=None):
          """
-@@ -4788,6 +6238,18 @@ class YumBase(depsolve.Depsolve):
+@@ -4788,6 +6239,18 @@ class YumBase(depsolve.Depsolve):
          """
  
          key_installed = False
@@ -190971,7 +190988,7 @@ index 99039e0..84ca658 100644
          user_cb_fail = False
          for keyurl in keyurl_list:
              keys = self._retrievePublicKey(keyurl, repo, getSig=not is_cakey)
-@@ -4819,8 +6281,11 @@ class YumBase(depsolve.Depsolve):
+@@ -4819,8 +6282,11 @@ class YumBase(depsolve.Depsolve):
                  if not key_installed:
                      self._getKeyImportMessage(info, keyurl, keytype)
                      rc = False
@@ -190984,7 +191001,7 @@ index 99039e0..84ca658 100644
                      elif callback:
                          rc = callback({"repo": repo, "userid": info['userid'],
                                          "hexkeyid": info['hexkeyid'], "keyurl": keyurl,
-@@ -4835,7 +6300,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4835,7 +6301,8 @@ class YumBase(depsolve.Depsolve):
                  # Import the key
                  result = misc.import_key_to_pubring(info['raw_key'], info['hexkeyid'], gpgdir=destdir)
                  if not result:
@@ -190994,7 +191011,7 @@ index 99039e0..84ca658 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
                  # write out the key id to imported_cakeys in the repos basedir
-@@ -4851,36 +6317,35 @@ class YumBase(depsolve.Depsolve):
+@@ -4851,36 +6318,35 @@ class YumBase(depsolve.Depsolve):
                              pass
  
          if not key_installed and user_cb_fail:
@@ -191047,7 +191064,7 @@ index 99039e0..84ca658 100644
          self._getAnyKeyForRepo(repo, repo.gpgcadir, repo.gpgcakey, is_cakey=True, callback=callback)
  
      def _limit_installonly_pkgs(self):
-@@ -4889,7 +6354,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4889,7 +6355,7 @@ class YumBase(depsolve.Depsolve):
              New in 3.2.24: Obey yumdb_info.installonly data. """
  
          def _sort_and_filter_installonly(pkgs):
@@ -191056,7 +191073,7 @@ index 99039e0..84ca658 100644
                  using the yumdb. """
              ret_beg = []
              ret_mid = []
-@@ -4917,6 +6382,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4917,6 +6383,10 @@ class YumBase(depsolve.Depsolve):
  
          if self.conf.installonly_limit < 1 :
              return 
@@ -191067,7 +191084,7 @@ index 99039e0..84ca658 100644
              
          toremove = []
          #  We "probably" want to use either self.ts or self.rpmdb.ts if either
-@@ -4926,23 +6395,30 @@ class YumBase(depsolve.Depsolve):
+@@ -4926,23 +6396,30 @@ class YumBase(depsolve.Depsolve):
          # so self.rpmdb.ts should be valid.
          ts = self.rpmdb.readOnlyTS()
          (cur_kernel_v, cur_kernel_r) = misc.get_running_kernel_version_release(ts)
@@ -191106,7 +191123,7 @@ index 99039e0..84ca658 100644
              for po in installed:
                  if (po.version, po.release) == (cur_kernel_v, cur_kernel_r): 
                      # don't remove running
-@@ -4959,19 +6435,22 @@ class YumBase(depsolve.Depsolve):
+@@ -4959,19 +6436,22 @@ class YumBase(depsolve.Depsolve):
              txmbr.depends_on.append(rel)
  
      def processTransaction(self, callback=None,rpmTestDisplay=None, rpmDisplay=None):
@@ -191142,7 +191159,7 @@ index 99039e0..84ca658 100644
          
          if not callback:
              callback = callbacks.ProcessTransNoOutputCallback()
-@@ -5062,8 +6541,8 @@ class YumBase(depsolve.Depsolve):
+@@ -5062,8 +6542,8 @@ class YumBase(depsolve.Depsolve):
                  raise Errors.YumRPMCheckError, retmsgs
              retmsgs = [_('ERROR with transaction check vs depsolve:')]
              retmsgs.extend(msgs) 
@@ -191153,7 +191170,7 @@ index 99039e0..84ca658 100644
              raise Errors.YumRPMCheckError,retmsgs
          
          tsConf = {}
-@@ -5114,13 +6593,19 @@ class YumBase(depsolve.Depsolve):
+@@ -5114,13 +6594,19 @@ class YumBase(depsolve.Depsolve):
          return results
  
      def add_enable_repo(self, repoid, baseurls=[], mirrorlist=None, **kwargs):
@@ -191180,7 +191197,7 @@ index 99039e0..84ca658 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 +6652,15 @@ class YumBase(depsolve.Depsolve):
+@@ -5167,9 +6653,15 @@ class YumBase(depsolve.Depsolve):
  
      def setCacheDir(self, force=False, tmpdir=None, reuse=True,
                      suffix='/$basearch/$releasever'):
@@ -191199,7 +191216,7 @@ index 99039e0..84ca658 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 +6670,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5179,7 +6671,7 @@ class YumBase(depsolve.Depsolve):
          try:
              cachedir = misc.getCacheDir(tmpdir, reuse)
          except (IOError, OSError), e:
@@ -191208,7 +191225,7 @@ index 99039e0..84ca658 100644
              cachedir = None
              
          if cachedir is None:
-@@ -5190,6 +6681,8 @@ class YumBase(depsolve.Depsolve):
+@@ -5190,6 +6682,8 @@ class YumBase(depsolve.Depsolve):
              self.prerepoconf.cachedir = cachedir
          else:
              self.repos.setCacheDir(cachedir)
@@ -191217,7 +191234,7 @@ index 99039e0..84ca658 100644
          self.conf.cachedir = cachedir
          return True # We got a new cache dir
  
-@@ -5220,13 +6713,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5220,13 +6714,24 @@ class YumBase(depsolve.Depsolve):
          self.history.write_addon_data('config-repos', myrepos)
          
      def verify_plugins_cb(self, verify_package):
@@ -191245,7 +191262,7 @@ index 99039e0..84ca658 100644
          if self.tsInfo._unresolvedMembers:
              if auto:
                  self.logger.critical(_("Dependencies not solved. Will not save unresolved transaction."))
-@@ -5234,7 +6738,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5234,7 +6739,7 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError(_("Dependencies not solved. Will not save unresolved transaction."))
          
          if not filename:
@@ -191254,7 +191271,7 @@ index 99039e0..84ca658 100644
              fd,filename = tempfile.mkstemp(suffix='.yumtx', prefix=prefix)
              f = os.fdopen(fd, 'w')
          else:
-@@ -5244,13 +6748,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5244,13 +6749,17 @@ class YumBase(depsolve.Depsolve):
          
          msg = "%s\n" % self.rpmdb.simpleVersion(main_only=True)[0]
          msg += "%s\n" % self.ts.getTsFlags()
@@ -191275,7 +191292,7 @@ index 99039e0..84ca658 100644
          msg += "%s\n" % len(self.tsInfo.getMembers())
          for txmbr in self.tsInfo.getMembers():
              msg += txmbr._dump()
-@@ -5260,42 +6768,84 @@ class YumBase(depsolve.Depsolve):
+@@ -5260,42 +6769,84 @@ class YumBase(depsolve.Depsolve):
          except (IOError, OSError), e:
              self._ts_save_file = None
              if auto:
@@ -191372,7 +191389,7 @@ index 99039e0..84ca658 100644
              if ignorerpm:
                  msg += _(" ignoring, as requested.")
                  self.logger.critical(_(msg))
-@@ -5318,8 +6868,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5318,8 +6869,17 @@ class YumBase(depsolve.Depsolve):
          numrepos = int(data[2].strip())
          repos = []
          rindex=3+numrepos
@@ -191391,7 +191408,7 @@ index 99039e0..84ca658 100644
  
          # pkgs/txmbrs
          numpkgs = int(data[rindex].strip())
-@@ -5329,6 +6888,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5329,6 +6889,7 @@ class YumBase(depsolve.Depsolve):
          pkgcount = 0
          pkgprob = False
          curpkg = None
@@ -191399,7 +191416,7 @@ index 99039e0..84ca658 100644
          for l in data[pkgstart:]:
              l = l.rstrip()
              # our main txmbrs
-@@ -5356,6 +6916,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5356,6 +6917,7 @@ class YumBase(depsolve.Depsolve):
                      if not ignoremissing:
                          raise Errors.YumBaseError(msg)
                      else:
@@ -191407,7 +191424,7 @@ index 99039e0..84ca658 100644
                          self.logger.critical(msg)
                  else:
                      pkgcount += 1
-@@ -5432,12 +6993,18 @@ class YumBase(depsolve.Depsolve):
+@@ -5432,12 +6994,18 @@ class YumBase(depsolve.Depsolve):
          if pkgprob:
              msg = _("Transaction members, relations are missing or ts has been modified,")
              if ignoremissing:
@@ -191426,7 +191443,7 @@ index 99039e0..84ca658 100644
          return self.tsInfo.getMembers()
  
      def _remove_old_deps(self):
-@@ -5470,18 +7037,6 @@ class YumBase(depsolve.Depsolve):
+@@ -5470,18 +7038,6 @@ class YumBase(depsolve.Depsolve):
                      if requiring == required: # if they are self-requiring skip them
                          continue
                          
@@ -191445,7 +191462,7 @@ index 99039e0..84ca658 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 +7088,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5533,7 +7089,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
@@ -191470,7 +191487,7 @@ index 99039e0..84ca658 100644
                  visited[curpkg] = True
              all_leaves_visited = True
              leaves = curpkg.requiring_packages()
-@@ -5547,4 +7119,3 @@ class YumBase(depsolve.Depsolve):
+@@ -5547,4 +7120,3 @@ class YumBase(depsolve.Depsolve):
          # Debugging output
          self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has no user-installed revdeps."), pkg)
          return False
@@ -195816,7 +195833,7 @@ index aaa4f25..a2c5135 100755
                  continue
  
 diff --git a/yum/misc.py b/yum/misc.py
-index 2f6ddfe..347a07a 100644
+index 2f6ddfe..cdc08a0 100644
 --- a/yum/misc.py
 +++ b/yum/misc.py
 @@ -5,9 +5,11 @@ Assorted utility functions for yum.
@@ -195906,7 +195923,15 @@ index 2f6ddfe..347a07a 100644
      if re_primary_dirname(filename):
          return True
      if filename == '/usr/lib/sendmail':
-@@ -410,6 +439,17 @@ def procgpgkey(rawkey):
+@@ -331,7 +360,6 @@ def checksum(sumtype, file, CHUNK=2**16, datasize=None):
+ 
+         if type(file) is types.StringType:
+             fo.close()
+-            del fo
+             
+         # This screws up the length, but that shouldn't matter. We only care
+         # if this checksum == what we expect.
+@@ -410,6 +438,17 @@ def procgpgkey(rawkey):
      # Decode and return
      return base64.decodestring(block.getvalue())
  
@@ -195924,7 +195949,7 @@ index 2f6ddfe..347a07a 100644
  def getgpgkeyinfo(rawkey, multiple=False):
      '''Return a dict of info for the given ASCII armoured key text
  
-@@ -611,6 +651,8 @@ def getCacheDir(tmpdir='/var/tmp', reuse=True, prefix='yum-'):
+@@ -611,6 +650,8 @@ def getCacheDir(tmpdir='/var/tmp', reuse=True, prefix='yum-'):
      try:
          usertup = pwd.getpwuid(uid)
          username = usertup[0]
@@ -195933,7 +195958,7 @@ index 2f6ddfe..347a07a 100644
      except KeyError:
          return None # if it returns None then, well, it's bollocksed
  
-@@ -744,8 +786,9 @@ def _decompress_chunked(source, dest, ztype):
+@@ -744,8 +785,9 @@ def _decompress_chunked(source, dest, ztype):
      while True:
          try:
              data = s_fn.read(1024000)
@@ -195945,7 +195970,7 @@ index 2f6ddfe..347a07a 100644
          
          if not data: break
  
-@@ -868,67 +911,39 @@ def seq_max_split(seq, max_entries):
+@@ -868,67 +910,39 @@ def seq_max_split(seq, max_entries):
      ret.append(seq[beg:])
      return ret
  
@@ -196041,7 +196066,7 @@ index 2f6ddfe..347a07a 100644
      return item
  
  def unlink_f(filename):
-@@ -937,17 +952,19 @@ def unlink_f(filename):
+@@ -937,17 +951,19 @@ def unlink_f(filename):
      try:
          os.unlink(filename)
      except OSError, e:
@@ -196066,7 +196091,7 @@ index 2f6ddfe..347a07a 100644
  
  def _getloginuid():
      """ Get the audit-uid/login-uid, if available. None is returned if there
-@@ -976,7 +993,6 @@ def getloginuid():
+@@ -976,7 +992,6 @@ def getloginuid():
  
  # ---------- i18n ----------
  import locale
@@ -196074,7 +196099,7 @@ index 2f6ddfe..347a07a 100644
  def setup_locale(override_codecs=True, override_time=False):
      # This test needs to be before locale.getpreferredencoding() as that
      # does setlocale(LC_CTYPE, "")
-@@ -992,9 +1008,17 @@ def setup_locale(override_codecs=True, override_time=False):
+@@ -992,9 +1007,17 @@ def setup_locale(override_codecs=True, override_time=False):
          locale.setlocale(locale.LC_ALL, 'C')
          
      if override_codecs:
@@ -196095,7 +196120,7 @@ index 2f6ddfe..347a07a 100644
  
  
  def get_my_lang_code():
-@@ -1077,6 +1101,23 @@ def get_uuid(savepath):
+@@ -1077,6 +1100,23 @@ def get_uuid(savepath):
              pass
          
          return myid
@@ -196119,7 +196144,7 @@ index 2f6ddfe..347a07a 100644
          
  def decompress(filename, dest=None, fn_only=False, check_timestamps=False):
      """take a filename and decompress it into the same relative location.
-@@ -1105,17 +1146,28 @@ def decompress(filename, dest=None, fn_only=False, check_timestamps=False):
+@@ -1105,17 +1145,28 @@ def decompress(filename, dest=None, fn_only=False, check_timestamps=False):
              out = filename.replace('.xz', '')
          
      else:
@@ -196156,7 +196181,7 @@ index 2f6ddfe..347a07a 100644
          
      return out
      
-@@ -1123,13 +1175,14 @@ def repo_gen_decompress(filename, generated_name, cached=False):
+@@ -1123,13 +1174,14 @@ def repo_gen_decompress(filename, generated_name, cached=False):
      """ This is a wrapper around decompress, where we work out a cached
          generated name, and use check_timestamps. filename _must_ be from
          a repo. and generated_name is the type of the file. """
@@ -196178,7 +196203,7 @@ index 2f6ddfe..347a07a 100644
  def read_in_items_from_dot_dir(thisglob, line_as_list=True):
      """takes a glob of a dir (like /etc/foo.d/*.foo)
         returns a list of all the lines in all the files matching
-@@ -1175,3 +1228,22 @@ def cElementTree_xmlparse(filename):
+@@ -1175,3 +1227,22 @@ def cElementTree_xmlparse(filename):
      """ Lazily load/run: cElementTree.parse """
      _cElementTree_import()
      return __cached_cElementTree.parse(filename)
@@ -196254,7 +196279,7 @@ index 4af563a..a702ac1 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..69c612f 100644
+index 5ef9951..9522235 100644
 --- a/yum/packages.py
 +++ b/yum/packages.py
 @@ -38,6 +38,7 @@ import struct
@@ -196893,7 +196918,24 @@ index 5ef9951..69c612f 100644
          """verify that the installed files match the packaged checksum
             optionally verify they match only if they are in the 'pattern' list
             returns a tuple """
-@@ -1902,6 +2044,8 @@ class YumInstalledPackage(YumHeaderPackage):
+@@ -1891,17 +2033,22 @@ class YumInstalledPackage(YumHeaderPackage):
+                     problems.append(prob)
+ 
+                 my_mode = my_st.st_mode
++                pf_mode = pf.mode
++                perm_mask = 0777
+                 if 'ghost' in ftypes: #  This is what rpm does, although it
+-                    my_mode &= 0777   # doesn't usually get here.
+-                if check_perms and pf.verify_mode and my_mode != pf.mode:
++                    my_mode &= perm_mask   # doesn't usually get here.
++                    pf_mode &= perm_mask
++                if check_perms and pf.verify_mode and my_mode != pf_mode:
+                     prob = _PkgVerifyProb('mode', 'mode does not match', ftypes)
+-                    prob.database_value = pf.mode
++                    prob.database_value = pf_mode
+                     prob.disk_value     = my_st.st_mode
+                     problems.append(prob)
+ 
                  verify_digest = pf.verify_digest
                  if fast and not problems and (my_st_size == pf.size):
                      verify_digest = False
@@ -196902,7 +196944,7 @@ index 5ef9951..69c612f 100644
                  if not pf.digest:
                      verify_digest = False
  
-@@ -1946,7 +2090,7 @@ class YumInstalledPackage(YumHeaderPackage):
+@@ -1946,7 +2093,7 @@ class YumInstalledPackage(YumHeaderPackage):
                              my_csum = digest_type + ':' + my_csum
                              my_st_size = fp.read_size
  
@@ -196911,7 +196953,7 @@ index 5ef9951..69c612f 100644
                          prob = _PkgVerifyProb('checksum',
                                                'checksum does not match', ftypes)
                          prob.database_value = csum
-@@ -2120,11 +2264,11 @@ class YumLocalPackage(YumHeaderPackage):
+@@ -2120,11 +2267,11 @@ class YumLocalPackage(YumHeaderPackage):
              relpath = self.localpath
  
          if self._baseurl:
@@ -198364,7 +198406,7 @@ index 9b265f9..74a0f3f 100644
 +
 +        self.display.verify_txmbr(self.base, txmbr, count)
 diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
-index 8a6f6f3..c11c818 100644
+index 8a6f6f3..16b647f 100644
 --- a/yum/sqlitesack.py
 +++ b/yum/sqlitesack.py
 @@ -69,7 +69,7 @@ def _parse_pkg_n(match, regexp_match, n):
@@ -198430,7 +198472,7 @@ index 8a6f6f3..c11c818 100644
 +        # Check for the new weak deps. tables...
 +        sql_table_exists = True
 +        if prcotype in ('suggests', 'enhances', 'recommends', 'supplements'):
-+            cur = self._sql_MD('primary', "PRAGMA index_info(%s)" % prcotype)
++            cur = self._sql_MD('primary', "PRAGMA table_info(%s)" % prcotype)
 +            for ob in cur:
 +                break
 +            else:
@@ -200688,7 +200730,7 @@ index e5e9ece..35359e2 100644
          fo = None
  
 diff --git a/yumcommands.py b/yumcommands.py
-index 4dcbea7..c76e192 100644
+index 4dcbea7..8ee2650 100644
 --- a/yumcommands.py
 +++ b/yumcommands.py
 @@ -13,6 +13,7 @@
@@ -204236,7 +204278,7 @@ index 4dcbea7..c76e192 100644
 +                # repo.
 +                for txmbr in txmbrs[:]:
 +                    pkgs = base.pkgSack.searchNames([txmbr.name])
-+                    apkgs = None
++                    apkgs = []
 +                    for pkg in sorted(pkgs):
 +                        if pkg.repoid == repoid: # Backwards filter_pkgs_repoid
 +                            continue
diff --git a/yum.spec b/yum.spec
index ee54ddc..51875cd 100644
--- a/yum.spec
+++ b/yum.spec
@@ -64,7 +64,7 @@ BuildRequires: bash-completion
 Summary: RPM package installer/updater/manager
 Name: yum
 Version: 3.4.3
-Release: 144%{?dist}
+Release: 145%{?dist}
 License: GPLv2+
 Group: System Environment/Base
 Source0: http://yum.baseurl.org/download/3.4/%{name}-%{version}.tar.gz
@@ -507,6 +507,15 @@ exit 0
 %endif
 
 %changelog
+* Tue Apr  8 2014 James Antill <james at fedoraproject.org> - 3.4.3-145
+- update to latest HEAD
+- Fix for weird anaconda C NULL exception traceback. BZ 1058297.
+- Fix apkgs setup for removing packages. BZ 1019960.
+- Fix typo, so we can find the suggests/etc. tables.
+- Change 'size' option to 'maxsize' in yum.logrotate. BZ 1005879.
+- Mask st_mode to fix verifying permissions for ghost files. BZ 1045415.
+- normpath() file URIs. BZ 1009499.
+
 * Tue Mar 25 2014 James Antill <james at fedoraproject.org> - 3.4.3-144
 - update to latest HEAD
 - Fix dumping xml for suggests/etc.


More information about the scm-commits mailing list