[yum] update to latest HEAD.

Zdeněk Pavlas zpavlas at fedoraproject.org
Wed Aug 22 15:12:24 UTC 2012


commit 298a596ed2553542f1c172e02ab788be33956440
Author: Zdeněk Pavlas <zpavlas at redhat.com>
Date:   Wed Aug 22 16:58:03 2012 +0200

    update to latest HEAD.

 yum-HEAD.patch              |  578 ++++++++++++++++++++++++++-----------------
 yum-completion-helper.patch |   11 +
 yum.spec                    |    9 +-
 3 files changed, 371 insertions(+), 227 deletions(-)
---
diff --git a/yum-HEAD.patch b/yum-HEAD.patch
index b42f95b..f95f99c 100644
--- a/yum-HEAD.patch
+++ b/yum-HEAD.patch
@@ -3441,7 +3441,7 @@ index f1e06e8..b21c594 100644
  complete -F _yum -o filenames yum yummain.py
  
 diff --git a/output.py b/output.py
-index b6aa277..d29eba8 100755
+index b6aa277..caac21a 100755
 --- a/output.py
 +++ b/output.py
 @@ -1,6 +1,6 @@
@@ -3452,6 +3452,15 @@ index b6aa277..d29eba8 100755
  
  # This program is free software; you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
+@@ -29,7 +29,7 @@ import re # For YumTerm
+ 
+ from weakref import proxy as weakref
+ 
+-from urlgrabber.progress import TextMeter
++from urlgrabber.progress import TextMeter, TextMultiFileMeter
+ import urlgrabber.progress
+ from urlgrabber.grabber import URLGrabError
+ from yum.misc import prco_tuple_to_string
 @@ -47,6 +47,21 @@ import yum.history
  
  from yum.i18n import utf8_width, utf8_width_fill, utf8_text_fill
@@ -3474,7 +3483,7 @@ index b6aa277..d29eba8 100755
  def _term_width():
      """ Simple terminal width, limit to 20 chars. and make 0 == 80. """
      if not hasattr(urlgrabber.progress, 'terminal_width_cached'):
-@@ -60,17 +75,21 @@ def _term_width():
+@@ -60,17 +75,26 @@ def _term_width():
  
  
  class YumTextMeter(TextMeter):
@@ -3495,13 +3504,18 @@ index b6aa277..d29eba8 100755
          checkSignals()
          TextMeter.update(self, amount_read, now)
  
++class YumTextMultiFileMeter(TextMultiFileMeter):
++    def update_meter(self, meter, now):
++        checkSignals()
++        TextMultiFileMeter.update_meter(self, meter, now)
++
  class YumTerm:
 -    """some terminal "UI" helpers based on curses"""
 +    """A class to provide some terminal "UI" helpers based on curses."""
  
      # From initial search for "terminfo and python" got:
      # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/475116
-@@ -145,6 +164,17 @@ class YumTerm:
+@@ -145,6 +169,17 @@ class YumTerm:
          self.BG_COLOR = self.__ansi_forced_BG_COLOR
  
      def reinit(self, term_stream=None, color='auto'):
@@ -3519,7 +3533,7 @@ index b6aa277..d29eba8 100755
          self.__enabled = True
          if not hasattr(urlgrabber.progress, 'terminal_width_cached'):
              self.columns = 80
-@@ -255,6 +285,37 @@ class YumTerm:
+@@ -255,6 +290,37 @@ class YumTerm:
          return re.sub(r'\$<\d+>[/*]?', '', cap)
  
      def sub(self, haystack, beg, end, needles, escape=None, ignore_case=False):
@@ -3557,7 +3571,7 @@ index b6aa277..d29eba8 100755
          if not self.__enabled:
              return haystack
  
-@@ -269,27 +330,106 @@ class YumTerm:
+@@ -269,27 +335,106 @@ class YumTerm:
              haystack = re.sub(pat, render, haystack)
          return haystack
      def sub_norm(self, haystack, beg, needles, **kwds):
@@ -3668,7 +3682,7 @@ index b6aa277..d29eba8 100755
  
      def __init__(self):
          self.logger = logging.getLogger("yum.cli")
-@@ -304,6 +444,12 @@ class YumOutput:
+@@ -304,6 +449,12 @@ class YumOutput:
  
      
      def printtime(self):
@@ -3681,7 +3695,7 @@ index b6aa277..d29eba8 100755
          months = [_('Jan'), _('Feb'), _('Mar'), _('Apr'), _('May'), _('Jun'),
                    _('Jul'), _('Aug'), _('Sep'), _('Oct'), _('Nov'), _('Dec')]
          now = time.localtime(time.time())
-@@ -312,14 +458,27 @@ class YumOutput:
+@@ -312,14 +463,27 @@ class YumOutput:
          return ret
           
      def failureReport(self, errobj):
@@ -3711,7 +3725,7 @@ index b6aa277..d29eba8 100755
          progressbar(current, total, name)
  
      def _highlight(self, highlight):
-@@ -368,9 +527,29 @@ class YumOutput:
+@@ -368,9 +532,29 @@ class YumOutput:
  
      def calcColumns(self, data, columns=None, remainder_column=0,
                      total_width=None, indent=''):
@@ -3744,7 +3758,7 @@ index b6aa277..d29eba8 100755
          if total_width is None:
              total_width = self.term.columns
  
-@@ -473,10 +652,20 @@ class YumOutput:
+@@ -473,10 +657,20 @@ class YumOutput:
          return (val, width, hibeg, hiend)
  
      def fmtColumns(self, columns, msg=u'', end=u'', text_width=utf8_width):
@@ -3769,7 +3783,7 @@ index b6aa277..d29eba8 100755
          total_width = len(msg)
          data = []
          for col_data in columns[:-1]:
-@@ -513,8 +702,18 @@ class YumOutput:
+@@ -513,8 +707,18 @@ class YumOutput:
  
      def simpleList(self, pkg, ui_overflow=False, indent='', highlight=False,
                     columns=None):
@@ -3790,7 +3804,7 @@ index b6aa277..d29eba8 100755
          if columns is None:
              columns = (-40, -22, -16) # Old default
          ver = pkg.printVer()
-@@ -526,9 +725,19 @@ class YumOutput:
+@@ -526,9 +730,19 @@ class YumOutput:
  
      def simpleEnvraList(self, pkg, ui_overflow=False,
                          indent='', highlight=False, columns=None):
@@ -3813,7 +3827,7 @@ index b6aa277..d29eba8 100755
          if columns is None:
              columns = (-63, -16) # Old default
          envra = '%s%s' % (indent, str(pkg))
-@@ -538,7 +747,13 @@ class YumOutput:
+@@ -538,7 +752,13 @@ class YumOutput:
          print self.fmtColumns(columns, text_width=len)
  
      def fmtKeyValFill(self, key, val):
@@ -3828,7 +3842,7 @@ index b6aa277..d29eba8 100755
          val = to_str(val)
          keylen = utf8_width(key)
          cols = self.term.columns
-@@ -553,6 +768,15 @@ class YumOutput:
+@@ -553,6 +773,15 @@ class YumOutput:
          return ret
      
      def fmtSection(self, name, fill='='):
@@ -3844,7 +3858,7 @@ index b6aa277..d29eba8 100755
          name = to_str(name)
          cols = self.term.columns - 2
          name_len = utf8_width(name)
-@@ -577,6 +801,12 @@ class YumOutput:
+@@ -577,6 +806,12 @@ class YumOutput:
          return to_unicode(s)
  
      def infoOutput(self, pkg, highlight=False):
@@ -3857,7 +3871,7 @@ index b6aa277..d29eba8 100755
          (hibeg, hiend) = self._highlight(highlight)
          print _("Name        : %s%s%s") % (hibeg, to_unicode(pkg.name), hiend)
          print _("Arch        : %s") % to_unicode(pkg.arch)
-@@ -617,9 +847,22 @@ class YumOutput:
+@@ -617,9 +852,22 @@ class YumOutput:
          print ""
      
      def updatesObsoletesList(self, uotup, changetype, columns=None):
@@ -3883,7 +3897,7 @@ index b6aa277..d29eba8 100755
          (changePkg, instPkg) = uotup
  
          if columns is not None:
-@@ -640,12 +883,45 @@ class YumOutput:
+@@ -640,12 +888,45 @@ class YumOutput:
  
      def listPkgs(self, lst, description, outputType, highlight_na={},
                   columns=None, highlight_modes={}):
@@ -3935,7 +3949,7 @@ index b6aa277..d29eba8 100755
          if outputType in ['list', 'info']:
              thingslisted = 0
              if len(lst) > 0:
-@@ -654,7 +930,8 @@ class YumOutput:
+@@ -654,7 +935,8 @@ class YumOutput:
                  for pkg in sorted(lst):
                      key = (pkg.name, pkg.arch)
                      highlight = False
@@ -3945,7 +3959,7 @@ index b6aa277..d29eba8 100755
                      elif key not in highlight_na:
                          highlight = highlight_modes.get('not in', 'normal')
                      elif pkg.verEQ(highlight_na[key]):
-@@ -679,8 +956,11 @@ class YumOutput:
+@@ -679,8 +961,11 @@ class YumOutput:
      
          
      def userconfirm(self):
@@ -3958,7 +3972,7 @@ index b6aa277..d29eba8 100755
          yui = (to_unicode(_('y')), to_unicode(_('yes')))
          nui = (to_unicode(_('n')), to_unicode(_('no')))
          aui = (yui[0], yui[1], nui[0], nui[1])
-@@ -739,27 +1019,58 @@ class YumOutput:
+@@ -739,27 +1024,58 @@ class YumOutput:
          return ret
  
      def _calcDataPkgColumns(self, data, pkg_names, pkg_names2pkgs,
@@ -4021,7 +4035,7 @@ index b6aa277..d29eba8 100755
                      continue
                  for (apkg, ipkg) in sorted(pkg_names2pkgs[item],
                                             key=lambda x: x[1] or x[0]):
-@@ -770,18 +1081,38 @@ class YumOutput:
+@@ -770,18 +1086,38 @@ class YumOutput:
                      else:
                          highlight = False
                      self.simpleEnvraList(ipkg or apkg, ui_overflow=True,
@@ -4064,7 +4078,7 @@ index b6aa277..d29eba8 100755
          if group.ui_description:
              print _(' Description: %s') % to_unicode(group.ui_description)
          if group.langonly:
-@@ -795,7 +1126,8 @@ class YumOutput:
+@@ -795,7 +1131,8 @@ class YumOutput:
          if verb:
              data = {'envra' : {}, 'rid' : {}}
              for (section_name, pkg_names) in sections:
@@ -4074,7 +4088,7 @@ index b6aa277..d29eba8 100755
              data = [data['envra'], data['rid']]
              columns = self.calcColumns(data)
              columns = (-columns[0], -columns[1])
-@@ -804,11 +1136,77 @@ class YumOutput:
+@@ -804,11 +1141,77 @@ class YumOutput:
              if len(pkg_names) > 0:
                  print section_name
                  self._displayPkgsFromNames(pkg_names, verb, pkg_names2pkgs,
@@ -4155,7 +4169,7 @@ index b6aa277..d29eba8 100755
          verb = self.verbose_logger.isEnabledFor(logginglevels.DEBUG_3)
          for pkg in sorted(results):
              print _("package: %s") % pkg.compactPrint()
-@@ -832,7 +1230,18 @@ class YumOutput:
+@@ -832,7 +1235,18 @@ class YumOutput:
                      print "   provider: %s" % po.compactPrint()
  
      def format_number(self, number, SI=0, space=' '):
@@ -4175,7 +4189,7 @@ index b6aa277..d29eba8 100755
          symbols = [ ' ', # (none)
                      'k', # kilo
                      'M', # mega
-@@ -870,16 +1279,31 @@ class YumOutput:
+@@ -870,16 +1284,31 @@ class YumOutput:
  
      @staticmethod
      def format_time(seconds, use_hours=0):
@@ -4213,7 +4227,7 @@ index b6aa277..d29eba8 100755
          if self.conf.showdupesfromrepos:
              msg = '%s : ' % po
          else:
-@@ -923,7 +1347,15 @@ class YumOutput:
+@@ -923,7 +1352,15 @@ class YumOutput:
                  item = self._enc(item)
                  can_overflow = False
              else:
@@ -4230,7 +4244,7 @@ index b6aa277..d29eba8 100755
  
              if matchfor:
                  item = self._sub_highlight(item, highlight, matchfor,
-@@ -935,14 +1367,34 @@ class YumOutput:
+@@ -935,14 +1372,34 @@ class YumOutput:
          print '\n\n'
  
      def matchcallback_verbose(self, po, values, matchfor=None):
@@ -4266,7 +4280,7 @@ index b6aa277..d29eba8 100755
          for pkg in packages:
              # Just to be on the safe side, if for some reason getting
              # the package size fails, log the error and don't report download
-@@ -971,18 +1423,18 @@ class YumOutput:
+@@ -971,18 +1428,18 @@ class YumOutput:
  
          if (not error):
              if locsize:
@@ -4293,7 +4307,7 @@ index b6aa277..d29eba8 100755
          totsize = 0
          error = False
          for pkg in packages:
-@@ -997,13 +1449,19 @@ class YumOutput:
+@@ -997,13 +1454,19 @@ class YumOutput:
                  self.logger.error(_('There was an error calculating installed size'))
                  break
          if (not error):
@@ -4318,7 +4332,7 @@ index b6aa277..d29eba8 100755
          self.tsInfo.makelists(True, True)
          pkglist_lines = []
          data  = {'n' : {}, 'v' : {}, 'r' : {}}
-@@ -1032,8 +1490,7 @@ class YumOutput:
+@@ -1032,8 +1495,7 @@ class YumOutput:
              for (d, v) in (("n",len(n)), ("v",len(evr)), ("r",len(repoid))):
                  data[d].setdefault(v, 0)
                  data[d][v] += 1
@@ -4328,7 +4342,7 @@ index b6aa277..d29eba8 100755
              return a_wid
  
          for (action, pkglist) in [(_('Installing'), self.tsInfo.installed),
-@@ -1102,19 +1559,72 @@ class YumOutput:
+@@ -1102,19 +1564,72 @@ class YumOutput:
  Transaction Summary
  %s
  """) % ('=' * self.term.columns))
@@ -4411,7 +4425,7 @@ index b6aa277..d29eba8 100755
          out = ''
          
          self.tsInfo.makelists()
-@@ -1179,9 +1689,9 @@ Transaction Summary
+@@ -1179,17 +1694,19 @@ Transaction Summary
          return out
  
      def setupProgressCallbacks(self):
@@ -4424,7 +4438,33 @@ index b6aa277..d29eba8 100755
          # if we're below 2 on the debug level we don't need to be outputting
          # progress bars - this is hacky - I'm open to other options
          # One of these is a download
-@@ -1216,10 +1726,12 @@ Transaction Summary
+         if self.conf.debuglevel < 2 or not sys.stdout.isatty():
+             progressbar = None
++            multi_progressbar = None
+             callback = None
+         else:
+             progressbar = YumTextMeter(fo=sys.stdout)
++            multi_progressbar = YumTextMultiFileMeter(fo=sys.stdout)
+             callback = CacheProgressCallback()
+ 
+         # setup our failure report for failover
+@@ -1200,13 +1717,14 @@ Transaction Summary
+         interrupt_callback = self.interrupt_callback
+         if hasattr(self, 'prerepoconf'):
+             self.prerepoconf.progressbar = progressbar
++            self.prerepoconf.multi_progressbar = multi_progressbar
+             self.prerepoconf.callback = callback
+             self.prerepoconf.failure_callback = failure_callback
+             self.prerepoconf.interrupt_callback = interrupt_callback
+         else:
+             #  Just in case some API user decides to do self.repos before
+             # calling us.
+-            self.repos.setProgressBar(progressbar)
++            self.repos.setProgressBar(progressbar, multi_progressbar)
+             self.repos.callback = callback
+             self.repos.setFailureCallback(failure_callback)
+             self.repos.setInterruptCallback(interrupt_callback)
+@@ -1216,10 +1734,12 @@ Transaction Summary
          self.dsCallback = dscb
      
      def setupProgessCallbacks(self):
@@ -4438,7 +4478,7 @@ index b6aa277..d29eba8 100755
          confirm_func = self._cli_confirm_gpg_key_import
          gpg_import_func = self.getKeyForRepo
          gpgca_import_func = self.getCAKeyForRepo
-@@ -1233,14 +1745,12 @@ Transaction Summary
+@@ -1233,14 +1753,12 @@ Transaction Summary
              self.repos.gpgca_import_func = gpgca_import_func
  
      def interrupt_callback(self, cbobj):
@@ -4458,7 +4498,7 @@ index b6aa277..d29eba8 100755
          '''
          delta_exit_chk = 2.0      # Delta between C-c's so we treat as exit
          delta_exit_str = _("two") # Human readable version of above
-@@ -1269,6 +1779,14 @@ to exit.
+@@ -1269,6 +1787,14 @@ to exit.
  
      def download_callback_total_cb(self, remote_pkgs, remote_size,
                                     download_start_timestamp):
@@ -4473,26 +4513,26 @@ index b6aa277..d29eba8 100755
          if len(remote_pkgs) <= 1:
              return
          if not hasattr(urlgrabber.progress, 'TerminalLine'):
-@@ -1434,8 +1952,17 @@ to exit.
+@@ -1434,8 +1960,17 @@ to exit.
          return tids, printall
  
      def historyListCmd(self, extcmds):
 -        """ Shows the user a list of data about the history. """
 +        """Output a list of information about the history of yum
 +        transactions.
- 
++
 +        :param extcmds: list of extra command line arguments
 +        :return: (exit_code, [errors])
 +
 +        exit_code is::
-+
+ 
 +            0 = we're done, exit
 +            1 = we've errored, exit with error string
 +        """
          tids, printall = self._history_list_transactions(extcmds)
          if tids is None:
              return 1, ['Failed history list']
-@@ -1564,6 +2091,16 @@ to exit.
+@@ -1564,6 +2099,16 @@ to exit.
          return old[0]
  
      def historyInfoCmd(self, extcmds):
@@ -4509,7 +4549,7 @@ index b6aa277..d29eba8 100755
          def str2int(x):
              try:
                  return int(x)
-@@ -1656,6 +2193,9 @@ to exit.
+@@ -1656,6 +2201,9 @@ to exit.
      def _hpkg2from_repo(self, hpkg):
          """ Given a pkg, find the ipkg.ui_from_repo ... if none, then
              get an apkg. ... and put a ? in there. """
@@ -4519,7 +4559,7 @@ index b6aa277..d29eba8 100755
          ipkgs = self.rpmdb.searchPkgTuple(hpkg.pkgtup)
          if not ipkgs:
              apkgs = self.pkgSack.searchPkgTuple(hpkg.pkgtup)
-@@ -1672,13 +2212,12 @@ to exit.
+@@ -1672,13 +2220,12 @@ to exit.
                                   'o' : _('Updated'), 'n' : _('Downgraded')}
          _pkg_states_available = {'i' : _('Installed'), 'e' : _('Not installed'),
                                   'o' : _('Older'), 'n' : _('Newer')}
@@ -4536,7 +4576,7 @@ index b6aa277..d29eba8 100755
              prefix = " " * prefix_len
              if was_installed:
                  _pkg_states = _pkg_states_installed
-@@ -1702,9 +2241,11 @@ to exit.
+@@ -1702,9 +2249,11 @@ to exit.
              else:
                  (hibeg, hiend) = self._highlight('normal')
              state = utf8_width_fill(state, _pkg_states['maxlen'])
@@ -4550,7 +4590,7 @@ index b6aa277..d29eba8 100755
  
          if type(old.tid) == type([]):
              print _("Transaction ID :"), "%u..%u" % (old.tid[0], old.tid[-1])
-@@ -1778,8 +2319,8 @@ to exit.
+@@ -1778,8 +2327,8 @@ to exit.
              default_addons = set(['config-main', 'config-repos', 'saved_tx'])
              non_default = set(addon_info).difference(default_addons)
              if len(non_default) > 0:
@@ -4561,7 +4601,7 @@ index b6aa277..d29eba8 100755
  
          if old.trans_with:
              # This is _possible_, but not common
-@@ -1794,7 +2335,9 @@ to exit.
+@@ -1794,7 +2343,9 @@ to exit.
              print _("Packages Skipped:")
              pkg_max_len = max((len(str(hpkg)) for hpkg in old.trans_skip))
          for hpkg in old.trans_skip:
@@ -4572,7 +4612,7 @@ index b6aa277..d29eba8 100755
  
          if old.rpmdb_problems:
              print _("Rpmdb Problems:")
-@@ -1833,6 +2376,13 @@ to exit.
+@@ -1833,6 +2384,13 @@ to exit.
                                'Updated'      : _('Updated'),
                                }
      def historyInfoCmdPkgsAltered(self, old, pats=[]):
@@ -4586,7 +4626,7 @@ index b6aa277..d29eba8 100755
          last = None
          #  Note that these don't use _simple_pkg() because we are showing what
          # happened to them in the transaction ... not the difference between the
-@@ -1886,6 +2436,10 @@ to exit.
+@@ -1886,6 +2444,10 @@ to exit.
                                          self._hpkg2from_repo(hpkg))
  
      def historySummaryCmd(self, extcmds):
@@ -4597,7 +4637,7 @@ index b6aa277..d29eba8 100755
          tids, printall = self._history_list_transactions(extcmds)
          if tids is None:
              return 1, ['Failed history info']
-@@ -1946,6 +2500,10 @@ to exit.
+@@ -1946,6 +2508,10 @@ to exit.
                               utf8_width_fill(uiacts, 16, 16), count)
  
      def historyAddonInfoCmd(self, extcmds):
@@ -4608,7 +4648,7 @@ index b6aa277..d29eba8 100755
          tid = None
          if len(extcmds) > 1:
              tid = extcmds[1]
-@@ -1983,16 +2541,19 @@ to exit.
+@@ -1983,16 +2549,19 @@ to exit.
          
          for item in extcmds[2:]:
              if item in addon_info:
@@ -4634,7 +4674,7 @@ index b6aa277..d29eba8 100755
          tids = self.history.search(extcmds)
          limit = None
          if extcmds and not tids:
-@@ -2078,9 +2639,94 @@ to exit.
+@@ -2078,9 +2647,94 @@ to exit.
              if lastdbv.end_rpmdbversion != rpmdbv:
                  self._rpmdb_warn_checks()
  
@@ -4730,7 +4770,7 @@ index b6aa277..d29eba8 100755
      
      def __init__(self, ayum=None):
          """requires yum-cli log and errorlog functions as arguments"""
-@@ -2089,6 +2735,25 @@ class DepSolveProgressCallBack:
+@@ -2089,6 +2743,25 @@ class DepSolveProgressCallBack:
          self.ayum = ayum
  
      def pkgAdded(self, pkgtup, mode):
@@ -4756,7 +4796,7 @@ index b6aa277..d29eba8 100755
          modedict = { 'i': _('installed'),
                       'u': _('an update'),
                       'e': _('erased'),
-@@ -2104,43 +2769,85 @@ class DepSolveProgressCallBack:
+@@ -2104,43 +2777,85 @@ class DepSolveProgressCallBack:
              modeterm)
          
      def start(self):
@@ -4844,7 +4884,7 @@ index b6aa277..d29eba8 100755
          needname, needflags, needversion = reqTup
  
          yb = self.ayum
-@@ -2225,46 +2932,106 @@ class DepSolveProgressCallBack:
+@@ -2225,46 +2940,106 @@ class DepSolveProgressCallBack:
          return msg
      
      def procConflict(self, name, confname):
@@ -4956,7 +4996,7 @@ index b6aa277..d29eba8 100755
  
  def _pkgname_ui(ayum, pkgname, ts_states=None):
      """ Get more information on a simple pkgname, if we can. We need to search
-@@ -2316,10 +3083,7 @@ def _pkgname_ui(ayum, pkgname, ts_states=None):
+@@ -2316,10 +3091,7 @@ def _pkgname_ui(ayum, pkgname, ts_states=None):
      return pkgname
  
  class YumCliRPMCallBack(RPMBaseCallback):
@@ -4968,7 +5008,7 @@ index b6aa277..d29eba8 100755
  
      width = property(lambda x: _term_width())
  
-@@ -2337,21 +3101,34 @@ class YumCliRPMCallBack(RPMBaseCallback):
+@@ -2337,21 +3109,34 @@ class YumCliRPMCallBack(RPMBaseCallback):
      #  Installing things have pkg objects passed to the events, so only need to
      # lookup for erased/obsoleted.
      def pkgname_ui(self, pkgname, ts_states=('e', 'od', 'ud', None)):
@@ -5013,7 +5053,7 @@ index b6aa277..d29eba8 100755
          
          if type(package) not in types.StringTypes:
              pkgname = str(package)
-@@ -2363,9 +3140,25 @@ class YumCliRPMCallBack(RPMBaseCallback):
+@@ -2363,9 +3148,25 @@ class YumCliRPMCallBack(RPMBaseCallback):
              percent = 0
          else:
              percent = (te_current*100L)/te_total
@@ -5040,7 +5080,7 @@ index b6aa277..d29eba8 100755
                                                pkgname=pkgname, wid1=wid1)
              msg = fmt % (utf8_width_fill(process, wid1, wid1),
                           utf8_width_fill(pkgname, wid2, wid2))
-@@ -2377,6 +3170,11 @@ class YumCliRPMCallBack(RPMBaseCallback):
+@@ -2377,6 +3178,11 @@ class YumCliRPMCallBack(RPMBaseCallback):
                  print " "
  
      def scriptout(self, package, msgs):
@@ -5052,7 +5092,7 @@ index b6aa277..d29eba8 100755
          if msgs:
              sys.stdout.write(to_unicode(msgs))
              sys.stdout.flush()
-@@ -2429,8 +3227,30 @@ class YumCliRPMCallBack(RPMBaseCallback):
+@@ -2429,8 +3235,30 @@ class YumCliRPMCallBack(RPMBaseCallback):
              wid2 = pnl
          return fmt, wid1, wid2
  
@@ -151274,8 +151314,35 @@ index abd203f..65c62a9 100644
  * Wed Apr 20 2011 James Antill <james at fedoraproject.org>
  - 3.4.1
  - umask bug fix.
+diff --git a/yum/Errors.py b/yum/Errors.py
+index c1af4ad..e3e3956 100644
+--- a/yum/Errors.py
++++ b/yum/Errors.py
+@@ -79,9 +79,20 @@ class RepoError(YumBaseError):
+ class DuplicateRepoError(RepoError):
+     pass
+ 
++# Have our own custom .value with all the mirror errors.
+ class NoMoreMirrorsRepoError(RepoError):
+-    pass
+-    
++    def __init__(self, value=None, errors=None):
++        Exception.__init__(self)
++        self._value = value
++        self.errors = errors
++
++    @property
++    def value(self):
++        ret = self._value
++        for url, msg in self.errors or []:
++            ret += '\n%s: %s' % (url, msg)
++        return ret
++
+ class ConfigError(YumBaseError):
+     pass
+     
 diff --git a/yum/__init__.py b/yum/__init__.py
-index 99039e0..1108443 100644
+index 99039e0..76473ec 100644
 --- a/yum/__init__.py
 +++ b/yum/__init__.py
 @@ -46,8 +46,13 @@ import operator
@@ -151693,7 +151760,17 @@ index 99039e0..1108443 100644
          warnings.warn(_('doRepoSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -630,6 +726,14 @@ class YumBase(depsolve.Depsolve):
+@@ -588,7 +684,8 @@ class YumBase(depsolve.Depsolve):
+             prerepoconf = self.prerepoconf
+             del self.prerepoconf
+ 
+-            self.repos.setProgressBar(prerepoconf.progressbar)
++            self.repos.setProgressBar(prerepoconf.progressbar,
++                                      prerepoconf.multi_progressbar)
+             self.repos.callback = prerepoconf.callback
+             self.repos.setFailureCallback(prerepoconf.failure_callback)
+             self.repos.setInterruptCallback(prerepoconf.interrupt_callback)
+@@ -630,6 +727,14 @@ class YumBase(depsolve.Depsolve):
          self._repos = RepoStorage(self)
      
      def doSackSetup(self, archlist=None, thisrepo=None):
@@ -151708,7 +151785,7 @@ index 99039e0..1108443 100644
          warnings.warn(_('doSackSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -711,6 +815,9 @@ class YumBase(depsolve.Depsolve):
+@@ -711,6 +816,9 @@ class YumBase(depsolve.Depsolve):
              
             
      def doUpdateSetup(self):
@@ -151718,7 +151795,7 @@ index 99039e0..1108443 100644
          warnings.warn(_('doUpdateSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -765,6 +872,8 @@ class YumBase(depsolve.Depsolve):
+@@ -765,6 +873,8 @@ class YumBase(depsolve.Depsolve):
          return self._up
      
      def doGroupSetup(self):
@@ -151727,7 +151804,7 @@ index 99039e0..1108443 100644
          warnings.warn(_('doGroupSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -829,7 +938,7 @@ class YumBase(depsolve.Depsolve):
+@@ -829,7 +939,7 @@ class YumBase(depsolve.Depsolve):
              try:
                  self._comps.add(groupfile)
              except (Errors.GroupsError,Errors.CompsException), e:
@@ -151736,7 +151813,7 @@ index 99039e0..1108443 100644
                  self.logger.critical(msg)
              else:
                  repo.groups_added = True
-@@ -837,7 +946,10 @@ class YumBase(depsolve.Depsolve):
+@@ -837,7 +947,10 @@ class YumBase(depsolve.Depsolve):
          if self._comps.compscount == 0:
              raise Errors.GroupsError, _('No Groups Available in any repository')
  
@@ -151748,7 +151825,7 @@ index 99039e0..1108443 100644
          self.verbose_logger.debug('group time: %0.3f' % (time.time() - group_st))                
          return self._comps
  
-@@ -868,7 +980,7 @@ class YumBase(depsolve.Depsolve):
+@@ -868,7 +981,7 @@ class YumBase(depsolve.Depsolve):
                      # feed it into _tags.add()
                      self._tags.add(repo.id, tag_sqlite)
                  except (Errors.RepoError, Errors.PkgTagsError), e:
@@ -151757,7 +151834,7 @@ index 99039e0..1108443 100644
                      self.logger.critical(msg)
                      
                  
-@@ -881,9 +993,18 @@ class YumBase(depsolve.Depsolve):
+@@ -881,9 +994,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,
@@ -151777,7 +151854,7 @@ index 99039e0..1108443 100644
      # properties so they auto-create themselves with defaults
      repos = property(fget=lambda self: self._getRepos(),
                       fset=lambda self, value: setattr(self, "_repos", value),
-@@ -921,6 +1042,11 @@ class YumBase(depsolve.Depsolve):
+@@ -921,6 +1043,11 @@ class YumBase(depsolve.Depsolve):
                         fdel=lambda self: setattr(self, "_history", None),
                         doc="Yum History Object")
  
@@ -151789,7 +151866,7 @@ index 99039e0..1108443 100644
      pkgtags = property(fget=lambda self: self._getTags(),
                         fset=lambda self, value: setattr(self, "_tags",value),
                         fdel=lambda self: setattr(self, "_tags", None),
-@@ -928,9 +1054,10 @@ class YumBase(depsolve.Depsolve):
+@@ -928,9 +1055,10 @@ class YumBase(depsolve.Depsolve):
      
      
      def doSackFilelistPopulate(self):
@@ -151803,7 +151880,7 @@ index 99039e0..1108443 100644
          necessary = False
          
          # I can't think of a nice way of doing this, we have to have the sack here
-@@ -951,8 +1078,12 @@ class YumBase(depsolve.Depsolve):
+@@ -951,8 +1079,12 @@ class YumBase(depsolve.Depsolve):
              self.repos.populateSack(mdtype='filelists')
             
      def yumUtilsMsg(self, func, prog):
@@ -151818,7 +151895,7 @@ index 99039e0..1108443 100644
          if self.rpmdb.contains(name="yum-utils"):
              return
  
-@@ -964,8 +1095,17 @@ class YumBase(depsolve.Depsolve):
+@@ -964,8 +1096,17 @@ class YumBase(depsolve.Depsolve):
               (hibeg, prog, hiend))
  
      def buildTransaction(self, unfinished_transactions_check=True):
@@ -151838,7 +151915,7 @@ index 99039e0..1108443 100644
          if (unfinished_transactions_check and
              misc.find_unfinished_transactions(yumlibpath=self.conf.persistdir)):
              msg = _('There are unfinished transactions remaining. You might ' \
-@@ -1004,7 +1144,7 @@ class YumBase(depsolve.Depsolve):
+@@ -1004,7 +1145,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 )
  
@@ -151847,7 +151924,7 @@ index 99039e0..1108443 100644
              self.tsInfo.pkgSack.dropCachedData()
  
          # FIXME: This is horrible, see below and yummain. Maybe create a real
-@@ -1044,6 +1184,37 @@ class YumBase(depsolve.Depsolve):
+@@ -1044,6 +1185,37 @@ class YumBase(depsolve.Depsolve):
                  if first.verEQ(other):
                      continue
                  msg = _('Protected multilib versions: %s != %s')
@@ -151885,7 +151962,7 @@ index 99039e0..1108443 100644
                  xrestring.append(msg % (first, other))
          if xrestring:
              rescode = 1
-@@ -1242,13 +1413,15 @@ class YumBase(depsolve.Depsolve):
+@@ -1242,13 +1414,15 @@ class YumBase(depsolve.Depsolve):
          if None in pkgtup:
              return None
          return pkgtup
@@ -151905,7 +151982,7 @@ index 99039e0..1108443 100644
          if pkgtup is None:
              return
          self._not_found_i[pkgtup] = YumNotFoundPackage(pkgtup)
-@@ -1454,8 +1627,14 @@ class YumBase(depsolve.Depsolve):
+@@ -1454,8 +1628,14 @@ class YumBase(depsolve.Depsolve):
          return probs
  
      def runTransaction(self, cb):
@@ -151921,7 +151998,7 @@ index 99039e0..1108443 100644
          self.plugins.run('pretrans')
  
          #  We may want to put this other places, eventually, but for now it's
-@@ -1516,10 +1695,23 @@ class YumBase(depsolve.Depsolve):
+@@ -1516,10 +1696,23 @@ class YumBase(depsolve.Depsolve):
                  pass
          self._ts_save_file = None
          
@@ -151945,7 +152022,7 @@ index 99039e0..1108443 100644
          
          # make resultobject - just a plain yumgenericholder object
          resultobject = misc.GenericHolder()
-@@ -1567,13 +1759,24 @@ class YumBase(depsolve.Depsolve):
+@@ -1567,13 +1760,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):
@@ -151975,7 +152052,7 @@ index 99039e0..1108443 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 +1787,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1584,9 +1788,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
@@ -151992,7 +152069,7 @@ index 99039e0..1108443 100644
          for txmbr in self.tsInfo:
              if txmbr.output_state in TS_INSTALL_STATES:
                  if not self.rpmdb.contains(po=txmbr.po):
-@@ -1596,7 +1806,9 @@ class YumBase(depsolve.Depsolve):
+@@ -1596,7 +1807,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
@@ -152002,7 +152079,7 @@ index 99039e0..1108443 100644
                  po = self.getInstalledPackageObject(txmbr.pkgtup)
                  rpo = txmbr.po
                  po.yumdb_info.from_repo = rpo.repoid
-@@ -1630,6 +1842,10 @@ class YumBase(depsolve.Depsolve):
+@@ -1630,6 +1843,10 @@ class YumBase(depsolve.Depsolve):
                      if md:
                          po.yumdb_info.from_repo_timestamp = str(md.timestamp)
  
@@ -152013,7 +152090,7 @@ index 99039e0..1108443 100644
                  loginuid = misc.getloginuid()
                  if txmbr.updates or txmbr.downgrades or txmbr.reinstall:
                      if txmbr.updates:
-@@ -1640,11 +1856,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1640,11 +1857,16 @@ class YumBase(depsolve.Depsolve):
                          opo = po
                      if 'installed_by' in opo.yumdb_info:
                          po.yumdb_info.installed_by = opo.yumdb_info.installed_by
@@ -152030,7 +152107,7 @@ index 99039e0..1108443 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 +1883,13 @@ class YumBase(depsolve.Depsolve):
+@@ -1662,10 +1884,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
@@ -152044,7 +152121,7 @@ index 99039e0..1108443 100644
                  self.verbose_logger.log(logginglevels.DEBUG_2, 'What is this? %s' % txmbr.po)
  
          self.plugins.run('postverifytrans')
-@@ -1680,10 +1904,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1680,10 +1905,11 @@ class YumBase(depsolve.Depsolve):
          self.verbose_logger.debug('VerifyTransaction time: %0.3f' % (time.time() - vt_st))
  
      def costExcludePackages(self):
@@ -152060,7 +152137,7 @@ index 99039e0..1108443 100644
          # if all the repo.costs are equal then don't bother running things
          costs = {}
          for r in self.repos.listEnabled():
-@@ -1705,10 +1930,12 @@ class YumBase(depsolve.Depsolve):
+@@ -1705,10 +1931,12 @@ class YumBase(depsolve.Depsolve):
              done = True
  
      def excludePackages(self, repo=None):
@@ -152076,7 +152153,7 @@ index 99039e0..1108443 100644
          if "all" in self.conf.disable_excludes:
              return
          
-@@ -1735,9 +1962,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1735,9 +1963,11 @@ class YumBase(depsolve.Depsolve):
              self.pkgSack.addPackageExcluder(repoid, exid,'exclude.match', match)
  
      def includePackages(self, repo):
@@ -152091,7 +152168,7 @@ index 99039e0..1108443 100644
          includelist = repo.getIncludePkgList()
          
          if len(includelist) == 0:
-@@ -1757,8 +1986,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1757,8 +1987,11 @@ class YumBase(depsolve.Depsolve):
          self.pkgSack.addPackageExcluder(repo.id, exid, 'exclude.marked')
          
      def doLock(self, lockfile = YUM_PID_FILE):
@@ -152105,7 +152182,7 @@ index 99039e0..1108443 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 +2006,26 @@ class YumBase(depsolve.Depsolve):
+@@ -1774,38 +2007,26 @@ class YumBase(depsolve.Depsolve):
          
          mypid=str(os.getpid())    
          while not self._lock(lockfile, mypid, 0644):
@@ -152159,7 +152236,7 @@ index 99039e0..1108443 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 +2050,69 @@ class YumBase(depsolve.Depsolve):
+@@ -1830,31 +2051,69 @@ class YumBase(depsolve.Depsolve):
          self._unlock(lockfile)
          self._lockfile = None
          
@@ -152239,7 +152316,7 @@ index 99039e0..1108443 100644
          failed = False
  
          if type(fo) is types.InstanceType:
-@@ -1894,9 +2152,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1894,9 +2153,16 @@ class YumBase(depsolve.Depsolve):
          
          
      def verifyChecksum(self, fo, checksumType, csum):
@@ -152259,7 +152336,7 @@ index 99039e0..1108443 100644
          try:
              filesum = misc.checksum(checksumType, fo)
          except Errors.MiscError, e:
-@@ -1908,6 +2173,17 @@ class YumBase(depsolve.Depsolve):
+@@ -1908,6 +2174,17 @@ class YumBase(depsolve.Depsolve):
          return 0
  
      def downloadPkgs(self, pkglist, callback=None, callback_total=None):
@@ -152277,7 +152354,7 @@ index 99039e0..1108443 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 +2255,9 @@ class YumBase(depsolve.Depsolve):
+@@ -1979,8 +2256,9 @@ class YumBase(depsolve.Depsolve):
              urlgrabber.progress.text_meter_total_size(remote_size)
          beg_download = time.time()
          i = 0
@@ -152288,7 +152365,7 @@ index 99039e0..1108443 100644
          for po in remote_pkgs:
              #  Recheck if the file is there, works around a couple of weird
              # edge cases.
-@@ -1992,52 +2269,47 @@ class YumBase(depsolve.Depsolve):
+@@ -1992,52 +2270,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,
@@ -152367,7 +152444,7 @@ index 99039e0..1108443 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 +2324,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2052,7 +2325,22 @@ class YumBase(depsolve.Depsolve):
          return errors
  
      def verifyHeader(self, fo, po, raiseError):
@@ -152391,7 +152468,7 @@ index 99039e0..1108443 100644
          if type(fo) is types.InstanceType:
              fo = fo.filename
              
-@@ -2076,9 +2363,12 @@ class YumBase(depsolve.Depsolve):
+@@ -2076,9 +2364,12 @@ class YumBase(depsolve.Depsolve):
          return 1
          
      def downloadHeader(self, po):
@@ -152406,7 +152483,7 @@ index 99039e0..1108443 100644
          if hasattr(po, 'pkgtype') and po.pkgtype == 'local':
              return
                  
-@@ -2122,15 +2412,17 @@ class YumBase(depsolve.Depsolve):
+@@ -2122,15 +2413,17 @@ class YumBase(depsolve.Depsolve):
              return
  
      def sigCheckPkg(self, po):
@@ -152432,7 +152509,7 @@ index 99039e0..1108443 100644
          if self._override_sigchecks:
              check = False
              hasgpgkey = 0
-@@ -2181,6 +2473,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2181,6 +2474,9 @@ class YumBase(depsolve.Depsolve):
          return result, msg
  
      def cleanUsedHeadersPackages(self):
@@ -152442,7 +152519,7 @@ index 99039e0..1108443 100644
          filelist = []
          for txmbr in self.tsInfo:
              if txmbr.po.state not in TS_INSTALL_STATES:
-@@ -2218,27 +2513,42 @@ class YumBase(depsolve.Depsolve):
+@@ -2218,27 +2514,42 @@ class YumBase(depsolve.Depsolve):
                      _('%s removed'), fn)
          
      def cleanHeaders(self):
@@ -152487,7 +152564,7 @@ index 99039e0..1108443 100644
          cachedir = self.conf.persistdir + "/rpmdb-indexes/"
          if not os.path.exists(cachedir):
              filelist = []
-@@ -2272,8 +2582,29 @@ class YumBase(depsolve.Depsolve):
+@@ -2272,8 +2583,29 @@ class YumBase(depsolve.Depsolve):
  
      def doPackageLists(self, pkgnarrow='all', patterns=None, showdups=None,
                         ignore_case=False):
@@ -152519,7 +152596,7 @@ index 99039e0..1108443 100644
          if showdups is None:
              showdups = self.conf.showdupesfromrepos
          ygh = misc.GenericHolder(iter=pkgnarrow)
-@@ -2323,10 +2654,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2323,10 +2655,22 @@ class YumBase(depsolve.Depsolve):
                      key = (pkg.name, pkg.arch)
                      if pkg.pkgtup in dinst:
                          reinstall_available.append(pkg)
@@ -152545,7 +152622,7 @@ index 99039e0..1108443 100644
  
          # produce the updates list of tuples
          elif pkgnarrow == 'updates':
-@@ -2461,14 +2804,13 @@ class YumBase(depsolve.Depsolve):
+@@ -2461,14 +2805,13 @@ class YumBase(depsolve.Depsolve):
  
          
      def findDeps(self, pkgs):
@@ -152565,7 +152642,7 @@ index 99039e0..1108443 100644
          results = {}
  
          for pkg in pkgs:
-@@ -2495,10 +2837,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2495,10 +2838,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):
@@ -152592,7 +152669,7 @@ index 99039e0..1108443 100644
          sql_fields = []
          for f in fields:
              sql_fields.append(RPM_TO_SQLITE.get(f, f))
-@@ -2661,6 +3015,14 @@ class YumBase(depsolve.Depsolve):
+@@ -2661,6 +3016,14 @@ class YumBase(depsolve.Depsolve):
                      yield (po, vs)
  
      def searchPackageTags(self, criteria):
@@ -152607,7 +152684,7 @@ index 99039e0..1108443 100644
          results = {} # name = [(criteria, taglist)]
          for c in criteria:
              c = c.lower()
-@@ -2677,11 +3039,16 @@ class YumBase(depsolve.Depsolve):
+@@ -2677,11 +3040,16 @@ class YumBase(depsolve.Depsolve):
          return results
          
      def searchPackages(self, fields, criteria, callback=None):
@@ -152629,7 +152706,7 @@ index 99039e0..1108443 100644
          warnings.warn(_('searchPackages() will go away in a future version of Yum.\
                        Use searchGenerator() instead. \n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)           
-@@ -2700,13 +3067,23 @@ class YumBase(depsolve.Depsolve):
+@@ -2700,13 +3068,23 @@ class YumBase(depsolve.Depsolve):
      
      def searchPackageProvides(self, args, callback=None,
                                callback_has_matchfor=False):
@@ -152657,7 +152734,7 @@ index 99039e0..1108443 100644
              else:
                  isglob = True
                  canBeFile = misc.re_filename(arg)
-@@ -2723,7 +3100,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2723,7 +3101,7 @@ class YumBase(depsolve.Depsolve):
                  where = self.returnPackagesByDep(arg)
              else:
                  usedDepString = False
@@ -152666,7 +152743,7 @@ index 99039e0..1108443 100644
              self.verbose_logger.log(logginglevels.DEBUG_1,
                 P_('Searching %d package', 'Searching %d packages', len(where)), len(where))
              
-@@ -2817,25 +3194,160 @@ class YumBase(depsolve.Depsolve):
+@@ -2817,25 +3195,160 @@ class YumBase(depsolve.Depsolve):
              
          return matches
  
@@ -152839,7 +152916,7 @@ index 99039e0..1108443 100644
                  if uservisible:
                      if grp.user_visible:
                          installed.append(grp)
-@@ -2847,34 +3359,98 @@ class YumBase(depsolve.Depsolve):
+@@ -2847,34 +3360,98 @@ class YumBase(depsolve.Depsolve):
                          available.append(grp)
                  else:
                      available.append(grp)
@@ -152948,7 +153025,7 @@ index 99039e0..1108443 100644
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -2898,13 +3474,58 @@ class YumBase(depsolve.Depsolve):
+@@ -2898,13 +3475,58 @@ class YumBase(depsolve.Depsolve):
                              self.tsInfo.remove(txmbr.po.pkgtup)
          
          
@@ -153014,7 +153091,7 @@ index 99039e0..1108443 100644
          """
  
          if not self.comps.has_group(grpid):
-@@ -2920,6 +3541,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2920,6 +3542,9 @@ class YumBase(depsolve.Depsolve):
          if group_package_types:
              package_types = group_package_types
  
@@ -153024,7 +153101,7 @@ index 99039e0..1108443 100644
          for thisgroup in thesegroups:
              if thisgroup.selected:
                  continue
-@@ -2934,12 +3558,49 @@ class YumBase(depsolve.Depsolve):
+@@ -2934,12 +3559,49 @@ class YumBase(depsolve.Depsolve):
              if 'optional' in package_types:
                  pkgs.extend(thisgroup.optional_packages)
  
@@ -153075,7 +153152,7 @@ index 99039e0..1108443 100644
                  except Errors.InstallError, e:
                      self.verbose_logger.debug(_('No package named %s available to be installed'),
                          pkg)
-@@ -2953,7 +3614,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2953,7 +3615,9 @@ class YumBase(depsolve.Depsolve):
                  group_conditionals = enable_group_conditionals
  
              count_cond_test = 0
@@ -153086,7 +153163,7 @@ index 99039e0..1108443 100644
                  for condreq, cond in thisgroup.conditional_packages.iteritems():
                      if self.isPackageInstalled(cond):
                          try:
-@@ -2990,17 +3653,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2990,17 +3654,22 @@ class YumBase(depsolve.Depsolve):
                          if cond not in self.tsInfo.conditionals:
                              self.tsInfo.conditionals[cond] = []
                          self.tsInfo.conditionals[cond].extend(pkgs)
@@ -153115,7 +153192,7 @@ index 99039e0..1108443 100644
          
          if not self.comps.has_group(grpid):
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -3008,7 +3676,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3008,7 +3677,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)
@@ -153125,7 +153202,7 @@ index 99039e0..1108443 100644
          for thisgroup in thesegroups:
              thisgroup.selected = False
              
-@@ -3034,13 +3703,102 @@ class YumBase(depsolve.Depsolve):
+@@ -3034,13 +3704,102 @@ class YumBase(depsolve.Depsolve):
                          for pkg in self.tsInfo.conditionals.get(txmbr.name, []):
                              self.tsInfo.remove(pkg.pkgtup)
          
@@ -153234,7 +153311,7 @@ index 99039e0..1108443 100644
          # look it up in the self.localPackages first:
          for po in self.localPackages:
              if po.pkgtup == pkgtup:
-@@ -3049,7 +3807,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3049,7 +3808,7 @@ class YumBase(depsolve.Depsolve):
          pkgs = self.pkgSack.searchPkgTuple(pkgtup)
  
          if len(pkgs) == 0:
@@ -153243,7 +153320,7 @@ index 99039e0..1108443 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 +3823,21 @@ class YumBase(depsolve.Depsolve):
+@@ -3065,13 +3824,21 @@ class YumBase(depsolve.Depsolve):
          return result
  
      def getInstalledPackageObject(self, pkgtup):
@@ -153270,7 +153347,7 @@ index 99039e0..1108443 100644
              raise Errors.RpmDBError, _('Package tuple %s could not be found in rpmdb') % str(pkgtup)
  
          # Dito. FIXME from getPackageObject() for len() > 1 ... :)
-@@ -3079,9 +3845,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3079,9 +3846,11 @@ class YumBase(depsolve.Depsolve):
          return po
          
      def gpgKeyCheck(self):
@@ -153284,7 +153361,7 @@ index 99039e0..1108443 100644
          gpgkeyschecked = self.conf.cachedir + '/.gpgkeyschecked.yum'
          if os.path.exists(gpgkeyschecked):
              return 1
-@@ -3106,9 +3874,13 @@ class YumBase(depsolve.Depsolve):
+@@ -3106,9 +3875,13 @@ class YumBase(depsolve.Depsolve):
              return 1
  
      def returnPackagesByDep(self, depstring):
@@ -153300,7 +153377,7 @@ index 99039e0..1108443 100644
          if not depstring:
              return []
  
-@@ -3135,9 +3907,16 @@ class YumBase(depsolve.Depsolve):
+@@ -3135,9 +3908,16 @@ class YumBase(depsolve.Depsolve):
          return self.pkgSack.getProvides(depname, depflags, depver).keys()
  
      def returnPackageByDep(self, depstring):
@@ -153320,7 +153397,7 @@ index 99039e0..1108443 100644
          # we get all sorts of randomness here
          errstring = depstring
          if type(depstring) not in types.StringTypes:
-@@ -3149,16 +3928,22 @@ class YumBase(depsolve.Depsolve):
+@@ -3149,16 +3929,22 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _('No Package found for %s') % errstring
          
          ps = ListPackageSack(pkglist)
@@ -153347,7 +153424,7 @@ index 99039e0..1108443 100644
          if not depstring:
              return []
  
-@@ -3184,12 +3969,47 @@ class YumBase(depsolve.Depsolve):
+@@ -3184,12 +3970,47 @@ class YumBase(depsolve.Depsolve):
  
          return self.rpmdb.getProvides(depname, depflags, depver).keys()
  
@@ -153397,7 +153474,7 @@ index 99039e0..1108443 100644
          
          
          if len(pkglist) == 0:
-@@ -3198,14 +4018,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3198,14 +4019,23 @@ class YumBase(depsolve.Depsolve):
          if len(pkglist) == 1:
              return pkglist[0]
  
@@ -153427,7 +153504,7 @@ index 99039e0..1108443 100644
          returnlist = []
          compatArchList = self.arch.get_arch_list(arch)
          multiLib = []
-@@ -3222,9 +4051,9 @@ class YumBase(depsolve.Depsolve):
+@@ -3222,9 +4052,9 @@ class YumBase(depsolve.Depsolve):
                  singleLib.append(po)
                  
          # we now have three lists.  find the best package(s) of each
@@ -153440,7 +153517,7 @@ index 99039e0..1108443 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 +4067,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3238,7 +4068,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:
@@ -153449,7 +153526,7 @@ index 99039e0..1108443 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3246,7 +4075,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3246,7 +4076,7 @@ class YumBase(depsolve.Depsolve):
                  if single: returnlist.append(single)
          # similar for the non-multilib case
          elif single:
@@ -153458,7 +153535,7 @@ index 99039e0..1108443 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3350,28 +4179,58 @@ class YumBase(depsolve.Depsolve):
+@@ -3350,28 +4180,58 @@ class YumBase(depsolve.Depsolve):
              done = True
  
              slow = next_func(slow)
@@ -153522,7 +153599,7 @@ index 99039e0..1108443 100644
          try:
              txmbrs = self.groupRemove(group_string)
          except yum.Errors.GroupsError:
-@@ -3387,6 +4246,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3387,6 +4247,8 @@ class YumBase(depsolve.Depsolve):
          assert pattern[0] == '@'
          grpid = pattern[1:]
  
@@ -153531,7 +153608,7 @@ index 99039e0..1108443 100644
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -3398,7 +4259,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3398,7 +4260,11 @@ class YumBase(depsolve.Depsolve):
      def _minus_deselect(self, pattern):
          """ Remove things from the transaction, like kickstart. """
          assert pattern[0] == '-'
@@ -153544,7 +153621,7 @@ index 99039e0..1108443 100644
  
          if pat and pat[0] == '@':
              pat = pat[1:]
-@@ -3437,14 +4302,61 @@ class YumBase(depsolve.Depsolve):
+@@ -3437,14 +4303,61 @@ class YumBase(depsolve.Depsolve):
              if flag not in self.tsInfo.probFilterFlags:
                  self.tsInfo.probFilterFlags.append(flag)
  
@@ -153612,7 +153689,7 @@ index 99039e0..1108443 100644
          pkgs = []
          was_pattern = False
          if po:
-@@ -3477,20 +4389,12 @@ class YumBase(depsolve.Depsolve):
+@@ -3477,20 +4390,12 @@ class YumBase(depsolve.Depsolve):
                      self.verbose_logger.debug(_('Checking for virtual provide or file-provide for %s'), 
                          arg)
  
@@ -153639,7 +153716,7 @@ index 99039e0..1108443 100644
              else:
                  nevra_dict = self._nevra_kwarg_parse(kwargs)
  
-@@ -3577,8 +4481,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3577,8 +4482,8 @@ class YumBase(depsolve.Depsolve):
                      continue
              
              # make sure this shouldn't be passed to update:
@@ -153650,7 +153727,7 @@ index 99039e0..1108443 100644
                  txmbrs = self.update(po=po)
                  tx_return.extend(txmbrs)
                  continue
-@@ -3587,7 +4491,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3587,7 +4492,7 @@ class YumBase(depsolve.Depsolve):
              # something else in the repo. Unless there is a obsoletion loop,
              # at which point ignore everything.
              obsoleting_pkg = None
@@ -153659,7 +153736,7 @@ index 99039e0..1108443 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 +4504,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3600,23 +4505,23 @@ class YumBase(depsolve.Depsolve):
                      already_obs = pkgs[0]
  
                  if already_obs:
@@ -153690,7 +153767,7 @@ index 99039e0..1108443 100644
                      continue
  
              # make sure we don't have a name.arch of this already installed
-@@ -3630,7 +4534,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3630,7 +4535,7 @@ class YumBase(depsolve.Depsolve):
                          found = True
                          break
                  if not found:
@@ -153699,7 +153776,7 @@ index 99039e0..1108443 100644
                      txmbrs = self.update(po=po)
                      tx_return.extend(txmbrs)
                      continue
-@@ -3719,19 +4623,47 @@ class YumBase(depsolve.Depsolve):
+@@ -3719,19 +4624,47 @@ class YumBase(depsolve.Depsolve):
          return txmbr
  
      def update(self, po=None, requiringPo=None, update_to=False, **kwargs):
@@ -153754,7 +153831,7 @@ index 99039e0..1108443 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 +4697,14 @@ class YumBase(depsolve.Depsolve):
+@@ -3765,7 +4698,14 @@ class YumBase(depsolve.Depsolve):
                      if new is None:
                          continue
                      tx_return.extend(self.update(po=new))
@@ -153770,7 +153847,7 @@ index 99039e0..1108443 100644
              return tx_return
  
          # complications
-@@ -3787,7 +4726,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3787,7 +4727,7 @@ class YumBase(depsolve.Depsolve):
                  return self._minus_deselect(kwargs['pattern'])
  
              if kwargs['pattern'] and kwargs['pattern'][0] == '@':
@@ -153779,7 +153856,7 @@ index 99039e0..1108443 100644
  
              arg = kwargs['pattern']
              if not update_to:
-@@ -3843,7 +4782,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3843,7 +4783,7 @@ class YumBase(depsolve.Depsolve):
                      availpkgs = self._compare_providers(availpkgs, requiringPo)
                      availpkgs = map(lambda x: x[0], availpkgs)
                  elif not availpkgs:
@@ -153788,7 +153865,7 @@ index 99039e0..1108443 100644
         
          # for any thing specified
          # get the list of available pkgs matching it (or take the po)
-@@ -3920,6 +4859,18 @@ class YumBase(depsolve.Depsolve):
+@@ -3920,6 +4860,18 @@ class YumBase(depsolve.Depsolve):
                      tx_return.append(txmbr)
                          
          for available_pkg in availpkgs:
@@ -153807,7 +153884,7 @@ index 99039e0..1108443 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 +4936,18 @@ class YumBase(depsolve.Depsolve):
+@@ -3985,11 +4937,18 @@ class YumBase(depsolve.Depsolve):
          return tx_return
          
      def remove(self, po=None, **kwargs):
@@ -153831,7 +153908,7 @@ index 99039e0..1108443 100644
          if not po and not kwargs:
              raise Errors.RemoveError, 'Nothing specified to remove'
          
-@@ -4055,17 +5013,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4055,17 +5014,19 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def installLocal(self, pkg, po=None, updateonly=False):
@@ -153861,7 +153938,7 @@ index 99039e0..1108443 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 +5143,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4183,16 +5144,15 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def reinstallLocal(self, pkg, po=None):
@@ -153886,7 +153963,7 @@ index 99039e0..1108443 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4215,9 +5174,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4215,9 +5175,19 @@ class YumBase(depsolve.Depsolve):
          return self.reinstall(po=po)
  
      def reinstall(self, po=None, **kwargs):
@@ -153909,7 +153986,7 @@ index 99039e0..1108443 100644
          self._add_prob_flags(rpm.RPMPROB_FILTER_REPLACEPKG,
                               rpm.RPMPROB_FILTER_REPLACENEWFILES,
                               rpm.RPMPROB_FILTER_REPLACEOLDFILES)
-@@ -4259,16 +5228,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4259,16 +5229,15 @@ class YumBase(depsolve.Depsolve):
          return tx_mbrs
          
      def downgradeLocal(self, pkg, po=None):
@@ -153934,7 +154011,7 @@ index 99039e0..1108443 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4309,13 +5277,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4309,13 +5278,19 @@ class YumBase(depsolve.Depsolve):
          return False
          
      def downgrade(self, po=None, **kwargs):
@@ -153961,7 +154038,7 @@ index 99039e0..1108443 100644
          if not po and not kwargs:
              raise Errors.DowngradeError, 'Nothing specified to downgrade'
  
-@@ -4421,6 +5395,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4421,6 +5396,9 @@ class YumBase(depsolve.Depsolve):
                  warned_nas.add(na)
                  continue
  
@@ -153971,7 +154048,7 @@ index 99039e0..1108443 100644
              if pkg.verGE(lipkg):
                  if na not in warned_nas:
                      msg = _('Only Upgrade available on package: %s') % pkg
-@@ -4457,7 +5434,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4457,7 +5435,7 @@ class YumBase(depsolve.Depsolve):
          if e and v and r:
              evr = '%s:%s-%s' % (e, v, r)
          elif v and r:
@@ -153980,7 +154057,7 @@ index 99039e0..1108443 100644
          elif e and v:
              evr = '%s:%s' % (e, v)
          elif v: # e and r etc. is just too weird to print
-@@ -4500,12 +5477,24 @@ class YumBase(depsolve.Depsolve):
+@@ -4500,12 +5478,24 @@ class YumBase(depsolve.Depsolve):
  
          return returndict
  
@@ -154008,7 +154085,7 @@ index 99039e0..1108443 100644
          old_conf_obs = self.conf.obsoletes
          self.conf.obsoletes = False
          done = False
-@@ -4515,19 +5504,46 @@ class YumBase(depsolve.Depsolve):
+@@ -4515,19 +5505,46 @@ class YumBase(depsolve.Depsolve):
                      done = True
          for pkg in transaction.trans_data:
              if pkg.state == 'Downgrade':
@@ -154055,7 +154132,7 @@ index 99039e0..1108443 100644
                  if self.install(pkgtup=pkg.pkgtup):
                      done = True
          for pkg in transaction.trans_data:
-@@ -4538,8 +5554,14 @@ class YumBase(depsolve.Depsolve):
+@@ -4538,8 +5555,14 @@ class YumBase(depsolve.Depsolve):
          return done
  
      def history_undo(self, transaction):
@@ -154072,7 +154149,7 @@ index 99039e0..1108443 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 +5638,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4616,7 +5639,7 @@ class YumBase(depsolve.Depsolve):
  
          except urlgrabber.grabber.URLGrabError, e:
              raise Errors.YumBaseError(_('GPG key retrieval failed: ') +
@@ -154081,7 +154158,7 @@ index 99039e0..1108443 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 +5671,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4649,7 +5672,7 @@ class YumBase(depsolve.Depsolve):
              keys_info = misc.getgpgkeyinfo(rawkey, multiple=True)
          except ValueError, e:
              raise Errors.YumBaseError(_('Invalid GPG Key from %s: %s') % 
@@ -154090,7 +154167,7 @@ index 99039e0..1108443 100644
          keys = []
          for keyinfo in keys_info:
              thiskey = {}
-@@ -4674,39 +5696,49 @@ class YumBase(depsolve.Depsolve):
+@@ -4674,39 +5697,49 @@ class YumBase(depsolve.Depsolve):
              if pkgs:
                  pkgs = sorted(pkgs)[-1]
                  msg = (_('Importing %s key 0x%s:\n'
@@ -154158,7 +154235,7 @@ index 99039e0..1108443 100644
          user_cb_fail = False
          for keyurl in keyurls:
              keys = self._retrievePublicKey(keyurl, repo)
-@@ -4725,7 +5757,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4725,7 +5758,9 @@ class YumBase(depsolve.Depsolve):
                      # Try installing/updating GPG key
                      self._getKeyImportMessage(info, keyurl)
                      rc = False
@@ -154169,7 +154246,7 @@ index 99039e0..1108443 100644
                          rc = True
                          
                      # grab the .sig/.asc for the keyurl, if it exists
-@@ -4751,8 +5785,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4751,8 +5786,8 @@ class YumBase(depsolve.Depsolve):
                  ts = self.rpmdb.readOnlyTS()
                  result = ts.pgpImportPubkey(misc.procgpgkey(info['raw_key']))
                  if result != 0:
@@ -154180,7 +154257,7 @@ index 99039e0..1108443 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
  
-@@ -4760,18 +5794,20 @@ class YumBase(depsolve.Depsolve):
+@@ -4760,18 +5795,20 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _("Didn't install any keys")
  
          if not key_installed:
@@ -154206,7 +154283,7 @@ index 99039e0..1108443 100644
      
      def _getAnyKeyForRepo(self, repo, destdir, keyurl_list, is_cakey=False, callback=None):
          """
-@@ -4788,6 +5824,18 @@ class YumBase(depsolve.Depsolve):
+@@ -4788,6 +5825,18 @@ class YumBase(depsolve.Depsolve):
          """
  
          key_installed = False
@@ -154225,7 +154302,7 @@ index 99039e0..1108443 100644
          user_cb_fail = False
          for keyurl in keyurl_list:
              keys = self._retrievePublicKey(keyurl, repo, getSig=not is_cakey)
-@@ -4819,8 +5867,11 @@ class YumBase(depsolve.Depsolve):
+@@ -4819,8 +5868,11 @@ class YumBase(depsolve.Depsolve):
                  if not key_installed:
                      self._getKeyImportMessage(info, keyurl, keytype)
                      rc = False
@@ -154238,7 +154315,7 @@ index 99039e0..1108443 100644
                      elif callback:
                          rc = callback({"repo": repo, "userid": info['userid'],
                                          "hexkeyid": info['hexkeyid'], "keyurl": keyurl,
-@@ -4835,7 +5886,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4835,7 +5887,8 @@ class YumBase(depsolve.Depsolve):
                  # Import the key
                  result = misc.import_key_to_pubring(info['raw_key'], info['hexkeyid'], gpgdir=destdir)
                  if not result:
@@ -154248,7 +154325,7 @@ index 99039e0..1108443 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
                  # write out the key id to imported_cakeys in the repos basedir
-@@ -4851,36 +5903,35 @@ class YumBase(depsolve.Depsolve):
+@@ -4851,36 +5904,35 @@ class YumBase(depsolve.Depsolve):
                              pass
  
          if not key_installed and user_cb_fail:
@@ -154301,7 +154378,7 @@ index 99039e0..1108443 100644
          self._getAnyKeyForRepo(repo, repo.gpgcadir, repo.gpgcakey, is_cakey=True, callback=callback)
  
      def _limit_installonly_pkgs(self):
-@@ -4927,6 +5978,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4927,6 +5979,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)
@@ -154309,7 +154386,7 @@ index 99039e0..1108443 100644
          for m in self.tsInfo.getMembers():
              if m.ts_state not in ('i', 'u'):
                  continue
-@@ -4937,12 +5989,21 @@ class YumBase(depsolve.Depsolve):
+@@ -4937,12 +5990,21 @@ class YumBase(depsolve.Depsolve):
              if not po_names.intersection(install_only_names):
                  continue
  
@@ -154335,7 +154412,7 @@ index 99039e0..1108443 100644
              for po in installed:
                  if (po.version, po.release) == (cur_kernel_v, cur_kernel_r): 
                      # don't remove running
-@@ -4959,19 +6020,22 @@ class YumBase(depsolve.Depsolve):
+@@ -4959,19 +6021,22 @@ class YumBase(depsolve.Depsolve):
              txmbr.depends_on.append(rel)
  
      def processTransaction(self, callback=None,rpmTestDisplay=None, rpmDisplay=None):
@@ -154371,7 +154448,7 @@ index 99039e0..1108443 100644
          
          if not callback:
              callback = callbacks.ProcessTransNoOutputCallback()
-@@ -5114,13 +6178,19 @@ class YumBase(depsolve.Depsolve):
+@@ -5114,13 +6179,19 @@ class YumBase(depsolve.Depsolve):
          return results
  
      def add_enable_repo(self, repoid, baseurls=[], mirrorlist=None, **kwargs):
@@ -154398,7 +154475,7 @@ index 99039e0..1108443 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 +6237,15 @@ class YumBase(depsolve.Depsolve):
+@@ -5167,9 +6238,15 @@ class YumBase(depsolve.Depsolve):
  
      def setCacheDir(self, force=False, tmpdir=None, reuse=True,
                      suffix='/$basearch/$releasever'):
@@ -154417,7 +154494,7 @@ index 99039e0..1108443 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 +6255,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5179,7 +6256,7 @@ class YumBase(depsolve.Depsolve):
          try:
              cachedir = misc.getCacheDir(tmpdir, reuse)
          except (IOError, OSError), e:
@@ -154426,7 +154503,7 @@ index 99039e0..1108443 100644
              cachedir = None
              
          if cachedir is None:
-@@ -5190,6 +6266,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5190,6 +6267,7 @@ class YumBase(depsolve.Depsolve):
              self.prerepoconf.cachedir = cachedir
          else:
              self.repos.setCacheDir(cachedir)
@@ -154434,7 +154511,7 @@ index 99039e0..1108443 100644
          self.conf.cachedir = cachedir
          return True # We got a new cache dir
  
-@@ -5220,13 +6297,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5220,13 +6298,24 @@ class YumBase(depsolve.Depsolve):
          self.history.write_addon_data('config-repos', myrepos)
          
      def verify_plugins_cb(self, verify_package):
@@ -154462,7 +154539,7 @@ index 99039e0..1108443 100644
          if self.tsInfo._unresolvedMembers:
              if auto:
                  self.logger.critical(_("Dependencies not solved. Will not save unresolved transaction."))
-@@ -5234,7 +6322,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5234,7 +6323,7 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError(_("Dependencies not solved. Will not save unresolved transaction."))
          
          if not filename:
@@ -154471,7 +154548,7 @@ index 99039e0..1108443 100644
              fd,filename = tempfile.mkstemp(suffix='.yumtx', prefix=prefix)
              f = os.fdopen(fd, 'w')
          else:
-@@ -5244,13 +6332,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5244,13 +6333,17 @@ class YumBase(depsolve.Depsolve):
          
          msg = "%s\n" % self.rpmdb.simpleVersion(main_only=True)[0]
          msg += "%s\n" % self.ts.getTsFlags()
@@ -154492,7 +154569,7 @@ index 99039e0..1108443 100644
          msg += "%s\n" % len(self.tsInfo.getMembers())
          for txmbr in self.tsInfo.getMembers():
              msg += txmbr._dump()
-@@ -5260,13 +6352,25 @@ class YumBase(depsolve.Depsolve):
+@@ -5260,13 +6353,25 @@ class YumBase(depsolve.Depsolve):
          except (IOError, OSError), e:
              self._ts_save_file = None
              if auto:
@@ -154524,7 +154601,7 @@ index 99039e0..1108443 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 +6380,45 @@ class YumBase(depsolve.Depsolve):
+@@ -5276,26 +6381,45 @@ class YumBase(depsolve.Depsolve):
          try:
              data = open(filename, 'r').readlines()
          except (IOError, OSError), e:
@@ -154572,7 +154649,7 @@ index 99039e0..1108443 100644
              if ignorerpm:
                  msg += _(" ignoring, as requested.")
                  self.logger.critical(_(msg))
-@@ -5318,8 +6441,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5318,8 +6442,17 @@ class YumBase(depsolve.Depsolve):
          numrepos = int(data[2].strip())
          repos = []
          rindex=3+numrepos
@@ -154591,7 +154668,7 @@ index 99039e0..1108443 100644
  
          # pkgs/txmbrs
          numpkgs = int(data[rindex].strip())
-@@ -5329,6 +6461,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5329,6 +6462,7 @@ class YumBase(depsolve.Depsolve):
          pkgcount = 0
          pkgprob = False
          curpkg = None
@@ -154599,7 +154676,7 @@ index 99039e0..1108443 100644
          for l in data[pkgstart:]:
              l = l.rstrip()
              # our main txmbrs
-@@ -5438,6 +6571,11 @@ class YumBase(depsolve.Depsolve):
+@@ -5438,6 +6572,11 @@ class YumBase(depsolve.Depsolve):
                  msg += _(" aborting.")
                  raise Errors.YumBaseError(msg)
              
@@ -154611,7 +154688,7 @@ index 99039e0..1108443 100644
          return self.tsInfo.getMembers()
  
      def _remove_old_deps(self):
-@@ -5470,18 +6608,6 @@ class YumBase(depsolve.Depsolve):
+@@ -5470,18 +6609,6 @@ class YumBase(depsolve.Depsolve):
                      if requiring == required: # if they are self-requiring skip them
                          continue
                          
@@ -154630,7 +154707,7 @@ index 99039e0..1108443 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 +6659,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5533,7 +6660,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
@@ -154655,7 +154732,7 @@ index 99039e0..1108443 100644
                  visited[curpkg] = True
              all_leaves_visited = True
              leaves = curpkg.requiring_packages()
-@@ -5547,4 +6690,3 @@ class YumBase(depsolve.Depsolve):
+@@ -5547,4 +6691,3 @@ class YumBase(depsolve.Depsolve):
          # Debugging output
          self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has no user-installed revdeps."), pkg)
          return False
@@ -158612,7 +158689,7 @@ index 31b1080..eb84123 100755
              tags += """ </tags>\n"""
              msg += tags
 diff --git a/yum/repos.py b/yum/repos.py
-index 3793bad..97fa71e 100644
+index 3793bad..0014880 100644
 --- a/yum/repos.py
 +++ b/yum/repos.py
 @@ -22,6 +22,7 @@ import misc
@@ -158623,7 +158700,7 @@ index 3793bad..97fa71e 100644
  
  from weakref import proxy as weakref
  
-@@ -67,6 +68,47 @@ class RepoStorage:
+@@ -67,6 +68,44 @@ class RepoStorage:
          self._cache_enabled_repos = []
          self.quick_enable_disable = {}
  
@@ -158651,15 +158728,12 @@ index 3793bad..97fa71e 100644
 +                downloading = repo._commonRetrieveDataMD_list(mdtypes)
 +                repos.append((repo, downloading, [False]))
 +
-+        # with sizes first, then without sizes..
-+        for no_size in (False, True):
-+            for repo, downloading, error in repos:
-+                def failfunc(obj, error=error):
-+                    error[0] = True
-+                for (ndata, nmdtype) in downloading:
-+                    if (ndata.size is None) == no_size:
-+                        repo._retrieveMD(nmdtype, async=True, failfunc=failfunc)
-+            urlgrabber.grabber.parallel_wait()
++        for repo, downloading, error in repos:
++            def failfunc(obj, error=error):
++                error[0] = True
++            for (ndata, nmdtype) in downloading:
++                repo._retrieveMD(nmdtype, async=True, failfunc=failfunc)
++        urlgrabber.grabber.parallel_wait()
 +
 +        # done or revert
 +        for repo, downloading, error in repos:
@@ -158671,7 +158745,7 @@ index 3793bad..97fa71e 100644
      def doSetup(self, thisrepo = None):
          
          self.ayum.plugins.run('prereposetup')
-@@ -89,6 +131,7 @@ class RepoStorage:
+@@ -89,6 +128,7 @@ class RepoStorage:
                  self.disableRepo(repo.id)
                  
          self._setup = True
@@ -158679,7 +158753,7 @@ index 3793bad..97fa71e 100644
          self.ayum.plugins.run('postreposetup')
          
      def __str__(self):
-@@ -223,8 +266,9 @@ class RepoStorage:
+@@ -223,15 +263,16 @@ class RepoStorage:
          
          self._cachedir = cachedir
          for repo in self.repos.values():
@@ -158690,8 +158764,17 @@ index 3793bad..97fa71e 100644
 +                repo.basecachedir = cachedir
  
  
-     def setProgressBar(self, obj):
-@@ -288,6 +332,16 @@ class RepoStorage:
+-    def setProgressBar(self, obj):
++    def setProgressBar(self, obj, multi_obj=None):
+         """sets the progress bar for downloading files from repos"""
+         
+         for repo in self.repos.values():
+-            repo.setCallback(obj)
++            repo.setCallback(obj, multi_obj)
+ 
+     def setFailureCallback(self, obj):
+         """sets the failure callback for all repos"""
+@@ -288,6 +329,16 @@ class RepoStorage:
          else:
              data = [ mdtype ]
           
@@ -159114,7 +159197,7 @@ index 2cb1acb..7da6a08 100644
          self._md[item] = val
  
 diff --git a/yum/yumRepo.py b/yum/yumRepo.py
-index e5e9ece..f831f23 100644
+index e5e9ece..e60fc20 100644
 --- a/yum/yumRepo.py
 +++ b/yum/yumRepo.py
 @@ -20,10 +20,12 @@ import time
@@ -159258,7 +159341,7 @@ index e5e9ece..f831f23 100644
          if os.path.exists(db_un_fn):
              if skip_old_DBMD_check and repo._using_old_MD:
                  return db_un_fn
-@@ -260,7 +313,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -260,10 +313,11 @@ class YumRepository(Repository, config.RepoConf):
          self.copy_local = 0
          # holder for stuff we've grabbed
          self.retrieved = { 'primary':0, 'filelists':0, 'other':0, 'group':0,
@@ -159267,7 +159350,11 @@ index e5e9ece..f831f23 100644
  
          # callbacks
          self.callback = None  # for the grabber
-@@ -285,6 +338,7 @@ class YumRepository(Repository, config.RepoConf):
++        self.multi_callback = None
+         self.failure_obj = None
+         self.mirror_failure_obj = None
+         self.interrupt_callback = None
+@@ -285,6 +339,7 @@ class YumRepository(Repository, config.RepoConf):
  
          self._grabfunc = None
          self._grab = None
@@ -159275,7 +159362,16 @@ index e5e9ece..f831f23 100644
  
      def __cmp__(self, other):
          """ Sort yum repos. by cost, and then by alphanumeric on their id. """
-@@ -431,25 +485,18 @@ class YumRepository(Repository, config.RepoConf):
+@@ -378,7 +433,7 @@ class YumRepository(Repository, config.RepoConf):
+                         'basecachedir', 'http_headers', 'metadata_cookie',
+                         'metadata_cookie_fn', 'quick_enable_disable',
+                         'repoMDFile', 'timestamp_check', 'urls', 'mirrorurls',
+-                        'yumvar', 'repofile')
++                        'yumvar', 'repofile', 'multi_callback')
+         for attr in dir(self):
+             if attr.startswith('_'):
+                 continue
+@@ -431,25 +486,18 @@ class YumRepository(Repository, config.RepoConf):
          self._proxy_dict = {} # zap it
          proxy_string = None
          empty = (None, '_none_', '')
@@ -159309,7 +159405,13 @@ index e5e9ece..f831f23 100644
  
          if proxy_string is not None:
              self._proxy_dict['http'] = proxy_string
-@@ -488,8 +535,20 @@ class YumRepository(Repository, config.RepoConf):
+@@ -483,13 +531,26 @@ class YumRepository(Repository, config.RepoConf):
+ 
+         ugopts = self._default_grabopts()
+         self._grabfunc = URLGrabber(progress_obj=self.callback,
++                                    multi_progress_obj=self.multi_callback,
+                                     failure_callback=self.failure_obj,
+                                     interrupt_callback=self.interrupt_callback,
                                      copy_local=self.copy_local,
                                      reget='simple',
                                      **ugopts)
@@ -159331,7 +159433,7 @@ index e5e9ece..f831f23 100644
                               failure_callback=self.mirror_failure_obj)
  
      def _default_grabopts(self, cache=True):
-@@ -499,6 +558,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -499,6 +560,7 @@ class YumRepository(Repository, config.RepoConf):
                   'throttle': self.throttle,
                   'proxies': self.proxy_dict,
                   'timeout': self.timeout,
@@ -159339,7 +159441,7 @@ index e5e9ece..f831f23 100644
                   'http_headers': tuple(self.__headersListFromDict(cache=cache)),
                   'ssl_verify_peer': self.sslverify,
                   'ssl_verify_host': self.sslverify,
-@@ -714,7 +774,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -714,7 +776,7 @@ class YumRepository(Repository, config.RepoConf):
              local = self.metalink_filename + '.tmp'
              if not self._metalinkCurrent():
                  url = misc.to_utf8(self.metalink)
@@ -159348,7 +159450,7 @@ index e5e9ece..f831f23 100644
                  try:
                      ug = URLGrabber(progress_obj = self.callback, **ugopts)
                      result = ug.urlgrab(url, local, text=self.id + "/metalink")
-@@ -751,7 +811,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -751,7 +813,7 @@ class YumRepository(Repository, config.RepoConf):
  
      def _getFile(self, url=None, relative=None, local=None, start=None, end=None,
              copy_local=None, checkfunc=None, text=None, reget='simple', 
@@ -159357,7 +159459,7 @@ index e5e9ece..f831f23 100644
          """retrieve file from the mirrorgroup for the repo
             relative to local, optionally get range from
             start to end, also optionally retrieve from a specific baseurl"""
-@@ -796,6 +856,16 @@ class YumRepository(Repository, config.RepoConf):
+@@ -796,6 +858,16 @@ class YumRepository(Repository, config.RepoConf):
              except Errors.MediaError, e:
                  verbose_logger.log(logginglevels.DEBUG_2, "Error getting package from media; falling back to url %s" %(e,))
  
@@ -159374,7 +159476,19 @@ index e5e9ece..f831f23 100644
          if url and scheme != "media":
              ugopts = self._default_grabopts(cache=cache)
              ug = URLGrabber(progress_obj = self.callback,
-@@ -835,7 +905,8 @@ class YumRepository(Repository, config.RepoConf):
+@@ -819,10 +891,7 @@ class YumRepository(Repository, config.RepoConf):
+                 if self.mirrorurls:
+                     errstr +="\n  You could try running: yum clean expire-cache"
+                     errstr +="\n  To get a new set of mirrors."
+-                if e.errno == 256:
+-                    raise Errors.NoMoreMirrorsRepoError, errstr
+-                else:
+-                    raise Errors.RepoError, errstr
++                raise Errors.RepoError, errstr
+ 
+ 
+         else:
+@@ -835,19 +904,18 @@ class YumRepository(Repository, config.RepoConf):
                                             reget = reget,
                                             checkfunc=checkfunc,
                                             http_headers=headers,
@@ -159384,7 +159498,13 @@ index e5e9ece..f831f23 100644
                                             )
              except URLGrabError, e:
                  errstr = "failure: %s from %s: %s" % (relative, self.id, e)
-@@ -847,7 +918,7 @@ class YumRepository(Repository, config.RepoConf):
+-                if e.errno == 256:
+-                    raise Errors.NoMoreMirrorsRepoError, errstr
+-                else:
+-                    raise Errors.RepoError, errstr
++                errors = getattr(e, 'errors', None)
++                raise Errors.NoMoreMirrorsRepoError(errstr, errors)
+ 
          return result
      __get = _getFile
  
@@ -159393,13 +159513,13 @@ index e5e9ece..f831f23 100644
          remote = package.relativepath
          local = package.localPkg()
          basepath = package.basepath
-@@ -857,15 +928,26 @@ class YumRepository(Repository, config.RepoConf):
+@@ -857,15 +925,26 @@ class YumRepository(Repository, config.RepoConf):
                  return local
              misc.unlink_f(local)
  
 -        return self._getFile(url=basepath,
 +        if checkfunc is None:
-+            checkfunc = (package.verifyLocalPkg, (), {})
++            checkfunc = lambda obj: package.verifyLocalPkg()
 +
 +        ret = self._getFile(url=basepath,
                          relative=remote,
@@ -159421,7 +159541,7 @@ index e5e9ece..f831f23 100644
      def getHeader(self, package, checkfunc = None, reget = 'simple',
              cache = True):
  
-@@ -1020,7 +1102,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1020,7 +1099,7 @@ class YumRepository(Repository, config.RepoConf):
              if grab_can_fail:
                  return None
              raise Errors.RepoError, 'Error downloading file %s: %s' % (local, e)
@@ -159430,7 +159550,7 @@ index e5e9ece..f831f23 100644
              misc.unlink_f(tfname)
              if grab_can_fail:
                  return None
-@@ -1260,6 +1342,9 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1260,6 +1339,9 @@ class YumRepository(Repository, config.RepoConf):
          return True
  
      def _check_db_version(self, mdtype, repoXML=None):
@@ -159440,7 +159560,7 @@ index e5e9ece..f831f23 100644
          if repoXML is None:
              repoXML = self.repoXML
          if mdtype in repoXML.repoData:
-@@ -1277,11 +1362,11 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1277,11 +1359,11 @@ class YumRepository(Repository, config.RepoConf):
              return None
  
          if not file_check:
@@ -159455,7 +159575,7 @@ index e5e9ece..f831f23 100644
              if not os.path.exists(local):
                  local = misc.decompress(local, fn_only=True)
                  compressed = True
-@@ -1302,6 +1387,17 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1302,6 +1384,17 @@ class YumRepository(Repository, config.RepoConf):
              into the delete list, this means metadata can change filename
              without us leaking it. """
  
@@ -159473,7 +159593,7 @@ index e5e9ece..f831f23 100644
          def _mdtype_eq(omdtype, odata, nmdtype, ndata):
              """ Check if two returns from _get_mdtype_data() are equal. """
              if ndata is None:
-@@ -1321,6 +1417,14 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1321,6 +1414,14 @@ class YumRepository(Repository, config.RepoConf):
              return True
  
          all_mdtypes = self.retrieved.keys()
@@ -159488,7 +159608,7 @@ index e5e9ece..f831f23 100644
          if mdtypes is None:
              mdtypes = all_mdtypes
  
-@@ -1333,8 +1437,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1333,8 +1434,7 @@ class YumRepository(Repository, config.RepoConf):
  
          # Inited twice atm. ... sue me
          self._oldRepoMDData['new_MD_files'] = []
@@ -159498,7 +159618,7 @@ index e5e9ece..f831f23 100644
          for mdtype in all_mdtypes:
              (nmdtype, ndata) = self._get_mdtype_data(mdtype)
  
-@@ -1371,43 +1474,16 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1371,43 +1471,16 @@ class YumRepository(Repository, config.RepoConf):
              # No old repomd data, but we might still have uncompressed MD
              if self._groupCheckDataMDValid(ndata, nmdtype, mdtype):
                  continue
@@ -159513,9 +159633,7 @@ index e5e9ece..f831f23 100644
 -        if len(downloading_with_size) == 1:
 -            downloading_no_size.extend(downloading_with_size)
 -            downloading_with_size = []
-+    def _commonRetrieveDataMD_done(self, downloading):
-+        """ Uncompress the downloaded metadata """
- 
+-
 -        remote_size = 0
 -        local_size  = 0
 -        for (ndata, nmdtype) in downloading_with_size: # Get total size...
@@ -159532,7 +159650,9 @@ index e5e9ece..f831f23 100644
 -            if not self._retrieveMD(nmdtype, retrieve_can_fail=True):
 -                self._revertOldRepoXML()
 -                return False
--
++    def _commonRetrieveDataMD_done(self, downloading):
++        """ Uncompress the downloaded metadata """
+ 
 -        for (ndata, nmdtype) in downloading_with_size + downloading_no_size:
 +        for (ndata, nmdtype) in downloading:
              local = self._get_mdtype_fname(ndata, False)
@@ -159547,7 +159667,7 @@ index e5e9ece..f831f23 100644
  
      def _groupLoadRepoXML(self, text=None, mdtypes=None):
          """ Retrieve the new repomd.xml from the repository, then check it
-@@ -1421,7 +1497,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1421,7 +1494,7 @@ class YumRepository(Repository, config.RepoConf):
              self._commonRetrieveDataMD(mdtypes)
  
      def _mdpolicy2mdtypes(self):
@@ -159556,7 +159676,7 @@ index e5e9ece..f831f23 100644
                       'group:primary' : ['primary'],
                       'group:small'   : ["primary", "updateinfo"],
                       'group:main'    : ["primary", "group", "filelists",
-@@ -1436,6 +1512,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1436,6 +1509,7 @@ class YumRepository(Repository, config.RepoConf):
          if not mdtypes or 'group:all' in mdtypes:
              mdtypes = None
          else:
@@ -159564,7 +159684,7 @@ index e5e9ece..f831f23 100644
              mdtypes = sorted(list(mdtypes))
          return mdtypes
  
-@@ -1451,12 +1528,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1451,12 +1525,7 @@ class YumRepository(Repository, config.RepoConf):
      def _getRepoXML(self):
          if self._repoXML:
              return self._repoXML
@@ -159578,7 +159698,7 @@ index e5e9ece..f831f23 100644
          return self._repoXML
  
  
-@@ -1514,7 +1586,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1514,7 +1583,7 @@ class YumRepository(Repository, config.RepoConf):
          return self._checkMD(fn, mdtype, openchecksum)
  
      def _checkMD(self, fn, mdtype, openchecksum=False,
@@ -159587,7 +159707,7 @@ index e5e9ece..f831f23 100644
          """ Internal function, use .checkMD() from outside yum. """
  
          thisdata = data # So the argument name is nicer
-@@ -1537,6 +1609,18 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1537,6 +1606,18 @@ class YumRepository(Repository, config.RepoConf):
          if size is not None:
              size = int(size)
  
@@ -159606,7 +159726,7 @@ index e5e9ece..f831f23 100644
          try: # get the local checksum
              l_csum = self._checksum(r_ctype, file, datasize=size)
          except Errors.RepoError, e:
-@@ -1551,15 +1635,13 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1551,15 +1632,13 @@ class YumRepository(Repository, config.RepoConf):
                  return None
              raise URLGrabError(-1, 'Metadata file does not match checksum')
  
@@ -159623,7 +159743,7 @@ index e5e9ece..f831f23 100644
          """ Internal function, use .retrieveMD() from outside yum. """
          #  Note that this can raise Errors.RepoMDError if mdtype doesn't exist
          # for this repo.
-@@ -1597,7 +1679,9 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1597,7 +1676,9 @@ class YumRepository(Repository, config.RepoConf):
                  return local # it's the same return the local one
  
          try:
@@ -159634,7 +159754,7 @@ index e5e9ece..f831f23 100644
              text = "%s/%s" % (self.id, mdtype)
              if thisdata.size is None:
                  reget = None
-@@ -1613,8 +1697,9 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1613,8 +1694,9 @@ class YumRepository(Repository, config.RepoConf):
                                    checkfunc=checkfunc, 
                                    text=text,
                                    cache=self.http_caching == 'all',
@@ -159646,7 +159766,7 @@ index e5e9ece..f831f23 100644
              if retrieve_can_fail:
                  return None
              raise
-@@ -1624,7 +1709,6 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1624,7 +1706,6 @@ class YumRepository(Repository, config.RepoConf):
              raise Errors.RepoError, \
                  "Could not retrieve %s matching remote checksum from %s" % (local, self)
          else:
@@ -159654,7 +159774,7 @@ index e5e9ece..f831f23 100644
              return local
  
  
-@@ -1646,9 +1730,16 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1646,13 +1727,21 @@ class YumRepository(Repository, config.RepoConf):
  
      def getGroups(self):
          """gets groups and returns group file path for the repository, if there
@@ -159672,8 +159792,14 @@ index e5e9ece..f831f23 100644
 +            return fn
          return self._retrieveMD('group', retrieve_can_fail=True)
  
-     def setCallback(self, callback):
-@@ -1681,7 +1772,7 @@ class YumRepository(Repository, config.RepoConf):
+-    def setCallback(self, callback):
++    def setCallback(self, callback, multi_callback=None):
+         self.callback = callback
++        self.multi_callback = multi_callback
+         self._callbacks_changed = True
+ 
+     def setFailureObj(self, failure_obj):
+@@ -1681,7 +1770,7 @@ class YumRepository(Repository, config.RepoConf):
                  print "Could not read mirrorlist %s, error was \n%s" %(url, e)
                  content = []
              for line in content:
diff --git a/yum-completion-helper.patch b/yum-completion-helper.patch
new file mode 100644
index 0000000..44e6c73
--- /dev/null
+++ b/yum-completion-helper.patch
@@ -0,0 +1,11 @@
+diff -up yum-3.4.3/completion-helper.py.old yum-3.4.3/completion-helper.py
+--- yum-3.4.3/completion-helper.py.old	2012-08-22 17:00:47.444104234 +0200
++++ yum-3.4.3/completion-helper.py	2012-08-22 17:00:57.954647525 +0200
+@@ -70,6 +70,7 @@ def get_pattern(extcmds):
+ 
+ def main(args):
+     base = cli.YumBaseCli()
++    base.setCacheDir = lambda *x: True # use the system cachedir
+     base.yum_cli_commands.clear()
+     base.registerCommand(GroupsCompletionCommand())
+     base.registerCommand(ListCompletionCommand())
diff --git a/yum.spec b/yum.spec
index 5a82a29..db9dafd 100644
--- a/yum.spec
+++ b/yum.spec
@@ -18,7 +18,7 @@
 Summary: RPM package installer/updater/manager
 Name: yum
 Version: 3.4.3
-Release: 32%{?dist}
+Release: 33%{?dist}
 License: GPLv2+
 Group: System Environment/Base
 Source0: http://yum.baseurl.org/download/3.4/%{name}-%{version}.tar.gz
@@ -31,6 +31,7 @@ Patch6: yum-HEAD.patch
 Patch7: yum-ppc64-preferred.patch
 Patch8: BZ-803346-no-only-update.patch
 Patch20: yum-manpage-files.patch
+Patch21: yum-completion-helper.patch
 
 URL: http://yum.baseurl.org/
 BuildArchitectures: noarch
@@ -139,6 +140,7 @@ Install this package if you want auto yum updates nightly via cron.
 %patch7 -p1
 %patch8 -p1
 %patch20 -p1
+%patch21 -p1
 %patch1 -p1
 
 %build
@@ -313,6 +315,11 @@ exit 0
 %endif
 
 %changelog
+* Wed Aug 22 2012 Zdenek Pavlas <zpavlas at redhat.com> - 3.4.3-33
+- update to latest HEAD.
+- Set multi_progress_obj option
+- Show full URLs and mirror errors when _getFile() fails.
+
 * Thu Aug 16 2012 James Antill <james at fedoraproject.org> - 3.4.3-32
 - update to latest HEAD.
 - Some fixes for new environment groups.


More information about the scm-commits mailing list