[yum/f18] Update to latest HEAD

Zdeněk Pavlas zpavlas at fedoraproject.org
Tue Oct 2 11:25:13 UTC 2012


commit d7f313512e616b5f74b443e86526fd1865766ab1
Author: Zdeněk Pavlas <zpavlas at redhat.com>
Date:   Tue Oct 2 13:24:53 2012 +0200

    Update to latest HEAD

 yum-HEAD.patch |  450 +++++++++++++++++++++++++++++++-------------------------
 yum.spec       |   11 ++-
 2 files changed, 260 insertions(+), 201 deletions(-)
---
diff --git a/yum-HEAD.patch b/yum-HEAD.patch
index 41dc2e8..a2b10b9 100644
--- a/yum-HEAD.patch
+++ b/yum-HEAD.patch
@@ -96,7 +96,7 @@ index 2f6154e..2e5a052 100644
 diff --git a/cli.py b/cli.py
 old mode 100644
 new mode 100755
-index 6056d38..adc3516
+index 6056d38..cf2c369
 --- a/cli.py
 +++ b/cli.py
 @@ -25,7 +25,7 @@ import sys
@@ -384,13 +384,12 @@ index 6056d38..adc3516
                  stuff_to_download = True
                  po = txmbr.po
                  if po:
-@@ -489,9 +536,21 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -489,9 +536,20 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          else:
              self.reportDownloadSize(downloadpkgs, install_only)
          
 +        cfr = self.tsInfo._check_future_rpmdbv
 +        if (cfr is not None and
-+            cfr[0] == self.tsInfo.state_counter and
 +            self.tsInfo.futureRpmDBVersion() != cfr[1]):
 +            msg = _("future rpmdb ver mismatched saved transaction version,")
 +            if cfr[2]:
@@ -407,7 +406,7 @@ index 6056d38..adc3516
                  self.verbose_logger.info(_('Exiting on user Command'))
                  return -1
  
-@@ -609,12 +668,14 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -609,12 +667,14 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return resultobject.return_code
          
      def gpgsigcheck(self, pkgs):
@@ -427,7 +426,7 @@ index 6056d38..adc3516
          for po in pkgs:
              result, errmsg = self.sigCheckPkg(po)
  
-@@ -623,7 +684,8 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -623,7 +683,8 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
                  continue            
  
              elif result == 1:
@@ -437,7 +436,7 @@ index 6056d38..adc3516
                      raise yum.Errors.YumBaseError, \
                              _('Refusing to automatically import keys when running ' \
                              'unattended.\nUse "-y" to override.')
-@@ -691,12 +753,62 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -691,12 +752,62 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
                                       ", ".join(matches))
              self.verbose_logger.log(yum.logginglevels.INFO_2, msg)
  
@@ -506,7 +505,7 @@ index 6056d38..adc3516
          # get the list of available packages
          # iterate over the user's list
          # add packages to Transaction holding class if they match.
-@@ -710,11 +822,36 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -710,11 +821,36 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          for arg in userlist:
              if (arg.endswith('.rpm') and (yum.misc.re_remote_url(arg) or
                                            os.path.exists(arg))):
@@ -545,7 +544,7 @@ index 6056d38..adc3516
              except yum.Errors.InstallError:
                  self.verbose_logger.log(yum.logginglevels.INFO_2,
                                          _('No package %s%s%s available.'),
-@@ -723,6 +860,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -723,6 +859,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
                  self._maybeYouMeant(arg)
              else:
                  done = True
@@ -553,7 +552,7 @@ index 6056d38..adc3516
          if len(self.tsInfo) > oldcount:
              change = len(self.tsInfo) - oldcount
              return 2, [P_('%d package to install', '%d packages to install', change) % change]
-@@ -732,9 +870,27 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -732,9 +869,27 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return 0, [_('Nothing to do')]
          
      def updatePkgs(self, userlist, quiet=0, update_to=False):
@@ -584,7 +583,7 @@ index 6056d38..adc3516
          # if there is no userlist, then do global update below
          # this is probably 90% of the calls
          # if there is a userlist then it's for updating pkgs, not obsoleting
-@@ -745,21 +901,18 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -745,21 +900,18 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
  
          else:
              # go through the userlist - look for items that are local rpms. If we find them
@@ -615,7 +614,7 @@ index 6056d38..adc3516
  
          if len(self.tsInfo) > oldcount:
              change = len(self.tsInfo) - oldcount
-@@ -770,9 +923,24 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -770,9 +922,24 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
      #  Note that we aren't in __init__ yet for a couple of reasons, but we 
      # probably will get there for 3.2.28.
      def distroSyncPkgs(self, userlist):
@@ -643,7 +642,7 @@ index 6056d38..adc3516
  
          level = 'diff'
          if userlist and userlist[0] in ('full', 'diff', 'different'):
-@@ -831,6 +999,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -831,6 +998,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
                          continue
  
                      nayi = napkg.yumdb_info
@@ -651,7 +650,7 @@ index 6056d38..adc3516
                      for apkg in self.pkgSack.searchPkgTuple(napkg.pkgtup):
                          if ('checksum_type' in nayi and
                              'checksum_data' in nayi and
-@@ -865,15 +1034,54 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -865,15 +1033,54 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          else:
              return 0, [_('No Packages marked for Distribution Synchronization')]
  
@@ -712,7 +711,7 @@ index 6056d38..adc3516
              if not rms:
                  self._checkMaybeYouMeant(arg, always_output=False, rpmdb_only=True)
              all_rms.extend(rms)
-@@ -884,12 +1092,24 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -884,12 +1091,24 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
              return 0, [_('No Packages marked for removal')]
      
      def downgradePkgs(self, userlist):
@@ -740,7 +739,7 @@ index 6056d38..adc3516
          for arg in userlist:
              if (arg.endswith('.rpm') and (yum.misc.re_remote_url(arg) or
                                            os.path.exists(arg))):
-@@ -905,26 +1125,44 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -905,26 +1124,44 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
                                          self.term.MODE['bold'], arg,
                                          self.term.MODE['normal'])
                  self._maybeYouMeant(arg)
@@ -789,7 +788,7 @@ index 6056d38..adc3516
              except yum.Errors.ReinstallRemoveError:
                  self._checkMaybeYouMeant(arg, always_output=False)
              except yum.Errors.ReinstallInstallError, e:
-@@ -940,15 +1178,31 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -940,15 +1177,31 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
              except yum.Errors.ReinstallError, e:
                  assert False, "Shouldn't happen, but just in case"
                  self.verbose_logger.log(yum.logginglevels.INFO_2, e)
@@ -824,7 +823,7 @@ index 6056d38..adc3516
          # read in each package into a YumLocalPackage Object
          # append it to self.localPackages
          # check if it can be installed or updated based on nevra versus rpmdb
-@@ -972,20 +1226,25 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -972,20 +1225,25 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return 0, [_('Nothing to do')]
  
      def returnPkgLists(self, extcmds, installed_available=False):
@@ -864,7 +863,7 @@ index 6056d38..adc3516
          special = ['available', 'installed', 'all', 'extras', 'updates', 'recent',
                     'obsoletes']
          
-@@ -1017,8 +1276,25 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1017,8 +1275,25 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return ypl
  
      def search(self, args):
@@ -892,7 +891,7 @@ index 6056d38..adc3516
          
          # call the yum module search function with lists of tags to search
          # and what to search for
-@@ -1108,9 +1384,20 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1108,9 +1383,20 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return 0, matching
  
      def deplist(self, args):
@@ -915,7 +914,7 @@ index 6056d38..adc3516
          pkgs = []
          for arg in args:
              if (arg.endswith('.rpm') and (yum.misc.re_remote_url(arg) or
-@@ -1131,10 +1418,19 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1131,10 +1417,19 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return 0, []
  
      def provides(self, args):
@@ -939,7 +938,7 @@ index 6056d38..adc3516
          old_sdup = self.conf.showdupesfromrepos
          # For output, as searchPackageProvides() is always in showdups mode
          self.conf.showdupesfromrepos = True
-@@ -1147,6 +1443,8 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1147,6 +1442,8 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
              paths = set(sys.path + os.environ['PATH'].split(':'))
              nargs = []
              for arg in args:
@@ -948,7 +947,7 @@ index 6056d38..adc3516
                  if yum.misc.re_filename(arg) or yum.misc.re_glob(arg):
                      continue
                  for path in paths:
-@@ -1163,20 +1461,77 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1163,20 +1460,77 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return 0, []
      
      def resolveDepCli(self, args):
@@ -1031,7 +1030,7 @@ index 6056d38..adc3516
          hdrcode = pkgcode = xmlcode = dbcode = expccode = 0
          pkgresults = hdrresults = xmlresults = dbresults = expcresults = []
          msg = self.fmtKeyValFill(_('Cleaning repos: '), 
-@@ -1228,130 +1583,257 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1228,130 +1582,257 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return code, []
  
      def returnGroupLists(self, userlist):
@@ -1369,7 +1368,7 @@ index 6056d38..adc3516
                  except yum.Errors.GroupsError:
                      self.logger.critical(_('Warning: Group %s does not exist.'), group_string)
                      continue
-@@ -1368,17 +1850,61 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1368,17 +1849,61 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
              return 2, [P_('%d package to Install', '%d packages to Install', len(pkgs_used)) % len(pkgs_used)]
  
      def removeGroups(self, grouplist):
@@ -1439,7 +1438,7 @@ index 6056d38..adc3516
                  
          if not pkgs_used:
              return 0, [_('No packages to remove from groups')]
-@@ -1389,7 +1915,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1389,7 +1914,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
  
      def _promptWanted(self):
          # shortcut for the always-off/always-on options
@@ -1448,7 +1447,7 @@ index 6056d38..adc3516
              return False
          if self.conf.alwaysprompt:
              return True
-@@ -1400,7 +1926,6 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1400,7 +1925,6 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          #  package wasn't explictly given on the command line
          for txmbr in self.tsInfo.getMembers():
              if txmbr.isDep or \
@@ -1456,7 +1455,7 @@ index 6056d38..adc3516
                     txmbr.name not in self.extcmds:
                  return True
          
-@@ -1408,11 +1933,11 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1408,11 +1932,11 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return False
  
      def usage(self):
@@ -1470,7 +1469,7 @@ index 6056d38..adc3516
          sys.stdout.write(self.optparser.get_usage())
      
      def _installable(self, pkg, ematch=False):
-@@ -1468,9 +1993,9 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1468,9 +1992,9 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return False
  
  class YumOptionParser(OptionParser):
@@ -1482,7 +1481,7 @@ index 6056d38..adc3516
  
      def __init__(self,base, **kwargs):
          # check if this is called with a utils=True/False parameter
-@@ -1488,13 +2013,23 @@ class YumOptionParser(OptionParser):
+@@ -1488,13 +2012,23 @@ class YumOptionParser(OptionParser):
          self._addYumBasicOptions()
  
      def error(self, msg):
@@ -1508,7 +1507,7 @@ index 6056d38..adc3516
          try:
              args = _filtercmdline(
                          ('--noplugins','--version','-q', '-v', "--quiet", "--verbose"), 
-@@ -1521,7 +2056,15 @@ class YumOptionParser(OptionParser):
+@@ -1521,7 +2055,15 @@ class YumOptionParser(OptionParser):
          return ret
          
      def setupYumConfig(self, args=None):
@@ -1525,7 +1524,7 @@ index 6056d38..adc3516
          if not args:
              (opts, cmds) = self.parse_args()
          else:
-@@ -1533,16 +2076,20 @@ class YumOptionParser(OptionParser):
+@@ -1533,16 +2075,20 @@ class YumOptionParser(OptionParser):
          try:
              # config file is parsed and moving us forward
              # set some things in it.
@@ -1551,7 +1550,7 @@ index 6056d38..adc3516
                  self.base.conf.cache = 1
  
              if opts.obsoletes:
-@@ -1610,10 +2157,6 @@ class YumOptionParser(OptionParser):
+@@ -1610,10 +2156,6 @@ class YumOptionParser(OptionParser):
                      self.base.usage()
                      sys.exit(1)
  
@@ -1562,7 +1561,7 @@ index 6056d38..adc3516
              # Disable all gpg key checking, if requested.
              if opts.nogpgcheck:
                  #  Altering the normal configs. doesn't work too well, esp. with
-@@ -1640,6 +2183,14 @@ class YumOptionParser(OptionParser):
+@@ -1640,10 +2182,18 @@ class YumOptionParser(OptionParser):
          sys.exit(1)
  
      def getRoot(self,opts):
@@ -1577,7 +1576,12 @@ index 6056d38..adc3516
          self._checkAbsInstallRoot(opts)
          # If the conf file is inside the  installroot - use that.
          # otherwise look for it in the normal root
-@@ -1701,6 +2252,9 @@ class YumOptionParser(OptionParser):
+-        if opts.installroot:
++        if opts.installroot and opts.installroot.lstrip('/'):
+             if os.access(opts.installroot+'/'+opts.conffile, os.R_OK):
+                 opts.conffile = opts.installroot+'/'+opts.conffile
+             elif opts.conffile == '/etc/yum/yum.conf':
+@@ -1701,6 +2251,9 @@ class YumOptionParser(OptionParser):
          group.add_option("--showduplicates", dest="showdupesfromrepos",
                          action="store_true",
                  help=_("show duplicates, in repos, in list/search commands"))
@@ -1587,7 +1591,7 @@ index 6056d38..adc3516
          group.add_option("-e", "--errorlevel", dest="errorlevel", default=None,
                  help=_("error output level"), type='int',
                  metavar='[error level]')
-@@ -1713,6 +2267,10 @@ class YumOptionParser(OptionParser):
+@@ -1713,6 +2266,10 @@ class YumOptionParser(OptionParser):
                          help=_("verbose operation"))
          group.add_option("-y", "--assumeyes", dest="assumeyes",
                  action="store_true", help=_("answer yes for all questions"))
@@ -1600,7 +1604,7 @@ index 6056d38..adc3516
          group.add_option("--installroot", help=_("set install root"), 
 diff --git a/completion-helper.py b/completion-helper.py
 new file mode 100755
-index 0000000..0e4b96b
+index 0000000..05801d1
 --- /dev/null
 +++ b/completion-helper.py
 @@ -0,0 +1,90 @@
@@ -1629,7 +1633,7 @@ index 0000000..0e4b96b
 +
 +import cli
 +import yumcommands
-+from yum.Errors import GroupsError
++from yum.Errors import GroupsError, ConfigError
 +
 +
 +class GroupsCompletionCommand(yumcommands.GroupsCommand):
@@ -1682,11 +1686,11 @@ index 0000000..0e4b96b
 +    base.registerCommand(RepoListCompletionCommand())
 +    base.getOptionsConfig(args)
 +    base.parseCommands()
-+    for repo in base.repos.listEnabled():
-+        repo.skip_if_unavailable = True
 +    try:
++        for repo in base.repos.listEnabled():
++            repo.skip_if_unavailable = True
 +        base.doCommands()
-+    except GroupsError, e:
++    except (GroupsError, ConfigError), e:
 +        base.logger.error(e)
 +
 +if __name__ == "__main__":
@@ -2574,7 +2578,7 @@ index 1a8202a..dab01f6 100644
  .IP "\fB\-\-setopt=option=value\fP"
  Set any config option in yum config or repo files. For options in the global 
 diff --git a/docs/yum.conf.5 b/docs/yum.conf.5
-index 515aa73..01facf8 100644
+index 515aa73..029fa75 100644
 --- a/docs/yum.conf.5
 +++ b/docs/yum.conf.5
 @@ -114,15 +114,27 @@ are causing problems from the transaction.
@@ -2706,7 +2710,7 @@ index 515aa73..01facf8 100644
  \fBmultilib_policy \fR
  Can be set to 'all' or 'best'. All means install all possible arches for any package you 
  want to install. Therefore yum install foo will install foo.i386 and foo.x86_64 on x86_64, 
-@@ -593,8 +667,50 @@ See color_list_installed_older for possible values.
+@@ -593,8 +667,53 @@ See color_list_installed_older for possible values.
  When removing packages (by removal, update or obsoletion) go through each
  package's dependencies. If any of them are no longer required by any other 
  package then also mark them to be removed.
@@ -2739,12 +2743,15 @@ index 515aa73..01facf8 100644
 +Should the load-ts command ignore packages that are missing. This includes
 +packages in the TS to be removed, which aren't installed, and packages in the
 +TS to be added, which aren't available.
++If this is set to true, and an rpm is missing then loadts_ignorenewrpm is
++automatically set to true.
 +Boolean (1, 0, True, False, yes, no) Defaults to False
 +
 +.IP
 +\fBloadts_ignorerpm\fR
 +Should the load-ts command ignore the rpmdb version (yum version nogroups) or
 +abort if there is a mismatch between the TS file and the current machine.
++If this is set to true, then loadts_ignorenewrpm is automatically set to true.
 +Boolean (1, 0, True, False, yes, no) Defaults to False
 +
 +.IP
@@ -2757,7 +2764,7 @@ index 515aa73..01facf8 100644
  
  
  .SH "[repository] OPTIONS"
-@@ -755,6 +871,11 @@ repository.
+@@ -755,6 +874,11 @@ repository.
  Overrides the \fBbandwidth\fR option from the [main] section for this
  repository.
  
@@ -2769,7 +2776,7 @@ index 515aa73..01facf8 100644
  
  .IP
  \fBsslcacert \fR
-@@ -776,6 +897,10 @@ repository.
+@@ -776,6 +900,10 @@ repository.
  Overrides the \fBsslclientkey\fR option from the [main] section for this
  repository.
  
@@ -2780,7 +2787,7 @@ index 515aa73..01facf8 100644
  
  .IP
  \fBmetadata_expire \fR
-@@ -824,7 +949,11 @@ as greater/less than any other. defaults to 1000
+@@ -824,7 +952,11 @@ as greater/less than any other. defaults to 1000
  If set to True yum will continue running if this repository cannot be 
  contacted for any reason. This should be set carefully as all repos are consulted
  for any given command. Defaults to False.
@@ -151392,7 +151399,7 @@ index c1af4ad..e3e3956 100644
      pass
      
 diff --git a/yum/__init__.py b/yum/__init__.py
-index 99039e0..198dc6d 100644
+index 99039e0..a1b045f 100644
 --- a/yum/__init__.py
 +++ b/yum/__init__.py
 @@ -46,8 +46,13 @@ import operator
@@ -151857,7 +151864,16 @@ index 99039e0..198dc6d 100644
          warnings.warn(_('doGroupSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -829,7 +940,7 @@ class YumBase(depsolve.Depsolve):
+@@ -820,16 +931,10 @@ class YumBase(depsolve.Depsolve):
+             self.verbose_logger.log(logginglevels.DEBUG_4,
+                 _('Adding group file from repository: %s'), repo)
+             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)
+-                # Do we want a RepoError here?
+-                
              try:
                  self._comps.add(groupfile)
              except (Errors.GroupsError,Errors.CompsException), e:
@@ -151866,7 +151882,7 @@ index 99039e0..198dc6d 100644
                  self.logger.critical(msg)
              else:
                  repo.groups_added = True
-@@ -837,7 +948,10 @@ class YumBase(depsolve.Depsolve):
+@@ -837,7 +942,10 @@ class YumBase(depsolve.Depsolve):
          if self._comps.compscount == 0:
              raise Errors.GroupsError, _('No Groups Available in any repository')
  
@@ -151878,7 +151894,7 @@ index 99039e0..198dc6d 100644
          self.verbose_logger.debug('group time: %0.3f' % (time.time() - group_st))                
          return self._comps
  
-@@ -868,7 +982,7 @@ class YumBase(depsolve.Depsolve):
+@@ -868,7 +976,7 @@ class YumBase(depsolve.Depsolve):
                      # feed it into _tags.add()
                      self._tags.add(repo.id, tag_sqlite)
                  except (Errors.RepoError, Errors.PkgTagsError), e:
@@ -151887,7 +151903,7 @@ index 99039e0..198dc6d 100644
                      self.logger.critical(msg)
                      
                  
-@@ -881,9 +995,18 @@ class YumBase(depsolve.Depsolve):
+@@ -881,9 +989,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,
@@ -151907,7 +151923,7 @@ index 99039e0..198dc6d 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 +1044,11 @@ class YumBase(depsolve.Depsolve):
+@@ -921,6 +1038,11 @@ class YumBase(depsolve.Depsolve):
                         fdel=lambda self: setattr(self, "_history", None),
                         doc="Yum History Object")
  
@@ -151919,7 +151935,7 @@ index 99039e0..198dc6d 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 +1056,10 @@ class YumBase(depsolve.Depsolve):
+@@ -928,9 +1050,10 @@ class YumBase(depsolve.Depsolve):
      
      
      def doSackFilelistPopulate(self):
@@ -151933,7 +151949,7 @@ index 99039e0..198dc6d 100644
          necessary = False
          
          # I can't think of a nice way of doing this, we have to have the sack here
-@@ -951,8 +1080,12 @@ class YumBase(depsolve.Depsolve):
+@@ -951,8 +1074,12 @@ class YumBase(depsolve.Depsolve):
              self.repos.populateSack(mdtype='filelists')
             
      def yumUtilsMsg(self, func, prog):
@@ -151948,7 +151964,7 @@ index 99039e0..198dc6d 100644
          if self.rpmdb.contains(name="yum-utils"):
              return
  
-@@ -964,8 +1097,17 @@ class YumBase(depsolve.Depsolve):
+@@ -964,8 +1091,17 @@ class YumBase(depsolve.Depsolve):
               (hibeg, prog, hiend))
  
      def buildTransaction(self, unfinished_transactions_check=True):
@@ -151968,7 +151984,7 @@ index 99039e0..198dc6d 100644
          if (unfinished_transactions_check and
              misc.find_unfinished_transactions(yumlibpath=self.conf.persistdir)):
              msg = _('There are unfinished transactions remaining. You might ' \
-@@ -1004,7 +1146,7 @@ class YumBase(depsolve.Depsolve):
+@@ -1004,7 +1140,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 )
  
@@ -151977,7 +151993,7 @@ index 99039e0..198dc6d 100644
              self.tsInfo.pkgSack.dropCachedData()
  
          # FIXME: This is horrible, see below and yummain. Maybe create a real
-@@ -1044,6 +1186,37 @@ class YumBase(depsolve.Depsolve):
+@@ -1044,6 +1180,37 @@ class YumBase(depsolve.Depsolve):
                  if first.verEQ(other):
                      continue
                  msg = _('Protected multilib versions: %s != %s')
@@ -152015,7 +152031,7 @@ index 99039e0..198dc6d 100644
                  xrestring.append(msg % (first, other))
          if xrestring:
              rescode = 1
-@@ -1242,13 +1415,15 @@ class YumBase(depsolve.Depsolve):
+@@ -1242,13 +1409,15 @@ class YumBase(depsolve.Depsolve):
          if None in pkgtup:
              return None
          return pkgtup
@@ -152035,7 +152051,7 @@ index 99039e0..198dc6d 100644
          if pkgtup is None:
              return
          self._not_found_i[pkgtup] = YumNotFoundPackage(pkgtup)
-@@ -1454,8 +1629,14 @@ class YumBase(depsolve.Depsolve):
+@@ -1454,8 +1623,14 @@ class YumBase(depsolve.Depsolve):
          return probs
  
      def runTransaction(self, cb):
@@ -152051,7 +152067,7 @@ index 99039e0..198dc6d 100644
          self.plugins.run('pretrans')
  
          #  We may want to put this other places, eventually, but for now it's
-@@ -1516,10 +1697,23 @@ class YumBase(depsolve.Depsolve):
+@@ -1516,10 +1691,23 @@ class YumBase(depsolve.Depsolve):
                  pass
          self._ts_save_file = None
          
@@ -152075,7 +152091,7 @@ index 99039e0..198dc6d 100644
          
          # make resultobject - just a plain yumgenericholder object
          resultobject = misc.GenericHolder()
-@@ -1567,13 +1761,24 @@ class YumBase(depsolve.Depsolve):
+@@ -1567,13 +1755,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):
@@ -152105,7 +152121,7 @@ index 99039e0..198dc6d 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 +1789,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1584,9 +1783,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
@@ -152122,7 +152138,7 @@ index 99039e0..198dc6d 100644
          for txmbr in self.tsInfo:
              if txmbr.output_state in TS_INSTALL_STATES:
                  if not self.rpmdb.contains(po=txmbr.po):
-@@ -1596,7 +1808,9 @@ class YumBase(depsolve.Depsolve):
+@@ -1596,7 +1802,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
@@ -152132,7 +152148,7 @@ index 99039e0..198dc6d 100644
                  po = self.getInstalledPackageObject(txmbr.pkgtup)
                  rpo = txmbr.po
                  po.yumdb_info.from_repo = rpo.repoid
-@@ -1630,6 +1844,10 @@ class YumBase(depsolve.Depsolve):
+@@ -1630,6 +1838,10 @@ class YumBase(depsolve.Depsolve):
                      if md:
                          po.yumdb_info.from_repo_timestamp = str(md.timestamp)
  
@@ -152143,7 +152159,7 @@ index 99039e0..198dc6d 100644
                  loginuid = misc.getloginuid()
                  if txmbr.updates or txmbr.downgrades or txmbr.reinstall:
                      if txmbr.updates:
-@@ -1640,11 +1858,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1640,11 +1852,16 @@ class YumBase(depsolve.Depsolve):
                          opo = po
                      if 'installed_by' in opo.yumdb_info:
                          po.yumdb_info.installed_by = opo.yumdb_info.installed_by
@@ -152160,7 +152176,7 @@ index 99039e0..198dc6d 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 +1885,13 @@ class YumBase(depsolve.Depsolve):
+@@ -1662,10 +1879,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
@@ -152174,7 +152190,7 @@ index 99039e0..198dc6d 100644
                  self.verbose_logger.log(logginglevels.DEBUG_2, 'What is this? %s' % txmbr.po)
  
          self.plugins.run('postverifytrans')
-@@ -1680,10 +1906,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1680,10 +1900,11 @@ class YumBase(depsolve.Depsolve):
          self.verbose_logger.debug('VerifyTransaction time: %0.3f' % (time.time() - vt_st))
  
      def costExcludePackages(self):
@@ -152190,7 +152206,7 @@ index 99039e0..198dc6d 100644
          # if all the repo.costs are equal then don't bother running things
          costs = {}
          for r in self.repos.listEnabled():
-@@ -1705,10 +1932,12 @@ class YumBase(depsolve.Depsolve):
+@@ -1705,10 +1926,12 @@ class YumBase(depsolve.Depsolve):
              done = True
  
      def excludePackages(self, repo=None):
@@ -152206,7 +152222,7 @@ index 99039e0..198dc6d 100644
          if "all" in self.conf.disable_excludes:
              return
          
-@@ -1735,9 +1964,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1735,9 +1958,11 @@ class YumBase(depsolve.Depsolve):
              self.pkgSack.addPackageExcluder(repoid, exid,'exclude.match', match)
  
      def includePackages(self, repo):
@@ -152221,7 +152237,7 @@ index 99039e0..198dc6d 100644
          includelist = repo.getIncludePkgList()
          
          if len(includelist) == 0:
-@@ -1757,8 +1988,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1757,8 +1982,11 @@ class YumBase(depsolve.Depsolve):
          self.pkgSack.addPackageExcluder(repo.id, exid, 'exclude.marked')
          
      def doLock(self, lockfile = YUM_PID_FILE):
@@ -152235,7 +152251,7 @@ index 99039e0..198dc6d 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 +2008,26 @@ class YumBase(depsolve.Depsolve):
+@@ -1774,38 +2002,26 @@ class YumBase(depsolve.Depsolve):
          
          mypid=str(os.getpid())    
          while not self._lock(lockfile, mypid, 0644):
@@ -152289,7 +152305,7 @@ index 99039e0..198dc6d 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 +2052,69 @@ class YumBase(depsolve.Depsolve):
+@@ -1830,31 +2046,69 @@ class YumBase(depsolve.Depsolve):
          self._unlock(lockfile)
          self._lockfile = None
          
@@ -152369,7 +152385,7 @@ index 99039e0..198dc6d 100644
          failed = False
  
          if type(fo) is types.InstanceType:
-@@ -1894,9 +2154,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1894,9 +2148,16 @@ class YumBase(depsolve.Depsolve):
          
          
      def verifyChecksum(self, fo, checksumType, csum):
@@ -152389,7 +152405,7 @@ index 99039e0..198dc6d 100644
          try:
              filesum = misc.checksum(checksumType, fo)
          except Errors.MiscError, e:
-@@ -1908,6 +2175,17 @@ class YumBase(depsolve.Depsolve):
+@@ -1908,6 +2169,17 @@ class YumBase(depsolve.Depsolve):
          return 0
  
      def downloadPkgs(self, pkglist, callback=None, callback_total=None):
@@ -152407,7 +152423,7 @@ index 99039e0..198dc6d 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 +2257,9 @@ class YumBase(depsolve.Depsolve):
+@@ -1979,8 +2251,9 @@ class YumBase(depsolve.Depsolve):
              urlgrabber.progress.text_meter_total_size(remote_size)
          beg_download = time.time()
          i = 0
@@ -152418,7 +152434,7 @@ index 99039e0..198dc6d 100644
          for po in remote_pkgs:
              #  Recheck if the file is there, works around a couple of weird
              # edge cases.
-@@ -1992,52 +2271,47 @@ class YumBase(depsolve.Depsolve):
+@@ -1992,52 +2265,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,
@@ -152497,7 +152513,7 @@ index 99039e0..198dc6d 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 +2326,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2052,7 +2320,22 @@ class YumBase(depsolve.Depsolve):
          return errors
  
      def verifyHeader(self, fo, po, raiseError):
@@ -152521,7 +152537,7 @@ index 99039e0..198dc6d 100644
          if type(fo) is types.InstanceType:
              fo = fo.filename
              
-@@ -2076,9 +2365,12 @@ class YumBase(depsolve.Depsolve):
+@@ -2076,9 +2359,12 @@ class YumBase(depsolve.Depsolve):
          return 1
          
      def downloadHeader(self, po):
@@ -152536,7 +152552,7 @@ index 99039e0..198dc6d 100644
          if hasattr(po, 'pkgtype') and po.pkgtype == 'local':
              return
                  
-@@ -2122,15 +2414,17 @@ class YumBase(depsolve.Depsolve):
+@@ -2122,15 +2408,17 @@ class YumBase(depsolve.Depsolve):
              return
  
      def sigCheckPkg(self, po):
@@ -152562,7 +152578,7 @@ index 99039e0..198dc6d 100644
          if self._override_sigchecks:
              check = False
              hasgpgkey = 0
-@@ -2181,6 +2475,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2181,6 +2469,9 @@ class YumBase(depsolve.Depsolve):
          return result, msg
  
      def cleanUsedHeadersPackages(self):
@@ -152572,7 +152588,7 @@ index 99039e0..198dc6d 100644
          filelist = []
          for txmbr in self.tsInfo:
              if txmbr.po.state not in TS_INSTALL_STATES:
-@@ -2218,27 +2515,42 @@ class YumBase(depsolve.Depsolve):
+@@ -2218,27 +2509,42 @@ class YumBase(depsolve.Depsolve):
                      _('%s removed'), fn)
          
      def cleanHeaders(self):
@@ -152617,7 +152633,7 @@ index 99039e0..198dc6d 100644
          cachedir = self.conf.persistdir + "/rpmdb-indexes/"
          if not os.path.exists(cachedir):
              filelist = []
-@@ -2272,8 +2584,29 @@ class YumBase(depsolve.Depsolve):
+@@ -2272,8 +2578,29 @@ class YumBase(depsolve.Depsolve):
  
      def doPackageLists(self, pkgnarrow='all', patterns=None, showdups=None,
                         ignore_case=False):
@@ -152649,7 +152665,7 @@ index 99039e0..198dc6d 100644
          if showdups is None:
              showdups = self.conf.showdupesfromrepos
          ygh = misc.GenericHolder(iter=pkgnarrow)
-@@ -2323,10 +2656,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2323,10 +2650,22 @@ class YumBase(depsolve.Depsolve):
                      key = (pkg.name, pkg.arch)
                      if pkg.pkgtup in dinst:
                          reinstall_available.append(pkg)
@@ -152675,7 +152691,7 @@ index 99039e0..198dc6d 100644
  
          # produce the updates list of tuples
          elif pkgnarrow == 'updates':
-@@ -2461,14 +2806,13 @@ class YumBase(depsolve.Depsolve):
+@@ -2461,14 +2800,13 @@ class YumBase(depsolve.Depsolve):
  
          
      def findDeps(self, pkgs):
@@ -152695,7 +152711,7 @@ index 99039e0..198dc6d 100644
          results = {}
  
          for pkg in pkgs:
-@@ -2495,10 +2839,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2495,10 +2833,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):
@@ -152722,7 +152738,7 @@ index 99039e0..198dc6d 100644
          sql_fields = []
          for f in fields:
              sql_fields.append(RPM_TO_SQLITE.get(f, f))
-@@ -2661,6 +3017,14 @@ class YumBase(depsolve.Depsolve):
+@@ -2661,6 +3011,14 @@ class YumBase(depsolve.Depsolve):
                      yield (po, vs)
  
      def searchPackageTags(self, criteria):
@@ -152737,7 +152753,7 @@ index 99039e0..198dc6d 100644
          results = {} # name = [(criteria, taglist)]
          for c in criteria:
              c = c.lower()
-@@ -2677,11 +3041,16 @@ class YumBase(depsolve.Depsolve):
+@@ -2677,11 +3035,16 @@ class YumBase(depsolve.Depsolve):
          return results
          
      def searchPackages(self, fields, criteria, callback=None):
@@ -152759,7 +152775,7 @@ index 99039e0..198dc6d 100644
          warnings.warn(_('searchPackages() will go away in a future version of Yum.\
                        Use searchGenerator() instead. \n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)           
-@@ -2700,13 +3069,23 @@ class YumBase(depsolve.Depsolve):
+@@ -2700,13 +3063,23 @@ class YumBase(depsolve.Depsolve):
      
      def searchPackageProvides(self, args, callback=None,
                                callback_has_matchfor=False):
@@ -152787,7 +152803,7 @@ index 99039e0..198dc6d 100644
              else:
                  isglob = True
                  canBeFile = misc.re_filename(arg)
-@@ -2723,7 +3102,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2723,7 +3096,7 @@ class YumBase(depsolve.Depsolve):
                  where = self.returnPackagesByDep(arg)
              else:
                  usedDepString = False
@@ -152796,7 +152812,7 @@ index 99039e0..198dc6d 100644
              self.verbose_logger.log(logginglevels.DEBUG_1,
                 P_('Searching %d package', 'Searching %d packages', len(where)), len(where))
              
-@@ -2817,25 +3196,160 @@ class YumBase(depsolve.Depsolve):
+@@ -2817,25 +3190,160 @@ class YumBase(depsolve.Depsolve):
              
          return matches
  
@@ -152969,7 +152985,7 @@ index 99039e0..198dc6d 100644
                  if uservisible:
                      if grp.user_visible:
                          installed.append(grp)
-@@ -2847,34 +3361,98 @@ class YumBase(depsolve.Depsolve):
+@@ -2847,34 +3355,98 @@ class YumBase(depsolve.Depsolve):
                          available.append(grp)
                  else:
                      available.append(grp)
@@ -153078,7 +153094,7 @@ index 99039e0..198dc6d 100644
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -2898,13 +3476,58 @@ class YumBase(depsolve.Depsolve):
+@@ -2898,13 +3470,58 @@ class YumBase(depsolve.Depsolve):
                              self.tsInfo.remove(txmbr.po.pkgtup)
          
          
@@ -153144,7 +153160,7 @@ index 99039e0..198dc6d 100644
          """
  
          if not self.comps.has_group(grpid):
-@@ -2920,6 +3543,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2920,6 +3537,9 @@ class YumBase(depsolve.Depsolve):
          if group_package_types:
              package_types = group_package_types
  
@@ -153154,7 +153170,7 @@ index 99039e0..198dc6d 100644
          for thisgroup in thesegroups:
              if thisgroup.selected:
                  continue
-@@ -2934,12 +3560,49 @@ class YumBase(depsolve.Depsolve):
+@@ -2934,12 +3554,49 @@ class YumBase(depsolve.Depsolve):
              if 'optional' in package_types:
                  pkgs.extend(thisgroup.optional_packages)
  
@@ -153205,7 +153221,7 @@ index 99039e0..198dc6d 100644
                  except Errors.InstallError, e:
                      self.verbose_logger.debug(_('No package named %s available to be installed'),
                          pkg)
-@@ -2953,7 +3616,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2953,7 +3610,9 @@ class YumBase(depsolve.Depsolve):
                  group_conditionals = enable_group_conditionals
  
              count_cond_test = 0
@@ -153216,7 +153232,7 @@ index 99039e0..198dc6d 100644
                  for condreq, cond in thisgroup.conditional_packages.iteritems():
                      if self.isPackageInstalled(cond):
                          try:
-@@ -2990,17 +3655,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2990,17 +3649,22 @@ class YumBase(depsolve.Depsolve):
                          if cond not in self.tsInfo.conditionals:
                              self.tsInfo.conditionals[cond] = []
                          self.tsInfo.conditionals[cond].extend(pkgs)
@@ -153245,7 +153261,7 @@ index 99039e0..198dc6d 100644
          
          if not self.comps.has_group(grpid):
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -3008,7 +3678,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3008,7 +3672,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)
@@ -153255,7 +153271,7 @@ index 99039e0..198dc6d 100644
          for thisgroup in thesegroups:
              thisgroup.selected = False
              
-@@ -3034,13 +3705,102 @@ class YumBase(depsolve.Depsolve):
+@@ -3034,13 +3699,102 @@ class YumBase(depsolve.Depsolve):
                          for pkg in self.tsInfo.conditionals.get(txmbr.name, []):
                              self.tsInfo.remove(pkg.pkgtup)
          
@@ -153364,7 +153380,7 @@ index 99039e0..198dc6d 100644
          # look it up in the self.localPackages first:
          for po in self.localPackages:
              if po.pkgtup == pkgtup:
-@@ -3049,7 +3809,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3049,7 +3803,7 @@ class YumBase(depsolve.Depsolve):
          pkgs = self.pkgSack.searchPkgTuple(pkgtup)
  
          if len(pkgs) == 0:
@@ -153373,7 +153389,7 @@ index 99039e0..198dc6d 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 +3825,21 @@ class YumBase(depsolve.Depsolve):
+@@ -3065,13 +3819,21 @@ class YumBase(depsolve.Depsolve):
          return result
  
      def getInstalledPackageObject(self, pkgtup):
@@ -153400,7 +153416,7 @@ index 99039e0..198dc6d 100644
              raise Errors.RpmDBError, _('Package tuple %s could not be found in rpmdb') % str(pkgtup)
  
          # Dito. FIXME from getPackageObject() for len() > 1 ... :)
-@@ -3079,9 +3847,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3079,9 +3841,11 @@ class YumBase(depsolve.Depsolve):
          return po
          
      def gpgKeyCheck(self):
@@ -153414,7 +153430,7 @@ index 99039e0..198dc6d 100644
          gpgkeyschecked = self.conf.cachedir + '/.gpgkeyschecked.yum'
          if os.path.exists(gpgkeyschecked):
              return 1
-@@ -3106,9 +3876,13 @@ class YumBase(depsolve.Depsolve):
+@@ -3106,9 +3870,13 @@ class YumBase(depsolve.Depsolve):
              return 1
  
      def returnPackagesByDep(self, depstring):
@@ -153430,7 +153446,7 @@ index 99039e0..198dc6d 100644
          if not depstring:
              return []
  
-@@ -3135,9 +3909,16 @@ class YumBase(depsolve.Depsolve):
+@@ -3135,9 +3903,16 @@ class YumBase(depsolve.Depsolve):
          return self.pkgSack.getProvides(depname, depflags, depver).keys()
  
      def returnPackageByDep(self, depstring):
@@ -153450,7 +153466,7 @@ index 99039e0..198dc6d 100644
          # we get all sorts of randomness here
          errstring = depstring
          if type(depstring) not in types.StringTypes:
-@@ -3149,16 +3930,22 @@ class YumBase(depsolve.Depsolve):
+@@ -3149,16 +3924,22 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _('No Package found for %s') % errstring
          
          ps = ListPackageSack(pkglist)
@@ -153477,7 +153493,7 @@ index 99039e0..198dc6d 100644
          if not depstring:
              return []
  
-@@ -3184,12 +3971,47 @@ class YumBase(depsolve.Depsolve):
+@@ -3184,12 +3965,47 @@ class YumBase(depsolve.Depsolve):
  
          return self.rpmdb.getProvides(depname, depflags, depver).keys()
  
@@ -153527,7 +153543,7 @@ index 99039e0..198dc6d 100644
          
          
          if len(pkglist) == 0:
-@@ -3198,14 +4020,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3198,14 +4014,23 @@ class YumBase(depsolve.Depsolve):
          if len(pkglist) == 1:
              return pkglist[0]
  
@@ -153557,7 +153573,7 @@ index 99039e0..198dc6d 100644
          returnlist = []
          compatArchList = self.arch.get_arch_list(arch)
          multiLib = []
-@@ -3222,9 +4053,9 @@ class YumBase(depsolve.Depsolve):
+@@ -3222,9 +4047,9 @@ class YumBase(depsolve.Depsolve):
                  singleLib.append(po)
                  
          # we now have three lists.  find the best package(s) of each
@@ -153570,7 +153586,7 @@ index 99039e0..198dc6d 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 +4069,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3238,7 +4063,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:
@@ -153579,7 +153595,7 @@ index 99039e0..198dc6d 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3246,7 +4077,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3246,7 +4071,7 @@ class YumBase(depsolve.Depsolve):
                  if single: returnlist.append(single)
          # similar for the non-multilib case
          elif single:
@@ -153588,7 +153604,7 @@ index 99039e0..198dc6d 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3350,28 +4181,58 @@ class YumBase(depsolve.Depsolve):
+@@ -3350,28 +4175,58 @@ class YumBase(depsolve.Depsolve):
              done = True
  
              slow = next_func(slow)
@@ -153652,7 +153668,7 @@ index 99039e0..198dc6d 100644
          try:
              txmbrs = self.groupRemove(group_string)
          except yum.Errors.GroupsError:
-@@ -3387,6 +4248,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3387,6 +4242,8 @@ class YumBase(depsolve.Depsolve):
          assert pattern[0] == '@'
          grpid = pattern[1:]
  
@@ -153661,7 +153677,7 @@ index 99039e0..198dc6d 100644
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -3398,7 +4261,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3398,7 +4255,11 @@ class YumBase(depsolve.Depsolve):
      def _minus_deselect(self, pattern):
          """ Remove things from the transaction, like kickstart. """
          assert pattern[0] == '-'
@@ -153674,7 +153690,7 @@ index 99039e0..198dc6d 100644
  
          if pat and pat[0] == '@':
              pat = pat[1:]
-@@ -3437,14 +4304,61 @@ class YumBase(depsolve.Depsolve):
+@@ -3437,14 +4298,61 @@ class YumBase(depsolve.Depsolve):
              if flag not in self.tsInfo.probFilterFlags:
                  self.tsInfo.probFilterFlags.append(flag)
  
@@ -153742,7 +153758,7 @@ index 99039e0..198dc6d 100644
          pkgs = []
          was_pattern = False
          if po:
-@@ -3477,20 +4391,12 @@ class YumBase(depsolve.Depsolve):
+@@ -3477,20 +4385,12 @@ class YumBase(depsolve.Depsolve):
                      self.verbose_logger.debug(_('Checking for virtual provide or file-provide for %s'), 
                          arg)
  
@@ -153769,7 +153785,7 @@ index 99039e0..198dc6d 100644
              else:
                  nevra_dict = self._nevra_kwarg_parse(kwargs)
  
-@@ -3577,8 +4483,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3577,8 +4477,8 @@ class YumBase(depsolve.Depsolve):
                      continue
              
              # make sure this shouldn't be passed to update:
@@ -153780,7 +153796,7 @@ index 99039e0..198dc6d 100644
                  txmbrs = self.update(po=po)
                  tx_return.extend(txmbrs)
                  continue
-@@ -3587,7 +4493,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3587,7 +4487,7 @@ class YumBase(depsolve.Depsolve):
              # something else in the repo. Unless there is a obsoletion loop,
              # at which point ignore everything.
              obsoleting_pkg = None
@@ -153789,7 +153805,7 @@ index 99039e0..198dc6d 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 +4506,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3600,23 +4500,23 @@ class YumBase(depsolve.Depsolve):
                      already_obs = pkgs[0]
  
                  if already_obs:
@@ -153820,7 +153836,7 @@ index 99039e0..198dc6d 100644
                      continue
  
              # make sure we don't have a name.arch of this already installed
-@@ -3630,7 +4536,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3630,7 +4530,7 @@ class YumBase(depsolve.Depsolve):
                          found = True
                          break
                  if not found:
@@ -153829,7 +153845,7 @@ index 99039e0..198dc6d 100644
                      txmbrs = self.update(po=po)
                      tx_return.extend(txmbrs)
                      continue
-@@ -3719,19 +4625,47 @@ class YumBase(depsolve.Depsolve):
+@@ -3719,19 +4619,47 @@ class YumBase(depsolve.Depsolve):
          return txmbr
  
      def update(self, po=None, requiringPo=None, update_to=False, **kwargs):
@@ -153884,7 +153900,7 @@ index 99039e0..198dc6d 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 +4699,14 @@ class YumBase(depsolve.Depsolve):
+@@ -3765,7 +4693,14 @@ class YumBase(depsolve.Depsolve):
                      if new is None:
                          continue
                      tx_return.extend(self.update(po=new))
@@ -153900,7 +153916,7 @@ index 99039e0..198dc6d 100644
              return tx_return
  
          # complications
-@@ -3787,7 +4728,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3787,7 +4722,7 @@ class YumBase(depsolve.Depsolve):
                  return self._minus_deselect(kwargs['pattern'])
  
              if kwargs['pattern'] and kwargs['pattern'][0] == '@':
@@ -153909,7 +153925,7 @@ index 99039e0..198dc6d 100644
  
              arg = kwargs['pattern']
              if not update_to:
-@@ -3843,7 +4784,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3843,7 +4778,7 @@ class YumBase(depsolve.Depsolve):
                      availpkgs = self._compare_providers(availpkgs, requiringPo)
                      availpkgs = map(lambda x: x[0], availpkgs)
                  elif not availpkgs:
@@ -153918,7 +153934,7 @@ index 99039e0..198dc6d 100644
         
          # for any thing specified
          # get the list of available pkgs matching it (or take the po)
-@@ -3920,6 +4861,18 @@ class YumBase(depsolve.Depsolve):
+@@ -3920,6 +4855,18 @@ class YumBase(depsolve.Depsolve):
                      tx_return.append(txmbr)
                          
          for available_pkg in availpkgs:
@@ -153937,7 +153953,7 @@ index 99039e0..198dc6d 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 +4938,18 @@ class YumBase(depsolve.Depsolve):
+@@ -3985,11 +4932,18 @@ class YumBase(depsolve.Depsolve):
          return tx_return
          
      def remove(self, po=None, **kwargs):
@@ -153961,7 +153977,7 @@ index 99039e0..198dc6d 100644
          if not po and not kwargs:
              raise Errors.RemoveError, 'Nothing specified to remove'
          
-@@ -4055,17 +5015,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4055,17 +5009,19 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def installLocal(self, pkg, po=None, updateonly=False):
@@ -153991,7 +154007,7 @@ index 99039e0..198dc6d 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 +5145,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4183,16 +5139,15 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def reinstallLocal(self, pkg, po=None):
@@ -154016,7 +154032,7 @@ index 99039e0..198dc6d 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4215,9 +5176,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4215,9 +5170,19 @@ class YumBase(depsolve.Depsolve):
          return self.reinstall(po=po)
  
      def reinstall(self, po=None, **kwargs):
@@ -154039,7 +154055,7 @@ index 99039e0..198dc6d 100644
          self._add_prob_flags(rpm.RPMPROB_FILTER_REPLACEPKG,
                               rpm.RPMPROB_FILTER_REPLACENEWFILES,
                               rpm.RPMPROB_FILTER_REPLACEOLDFILES)
-@@ -4259,16 +5230,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4259,16 +5224,15 @@ class YumBase(depsolve.Depsolve):
          return tx_mbrs
          
      def downgradeLocal(self, pkg, po=None):
@@ -154064,7 +154080,7 @@ index 99039e0..198dc6d 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4309,13 +5279,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4309,13 +5273,19 @@ class YumBase(depsolve.Depsolve):
          return False
          
      def downgrade(self, po=None, **kwargs):
@@ -154091,7 +154107,7 @@ index 99039e0..198dc6d 100644
          if not po and not kwargs:
              raise Errors.DowngradeError, 'Nothing specified to downgrade'
  
-@@ -4421,6 +5397,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4421,6 +5391,9 @@ class YumBase(depsolve.Depsolve):
                  warned_nas.add(na)
                  continue
  
@@ -154101,7 +154117,7 @@ index 99039e0..198dc6d 100644
              if pkg.verGE(lipkg):
                  if na not in warned_nas:
                      msg = _('Only Upgrade available on package: %s') % pkg
-@@ -4457,7 +5436,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4457,7 +5430,7 @@ class YumBase(depsolve.Depsolve):
          if e and v and r:
              evr = '%s:%s-%s' % (e, v, r)
          elif v and r:
@@ -154110,7 +154126,7 @@ index 99039e0..198dc6d 100644
          elif e and v:
              evr = '%s:%s' % (e, v)
          elif v: # e and r etc. is just too weird to print
-@@ -4500,12 +5479,24 @@ class YumBase(depsolve.Depsolve):
+@@ -4500,12 +5473,24 @@ class YumBase(depsolve.Depsolve):
  
          return returndict
  
@@ -154138,7 +154154,7 @@ index 99039e0..198dc6d 100644
          old_conf_obs = self.conf.obsoletes
          self.conf.obsoletes = False
          done = False
-@@ -4515,19 +5506,46 @@ class YumBase(depsolve.Depsolve):
+@@ -4515,19 +5500,46 @@ class YumBase(depsolve.Depsolve):
                      done = True
          for pkg in transaction.trans_data:
              if pkg.state == 'Downgrade':
@@ -154185,7 +154201,7 @@ index 99039e0..198dc6d 100644
                  if self.install(pkgtup=pkg.pkgtup):
                      done = True
          for pkg in transaction.trans_data:
-@@ -4538,8 +5556,14 @@ class YumBase(depsolve.Depsolve):
+@@ -4538,8 +5550,14 @@ class YumBase(depsolve.Depsolve):
          return done
  
      def history_undo(self, transaction):
@@ -154202,7 +154218,7 @@ index 99039e0..198dc6d 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 +5640,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4616,7 +5634,7 @@ class YumBase(depsolve.Depsolve):
  
          except urlgrabber.grabber.URLGrabError, e:
              raise Errors.YumBaseError(_('GPG key retrieval failed: ') +
@@ -154211,7 +154227,7 @@ index 99039e0..198dc6d 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 +5673,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4649,7 +5667,7 @@ class YumBase(depsolve.Depsolve):
              keys_info = misc.getgpgkeyinfo(rawkey, multiple=True)
          except ValueError, e:
              raise Errors.YumBaseError(_('Invalid GPG Key from %s: %s') % 
@@ -154220,7 +154236,7 @@ index 99039e0..198dc6d 100644
          keys = []
          for keyinfo in keys_info:
              thiskey = {}
-@@ -4674,39 +5698,49 @@ class YumBase(depsolve.Depsolve):
+@@ -4674,39 +5692,49 @@ class YumBase(depsolve.Depsolve):
              if pkgs:
                  pkgs = sorted(pkgs)[-1]
                  msg = (_('Importing %s key 0x%s:\n'
@@ -154288,7 +154304,7 @@ index 99039e0..198dc6d 100644
          user_cb_fail = False
          for keyurl in keyurls:
              keys = self._retrievePublicKey(keyurl, repo)
-@@ -4725,7 +5759,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4725,7 +5753,9 @@ class YumBase(depsolve.Depsolve):
                      # Try installing/updating GPG key
                      self._getKeyImportMessage(info, keyurl)
                      rc = False
@@ -154299,7 +154315,7 @@ index 99039e0..198dc6d 100644
                          rc = True
                          
                      # grab the .sig/.asc for the keyurl, if it exists
-@@ -4751,8 +5787,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4751,8 +5781,8 @@ class YumBase(depsolve.Depsolve):
                  ts = self.rpmdb.readOnlyTS()
                  result = ts.pgpImportPubkey(misc.procgpgkey(info['raw_key']))
                  if result != 0:
@@ -154310,7 +154326,7 @@ index 99039e0..198dc6d 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
  
-@@ -4760,18 +5796,20 @@ class YumBase(depsolve.Depsolve):
+@@ -4760,18 +5790,20 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _("Didn't install any keys")
  
          if not key_installed:
@@ -154336,7 +154352,7 @@ index 99039e0..198dc6d 100644
      
      def _getAnyKeyForRepo(self, repo, destdir, keyurl_list, is_cakey=False, callback=None):
          """
-@@ -4788,6 +5826,18 @@ class YumBase(depsolve.Depsolve):
+@@ -4788,6 +5820,18 @@ class YumBase(depsolve.Depsolve):
          """
  
          key_installed = False
@@ -154355,7 +154371,7 @@ index 99039e0..198dc6d 100644
          user_cb_fail = False
          for keyurl in keyurl_list:
              keys = self._retrievePublicKey(keyurl, repo, getSig=not is_cakey)
-@@ -4819,8 +5869,11 @@ class YumBase(depsolve.Depsolve):
+@@ -4819,8 +5863,11 @@ class YumBase(depsolve.Depsolve):
                  if not key_installed:
                      self._getKeyImportMessage(info, keyurl, keytype)
                      rc = False
@@ -154368,7 +154384,7 @@ index 99039e0..198dc6d 100644
                      elif callback:
                          rc = callback({"repo": repo, "userid": info['userid'],
                                          "hexkeyid": info['hexkeyid'], "keyurl": keyurl,
-@@ -4835,7 +5888,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4835,7 +5882,8 @@ class YumBase(depsolve.Depsolve):
                  # Import the key
                  result = misc.import_key_to_pubring(info['raw_key'], info['hexkeyid'], gpgdir=destdir)
                  if not result:
@@ -154378,7 +154394,7 @@ index 99039e0..198dc6d 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
                  # write out the key id to imported_cakeys in the repos basedir
-@@ -4851,36 +5905,35 @@ class YumBase(depsolve.Depsolve):
+@@ -4851,36 +5899,35 @@ class YumBase(depsolve.Depsolve):
                              pass
  
          if not key_installed and user_cb_fail:
@@ -154431,7 +154447,7 @@ index 99039e0..198dc6d 100644
          self._getAnyKeyForRepo(repo, repo.gpgcadir, repo.gpgcakey, is_cakey=True, callback=callback)
  
      def _limit_installonly_pkgs(self):
-@@ -4927,6 +5980,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4927,6 +5974,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)
@@ -154439,7 +154455,7 @@ index 99039e0..198dc6d 100644
          for m in self.tsInfo.getMembers():
              if m.ts_state not in ('i', 'u'):
                  continue
-@@ -4937,12 +5991,21 @@ class YumBase(depsolve.Depsolve):
+@@ -4937,12 +5985,21 @@ class YumBase(depsolve.Depsolve):
              if not po_names.intersection(install_only_names):
                  continue
  
@@ -154465,7 +154481,7 @@ index 99039e0..198dc6d 100644
              for po in installed:
                  if (po.version, po.release) == (cur_kernel_v, cur_kernel_r): 
                      # don't remove running
-@@ -4959,19 +6022,22 @@ class YumBase(depsolve.Depsolve):
+@@ -4959,19 +6016,22 @@ class YumBase(depsolve.Depsolve):
              txmbr.depends_on.append(rel)
  
      def processTransaction(self, callback=None,rpmTestDisplay=None, rpmDisplay=None):
@@ -154501,7 +154517,7 @@ index 99039e0..198dc6d 100644
          
          if not callback:
              callback = callbacks.ProcessTransNoOutputCallback()
-@@ -5114,13 +6180,19 @@ class YumBase(depsolve.Depsolve):
+@@ -5114,13 +6174,19 @@ class YumBase(depsolve.Depsolve):
          return results
  
      def add_enable_repo(self, repoid, baseurls=[], mirrorlist=None, **kwargs):
@@ -154528,7 +154544,7 @@ index 99039e0..198dc6d 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 +6239,15 @@ class YumBase(depsolve.Depsolve):
+@@ -5167,9 +6233,15 @@ class YumBase(depsolve.Depsolve):
  
      def setCacheDir(self, force=False, tmpdir=None, reuse=True,
                      suffix='/$basearch/$releasever'):
@@ -154547,7 +154563,7 @@ index 99039e0..198dc6d 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 +6257,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5179,7 +6251,7 @@ class YumBase(depsolve.Depsolve):
          try:
              cachedir = misc.getCacheDir(tmpdir, reuse)
          except (IOError, OSError), e:
@@ -154556,7 +154572,7 @@ index 99039e0..198dc6d 100644
              cachedir = None
              
          if cachedir is None:
-@@ -5190,6 +6268,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5190,6 +6262,7 @@ class YumBase(depsolve.Depsolve):
              self.prerepoconf.cachedir = cachedir
          else:
              self.repos.setCacheDir(cachedir)
@@ -154564,7 +154580,7 @@ index 99039e0..198dc6d 100644
          self.conf.cachedir = cachedir
          return True # We got a new cache dir
  
-@@ -5220,13 +6299,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5220,13 +6293,24 @@ class YumBase(depsolve.Depsolve):
          self.history.write_addon_data('config-repos', myrepos)
          
      def verify_plugins_cb(self, verify_package):
@@ -154592,7 +154608,7 @@ index 99039e0..198dc6d 100644
          if self.tsInfo._unresolvedMembers:
              if auto:
                  self.logger.critical(_("Dependencies not solved. Will not save unresolved transaction."))
-@@ -5234,7 +6324,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5234,7 +6318,7 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError(_("Dependencies not solved. Will not save unresolved transaction."))
          
          if not filename:
@@ -154601,7 +154617,7 @@ index 99039e0..198dc6d 100644
              fd,filename = tempfile.mkstemp(suffix='.yumtx', prefix=prefix)
              f = os.fdopen(fd, 'w')
          else:
-@@ -5244,13 +6334,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5244,13 +6328,17 @@ class YumBase(depsolve.Depsolve):
          
          msg = "%s\n" % self.rpmdb.simpleVersion(main_only=True)[0]
          msg += "%s\n" % self.ts.getTsFlags()
@@ -154622,7 +154638,7 @@ index 99039e0..198dc6d 100644
          msg += "%s\n" % len(self.tsInfo.getMembers())
          for txmbr in self.tsInfo.getMembers():
              msg += txmbr._dump()
-@@ -5260,13 +6354,25 @@ class YumBase(depsolve.Depsolve):
+@@ -5260,13 +6348,25 @@ class YumBase(depsolve.Depsolve):
          except (IOError, OSError), e:
              self._ts_save_file = None
              if auto:
@@ -154654,7 +154670,7 @@ index 99039e0..198dc6d 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 +6382,45 @@ class YumBase(depsolve.Depsolve):
+@@ -5276,26 +6376,45 @@ class YumBase(depsolve.Depsolve):
          try:
              data = open(filename, 'r').readlines()
          except (IOError, OSError), e:
@@ -154702,7 +154718,7 @@ index 99039e0..198dc6d 100644
              if ignorerpm:
                  msg += _(" ignoring, as requested.")
                  self.logger.critical(_(msg))
-@@ -5318,8 +6443,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5318,8 +6437,17 @@ class YumBase(depsolve.Depsolve):
          numrepos = int(data[2].strip())
          repos = []
          rindex=3+numrepos
@@ -154721,7 +154737,7 @@ index 99039e0..198dc6d 100644
  
          # pkgs/txmbrs
          numpkgs = int(data[rindex].strip())
-@@ -5329,6 +6463,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5329,6 +6457,7 @@ class YumBase(depsolve.Depsolve):
          pkgcount = 0
          pkgprob = False
          curpkg = None
@@ -154729,7 +154745,22 @@ index 99039e0..198dc6d 100644
          for l in data[pkgstart:]:
              l = l.rstrip()
              # our main txmbrs
-@@ -5438,6 +6573,11 @@ class YumBase(depsolve.Depsolve):
+@@ -5356,6 +6485,7 @@ class YumBase(depsolve.Depsolve):
+                     if not ignoremissing:
+                         raise Errors.YumBaseError(msg)
+                     else:
++                        ignorenewrpm = True
+                         self.logger.critical(msg)
+                 else:
+                     pkgcount += 1
+@@ -5432,12 +6562,18 @@ class YumBase(depsolve.Depsolve):
+         if pkgprob:
+             msg = _("Transaction members, relations are missing or ts has been modified,")
+             if ignoremissing:
++                ignorenewrpm = True
+                 msg += _(" ignoring, as requested. You must redepsolve!")
+                 self.logger.critical(msg)
+             else:
                  msg += _(" aborting.")
                  raise Errors.YumBaseError(msg)
              
@@ -154741,7 +154772,7 @@ index 99039e0..198dc6d 100644
          return self.tsInfo.getMembers()
  
      def _remove_old_deps(self):
-@@ -5470,18 +6610,6 @@ class YumBase(depsolve.Depsolve):
+@@ -5470,18 +6606,6 @@ class YumBase(depsolve.Depsolve):
                      if requiring == required: # if they are self-requiring skip them
                          continue
                          
@@ -154760,7 +154791,7 @@ index 99039e0..198dc6d 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 +6661,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5533,7 +6657,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
@@ -154785,7 +154816,7 @@ index 99039e0..198dc6d 100644
                  visited[curpkg] = True
              all_leaves_visited = True
              leaves = curpkg.requiring_packages()
-@@ -5547,4 +6692,3 @@ class YumBase(depsolve.Depsolve):
+@@ -5547,4 +6688,3 @@ class YumBase(depsolve.Depsolve):
          # Debugging output
          self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has no user-installed revdeps."), pkg)
          return False
@@ -157735,7 +157766,7 @@ index aaa4f25..61aa586 100755
                  continue
  
 diff --git a/yum/misc.py b/yum/misc.py
-index 2f6ddfe..43f34f8 100644
+index 2f6ddfe..0fd3e90 100644
 --- a/yum/misc.py
 +++ b/yum/misc.py
 @@ -8,6 +8,7 @@ import os
@@ -157872,15 +157903,19 @@ index 2f6ddfe..43f34f8 100644
          
      return out
      
-@@ -1126,6 +1163,8 @@ def repo_gen_decompress(filename, generated_name, cached=False):
-     dest = os.path.dirname(filename)
-     dest += '/gen'
-     if not os.path.exists(dest):
-+        if cached:
-+            return None
-         os.makedirs(dest, mode=0755)
-     dest += '/' + generated_name
+@@ -1123,11 +1160,7 @@ 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. """
+-    dest = os.path.dirname(filename)
+-    dest += '/gen'
+-    if not os.path.exists(dest):
+-        os.makedirs(dest, mode=0755)
+-    dest += '/' + generated_name
++    dest = os.path.dirname(filename) + '/gen/' + generated_name
      return decompress(filename, dest=dest, check_timestamps=True,fn_only=cached)
+     
+ def read_in_items_from_dot_dir(thisglob, line_as_list=True):
 diff --git a/yum/packageSack.py b/yum/packageSack.py
 index 4af563a..47832fc 100644
 --- a/yum/packageSack.py
@@ -159046,7 +159081,7 @@ index e289a7a..a4da4ab 100644
              raise AttributeError, "%s has no attribute %s" % (self, attr)
  
 diff --git a/yum/rpmtrans.py b/yum/rpmtrans.py
-index 9b265f9..61c9a0e 100644
+index 9b265f9..74a0f3f 100644
 --- a/yum/rpmtrans.py
 +++ b/yum/rpmtrans.py
 @@ -119,7 +119,11 @@ class RPMBaseCallback:
@@ -159100,8 +159135,11 @@ index 9b265f9..61c9a0e 100644
      
      
      def _transStart(self, bytes, total, h):
-@@ -621,3 +638,16 @@ class RPMTransaction:
+@@ -619,5 +636,19 @@ class RPMTransaction:
+             msg = ("Non-fatal %s scriptlet failure in rpm package %s" % 
+                    (scriptlet_name, package_name))
          self.display.errorlog(msg)
++        self._scriptout(package_name)
          # FIXME - what else should we do here? raise a failure and abort?
      
 +    def _scriptStart(self, bytes, total, h):
@@ -159402,7 +159440,7 @@ index 2cb1acb..0586c1c 100644
          for pkg in un['pkglist']:
              for filedata in pkg['packages']:
 diff --git a/yum/yumRepo.py b/yum/yumRepo.py
-index e5e9ece..b057961 100644
+index e5e9ece..9b9cc72 100644
 --- a/yum/yumRepo.py
 +++ b/yum/yumRepo.py
 @@ -20,10 +20,12 @@ import time
@@ -159715,6 +159753,15 @@ index e5e9ece..b057961 100644
                   'http_headers': tuple(self.__headersListFromDict(cache=cache)),
                   'ssl_verify_peer': self.sslverify,
                   'ssl_verify_host': self.sslverify,
+@@ -561,7 +660,7 @@ class YumRepository(Repository, config.RepoConf):
+         cookie = self.cachedir + '/' + self.metadata_cookie_fn
+         self.setAttribute('_dir_setup_metadata_cookie', cookie)
+ 
+-        for dir in [self.cachedir, self.pkgdir]:
++        for dir in [self.cachedir, self.cachedir + '/gen', self.pkgdir]:
+             self._dirSetupMkdir_p(dir)
+ 
+         # persistdir is really root-only but try the make anyway and just
 @@ -714,15 +813,15 @@ class YumRepository(Repository, config.RepoConf):
              local = self.metalink_filename + '.tmp'
              if not self._metalinkCurrent():
@@ -159837,13 +159884,16 @@ index e5e9ece..b057961 100644
          remote = package.relativepath
          local = package.localPkg()
          basepath = package.basepath
-@@ -857,15 +975,26 @@ class YumRepository(Repository, config.RepoConf):
+@@ -857,15 +975,29 @@ class YumRepository(Repository, config.RepoConf):
                  return local
              misc.unlink_f(local)
  
 -        return self._getFile(url=basepath,
 +        if checkfunc is None:
-+            checkfunc = lambda obj: package.verifyLocalPkg()
++            def checkfunc(obj):
++                if not package.verifyLocalPkg():
++                    misc.unlink_f(local)
++                    raise URLGrabError(-1, _('Package does not match intended download.'))
 +
 +        ret = self._getFile(url=basepath,
                          relative=remote,
@@ -159865,7 +159915,7 @@ index e5e9ece..b057961 100644
      def getHeader(self, package, checkfunc = None, reget = 'simple',
              cache = True):
  
-@@ -991,7 +1120,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -991,7 +1123,7 @@ class YumRepository(Repository, config.RepoConf):
      def _cachingRepoXML(self, local):
          """ Should we cache the current repomd.xml """
          if self.cache and not os.path.exists(local):
@@ -159874,7 +159924,7 @@ index e5e9ece..b057961 100644
          if self.cache or self.metadataCurrent():
              return True
          return False
-@@ -1020,7 +1149,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1020,7 +1152,7 @@ class YumRepository(Repository, config.RepoConf):
              if grab_can_fail:
                  return None
              raise Errors.RepoError, 'Error downloading file %s: %s' % (local, e)
@@ -159883,7 +159933,7 @@ index e5e9ece..b057961 100644
              misc.unlink_f(tfname)
              if grab_can_fail:
                  return None
-@@ -1047,7 +1176,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1047,7 +1179,7 @@ class YumRepository(Repository, config.RepoConf):
                  parse_can_fail = 'old_repo_XML' in self._oldRepoMDData
              if parse_can_fail:
                  return None
@@ -159892,7 +159942,7 @@ index e5e9ece..b057961 100644
  
      def _saveOldRepoXML(self, local):
          """ If we have an older repomd.xml file available, save it out. """
-@@ -1074,7 +1203,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1074,7 +1206,7 @@ class YumRepository(Repository, config.RepoConf):
          #  We still want the old data, so we don't download twice. So we
          # pretend everything is good until the revert.
          if not self.timestamp_check:
@@ -159901,7 +159951,7 @@ index e5e9ece..b057961 100644
  
          if 'old_repo_XML' not in self._oldRepoMDData:
              self._oldRepoMDData = {}
-@@ -1260,6 +1389,9 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1260,6 +1392,9 @@ class YumRepository(Repository, config.RepoConf):
          return True
  
      def _check_db_version(self, mdtype, repoXML=None):
@@ -159911,7 +159961,7 @@ index e5e9ece..b057961 100644
          if repoXML is None:
              repoXML = self.repoXML
          if mdtype in repoXML.repoData:
-@@ -1277,11 +1409,11 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1277,11 +1412,11 @@ class YumRepository(Repository, config.RepoConf):
              return None
  
          if not file_check:
@@ -159926,7 +159976,7 @@ index e5e9ece..b057961 100644
              if not os.path.exists(local):
                  local = misc.decompress(local, fn_only=True)
                  compressed = True
-@@ -1302,6 +1434,17 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1302,6 +1437,17 @@ class YumRepository(Repository, config.RepoConf):
              into the delete list, this means metadata can change filename
              without us leaking it. """
  
@@ -159944,7 +159994,7 @@ index e5e9ece..b057961 100644
          def _mdtype_eq(omdtype, odata, nmdtype, ndata):
              """ Check if two returns from _get_mdtype_data() are equal. """
              if ndata is None:
-@@ -1321,6 +1464,14 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1321,6 +1467,14 @@ class YumRepository(Repository, config.RepoConf):
              return True
  
          all_mdtypes = self.retrieved.keys()
@@ -159959,7 +160009,7 @@ index e5e9ece..b057961 100644
          if mdtypes is None:
              mdtypes = all_mdtypes
  
-@@ -1333,8 +1484,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1333,8 +1487,7 @@ class YumRepository(Repository, config.RepoConf):
  
          # Inited twice atm. ... sue me
          self._oldRepoMDData['new_MD_files'] = []
@@ -159969,7 +160019,7 @@ index e5e9ece..b057961 100644
          for mdtype in all_mdtypes:
              (nmdtype, ndata) = self._get_mdtype_data(mdtype)
  
-@@ -1371,43 +1521,16 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1371,43 +1524,16 @@ class YumRepository(Repository, config.RepoConf):
              # No old repomd data, but we might still have uncompressed MD
              if self._groupCheckDataMDValid(ndata, nmdtype, mdtype):
                  continue
@@ -160018,7 +160068,7 @@ index e5e9ece..b057961 100644
  
      def _groupLoadRepoXML(self, text=None, mdtypes=None):
          """ Retrieve the new repomd.xml from the repository, then check it
-@@ -1421,7 +1544,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1421,7 +1547,7 @@ class YumRepository(Repository, config.RepoConf):
              self._commonRetrieveDataMD(mdtypes)
  
      def _mdpolicy2mdtypes(self):
@@ -160027,7 +160077,7 @@ index e5e9ece..b057961 100644
                       'group:primary' : ['primary'],
                       'group:small'   : ["primary", "updateinfo"],
                       'group:main'    : ["primary", "group", "filelists",
-@@ -1436,6 +1559,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1436,6 +1562,7 @@ class YumRepository(Repository, config.RepoConf):
          if not mdtypes or 'group:all' in mdtypes:
              mdtypes = None
          else:
@@ -160035,7 +160085,7 @@ index e5e9ece..b057961 100644
              mdtypes = sorted(list(mdtypes))
          return mdtypes
  
-@@ -1446,17 +1570,12 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1446,17 +1573,12 @@ class YumRepository(Repository, config.RepoConf):
          except KeyboardInterrupt:
              self._revertOldRepoXML() # Undo metadata cookie?
              raise
@@ -160055,7 +160105,7 @@ index e5e9ece..b057961 100644
          return self._repoXML
  
  
-@@ -1480,7 +1599,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1480,7 +1602,7 @@ class YumRepository(Repository, config.RepoConf):
                  result = self._getFile(relative='repodata/repomd.xml.asc',
                                         copy_local=1,
                                         local = sigfile,
@@ -160064,7 +160114,7 @@ index e5e9ece..b057961 100644
                                         reget=None,
                                         checkfunc=None,
                                         cache=self.http_caching == 'all',
-@@ -1514,7 +1633,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1514,7 +1636,7 @@ class YumRepository(Repository, config.RepoConf):
          return self._checkMD(fn, mdtype, openchecksum)
  
      def _checkMD(self, fn, mdtype, openchecksum=False,
@@ -160073,7 +160123,7 @@ index e5e9ece..b057961 100644
          """ Internal function, use .checkMD() from outside yum. """
  
          thisdata = data # So the argument name is nicer
-@@ -1537,6 +1656,18 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1537,6 +1659,18 @@ class YumRepository(Repository, config.RepoConf):
          if size is not None:
              size = int(size)
  
@@ -160092,7 +160142,7 @@ index e5e9ece..b057961 100644
          try: # get the local checksum
              l_csum = self._checksum(r_ctype, file, datasize=size)
          except Errors.RepoError, e:
-@@ -1551,15 +1682,13 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1551,15 +1685,13 @@ class YumRepository(Repository, config.RepoConf):
                  return None
              raise URLGrabError(-1, 'Metadata file does not match checksum')
  
@@ -160109,7 +160159,7 @@ index e5e9ece..b057961 100644
          """ Internal function, use .retrieveMD() from outside yum. """
          #  Note that this can raise Errors.RepoMDError if mdtype doesn't exist
          # for this repo.
-@@ -1588,7 +1717,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1588,7 +1720,7 @@ class YumRepository(Repository, config.RepoConf):
              else: # ain't there - raise
                  raise Errors.RepoError, \
                      "Caching enabled but no local cache of %s from %s" % (local,
@@ -160118,7 +160168,7 @@ index e5e9ece..b057961 100644
  
          if (os.path.exists(local) or
              self._preload_md_from_system_cache(os.path.basename(local))):
-@@ -1597,8 +1726,10 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1597,8 +1729,10 @@ class YumRepository(Repository, config.RepoConf):
                  return local # it's the same return the local one
  
          try:
@@ -160131,7 +160181,7 @@ index e5e9ece..b057961 100644
              if thisdata.size is None:
                  reget = None
              else:
-@@ -1613,8 +1744,9 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1613,8 +1747,9 @@ class YumRepository(Repository, config.RepoConf):
                                    checkfunc=checkfunc, 
                                    text=text,
                                    cache=self.http_caching == 'all',
@@ -160143,7 +160193,7 @@ index e5e9ece..b057961 100644
              if retrieve_can_fail:
                  return None
              raise
-@@ -1622,9 +1754,8 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1622,9 +1757,8 @@ class YumRepository(Repository, config.RepoConf):
              if retrieve_can_fail:
                  return None
              raise Errors.RepoError, \
@@ -160154,7 +160204,7 @@ index e5e9ece..b057961 100644
              return local
  
  
-@@ -1646,13 +1777,21 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1646,13 +1780,21 @@ class YumRepository(Repository, config.RepoConf):
  
      def getGroups(self):
          """gets groups and returns group file path for the repository, if there
@@ -160179,7 +160229,7 @@ index e5e9ece..b057961 100644
          self._callbacks_changed = True
  
      def setFailureObj(self, failure_obj):
-@@ -1681,7 +1820,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1681,7 +1823,7 @@ class YumRepository(Repository, config.RepoConf):
                  print "Could not read mirrorlist %s, error was \n%s" %(url, e)
                  content = []
              for line in content:
@@ -160188,7 +160238,7 @@ index e5e9ece..b057961 100644
                      continue
                  mirror = line.rstrip() # no more trailing \n's
                  mirror = mirror.replace('$ARCH', '$BASEARCH')
-@@ -1713,7 +1852,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1713,7 +1855,7 @@ class YumRepository(Repository, config.RepoConf):
              ugopts = self._default_grabopts()
              try:
                  fo = urlgrabber.grabber.urlopen(url, **ugopts)
@@ -160197,7 +160247,7 @@ index e5e9ece..b057961 100644
                  print "Could not retrieve mirrorlist %s error was\n%s: %s" % (url, e.args[0], misc.to_unicode(e.args[1]))
                  fo = None
  
-@@ -1877,7 +2016,7 @@ def getMirrorList(mirrorlist, pdict = None):
+@@ -1877,7 +2019,7 @@ def getMirrorList(mirrorlist, pdict = None):
  
      try:
          fo = urlresolver.urlopen(url, proxies=pdict)
diff --git a/yum.spec b/yum.spec
index f432d12..7a6fd86 100644
--- a/yum.spec
+++ b/yum.spec
@@ -18,7 +18,7 @@
 Summary: RPM package installer/updater/manager
 Name: yum
 Version: 3.4.3
-Release: 44%{?dist}
+Release: 45%{?dist}
 License: GPLv2+
 Group: System Environment/Base
 Source0: http://yum.baseurl.org/download/3.4/%{name}-%{version}.tar.gz
@@ -315,6 +315,15 @@ exit 0
 %endif
 
 %changelog
+* Tue Oct  2 2012 Zdenek Pavlas <zpavlas at redhat.com> - 3.4.3-45
+- update to latest HEAD.
+- Don't skip loadts new rpmdbv check, when transaction changes. BZ 857961
+- Set ignorenewrpm to True, not False, to get it to ignore. BZ 858205.
+- Actually use verifyLocalPkg().  Helps BZ 858632.
+- Display script output when transaction fails. BZ 856969
+- Avoid mkdir repodir/gen/gen in misc.decompress()
+- completion helper: Handle ConfigError.  BZ 861264.
+
 * Wed Sep 12 2012 James Antill <james at fedoraproject.org> - 3.4.3-44
 - update to latest HEAD.
 - Write out groupid and not optionid, for environment groups.


More information about the scm-commits mailing list