[yum] update to latest HEAD.

James Antill james at fedoraproject.org
Tue May 21 20:35:00 UTC 2013


commit 5d73c3561ff0852314e4b35f3d44274f79237a94
Author: James Antill <james at and.org>
Date:   Tue May 21 16:34:55 2013 -0400

    update to latest HEAD.
    
    - returnPackagesByDep() API fix (really old break).
    - Try to make groups conversion better.
    - progress.start: supply the default filename & url.  BZ 963023
    - drpm retry: add RPM sizes to total size.  BZ 959786
    - YumBaseError: safe str(e).  BZ 963698

 yum-HEAD.patch |  842 +++++++++++++++++++++++++++++++-------------------------
 yum.spec       |   10 +-
 2 files changed, 478 insertions(+), 374 deletions(-)
---
diff --git a/yum-HEAD.patch b/yum-HEAD.patch
index 5a71298..580a0d6 100644
--- a/yum-HEAD.patch
+++ b/yum-HEAD.patch
@@ -99,7 +99,7 @@ index 2f6154e..2e5a052 100644
 diff --git a/cli.py b/cli.py
 old mode 100644
 new mode 100755
-index 6056d38..173568f
+index 6056d38..8c61ffd
 --- a/cli.py
 +++ b/cli.py
 @@ -25,7 +25,7 @@ import sys
@@ -494,7 +494,7 @@ index 6056d38..173568f
 -             _('Running Transaction Check'))
 +             _('Running transaction check'))
          msgs = self._run_rpm_check()
-+        depsolve = True
++        depsolve = False
          if msgs:
              rpmlib_only = True
              for msg in msgs:
@@ -502,7 +502,7 @@ index 6056d38..173568f
                  print _("ERROR You need to update rpm to handle:")
              else:
                  print _('ERROR with transaction check vs depsolve:')
-+                depsolve = False
++                depsolve = True
  
              for msg in msgs:
                  print to_utf8(msg)
@@ -1909,10 +1909,10 @@ index 6056d38..173568f
      '''Keep only specific options from the command line argument list
 diff --git a/completion-helper.py b/completion-helper.py
 new file mode 100755
-index 0000000..1102fd6
+index 0000000..c0e5a28
 --- /dev/null
 +++ b/completion-helper.py
-@@ -0,0 +1,95 @@
+@@ -0,0 +1,96 @@
 +#!/usr/bin/python -t
 +# -*- coding: utf-8 -*-
 +#
@@ -1938,7 +1938,7 @@ index 0000000..1102fd6
 +
 +import cli
 +import yumcommands
-+from yum.Errors import GroupsError, ConfigError
++from yum.Errors import GroupsError, ConfigError, RepoError
 +
 +
 +class GroupsCompletionCommand(yumcommands.GroupsCommand):
@@ -2000,7 +2000,8 @@ index 0000000..1102fd6
 +        for repo in base.repos.listEnabled():
 +            repo.skip_if_unavailable = True
 +        base.doCommands()
-+    except (GroupsError, ConfigError), e:
++    except (GroupsError, ConfigError, RepoError), e:
++    # Any reason to not just catch YumBaseError ?
 +        base.logger.error(e)
 +
 +if __name__ == "__main__":
@@ -2672,7 +2673,7 @@ index 0000000..2af059d
 + the mailing list, yum at lists.baseurl.org, or consult bugzilla.
 +.fi
 diff --git a/docs/yum.8 b/docs/yum.8
-index 1a8202a..8c156f0 100644
+index 1a8202a..76bbdd5 100644
 --- a/docs/yum.8
 +++ b/docs/yum.8
 @@ -25,6 +25,8 @@ gnome\-packagekit application\&.
@@ -2833,7 +2834,7 @@ index 1a8202a..8c156f0 100644
  
  "\fBgroup remove\fP" is used to remove all of the packages in a group, unlike "groupinstall" this
  will remove everything regardless of group_package_types. It is worth pointing
-@@ -224,10 +274,37 @@ to only remove packages which aren't required by something else.
+@@ -224,10 +274,51 @@ to only remove packages which aren't required by something else.
  
  "\fBgroup info\fP" is used to give the description and package list of a group (and which type
  those packages are marked as). Note that you can use the yum-filter-data and
@@ -2843,6 +2844,19 @@ index 1a8202a..8c156f0 100644
  mode, then the package names are matched against installed/available packages
  similar to the list command.
 +
++When using group_command=objects, the info command will display markers next
++to each package saying how that pacakge relates to the group object. The
++meaning of these markers is:
++
++.br
++"-" = Pacakge isn't installed, and won't be installed as part of the group (Eg. group install foo -pkgA … this will have pkgA marked as '-')
++.br
++"+" = Package isn't installed, but will be the next time you run "yum upgrade" or "yum group upgrade foo"
++.br
++" " = Package is installed, but wasn't installed via. the group (so "group remove foo" won't remove it).
++.br
++"=" = Package is installed, and was installed via. the group.
++
 +"\fBgroup summary\fP" is used to give a quick summary of how many groups
 +are installed and available.
 +
@@ -2851,8 +2865,9 @@ index 1a8202a..8c156f0 100644
 +of which groups are installed, and the packages that belong to them.
 +
 +"\fBgroup mark install\fP" mark the group as installed. When
-+installed "\fByum upgrade\fP" and "\fByum group upgrade\fP" will installing new
-+packages for the group.
++installed "\fByum upgrade\fP" and "\fByum group upgrade\fP" will install new
++packages for the group (only those packages already installed will be marked as
++members of the installed group to start with).
 +
 +"\fBgroup mark remove\fP" the opposite of mark install.
 +
@@ -2872,7 +2887,7 @@ index 1a8202a..8c156f0 100644
  .IP
  .IP "\fBshell\fP"
  Is used to enter the 'yum shell', when a filename is specified the contents of
-@@ -235,12 +312,13 @@ that file is executed in yum shell mode. See \fIyum-shell(8)\fP for more info
+@@ -235,12 +326,13 @@ that file is executed in yum shell mode. See \fIyum-shell(8)\fP for more info
  .IP
  .IP "\fBresolvedep\fP"
  Is used to list packages providing the specified dependencies, at most one
@@ -2888,7 +2903,7 @@ index 1a8202a..8c156f0 100644
  reasons only.
  .IP
  .IP "\fBlocalupdate\fP"
-@@ -248,7 +326,7 @@ Is used to update the system by specifying local rpm files. Only the specified
+@@ -248,7 +340,7 @@ Is used to update the system by specifying local rpm files. Only the specified
  rpm files of which an older version is already installed will be installed,
  the remaining specified packages will be ignored.
  If required the enabled repositories will be used to resolve dependencies. Note
@@ -2897,7 +2912,7 @@ index 1a8202a..8c156f0 100644
  legacy reasons only.
  .IP
  .IP "\fBreinstall\fP"
-@@ -260,10 +338,26 @@ on groups, files, provides and filelists just like the "install" command\&.
+@@ -260,10 +352,26 @@ on groups, files, provides and filelists just like the "install" command\&.
  Will try and downgrade a package from the version currently installed to the
  previously highest version (or the specified version).
  The depsolver will not necessarily work, but if you specify all the packages it
@@ -2925,7 +2940,7 @@ index 1a8202a..8c156f0 100644
  .IP "\fBdeplist\fP"
  Produces a list of all dependencies and what packages provide those
  dependencies for the given packages. As of 3.2.30 it now just shows the latest
-@@ -291,11 +385,63 @@ then yum will ignore any repo errors and output the information it can get
+@@ -291,11 +399,63 @@ then yum will ignore any repo errors and output the information it can get
  (Eg. "yum clean all; yum -C repolist" will output something, although the
  package counts/etc. will be zeroed out).
  .IP
@@ -2991,7 +3006,7 @@ index 1a8202a..8c156f0 100644
  packages (in sorted order), and the checksum_type/checksum_data entries from
  the yumdb. Note that this rpmdb version is now also used significantly within
  yum (esp. in yum history).
-@@ -321,26 +467,33 @@ and so takes sub-commands:
+@@ -321,26 +481,33 @@ and so takes sub-commands:
  .IP "\fBhistory\fP"
  The history command allows the user to view what has happened in past
  transactions (assuming the history_record config. option is set). You can use
@@ -3031,7 +3046,7 @@ index 1a8202a..8c156f0 100644
  A (if it is not still installed), and "rollback 1" will try to remove packages
  B and C. Note that after a "rollback 1" you will have a fourth transaction,
  although the ending rpmdb version (see: yum version) should be the same in
-@@ -349,6 +502,12 @@ transactions 1 and 4.
+@@ -349,6 +516,12 @@ transactions 1 and 4.
  The addon-info command takes a transaction ID, and the packages-list command
  takes a package (with wildcards).
  
@@ -3044,7 +3059,7 @@ index 1a8202a..8c156f0 100644
  In "history list" you can change the behaviour of the 2nd column via. the
  configuration option history_list_view.
  
-@@ -356,6 +515,7 @@ In "history list" output the Altered column also gives some extra information
+@@ -356,6 +529,7 @@ In "history list" output the Altered column also gives some extra information
  if there was something not good with the transaction (this is also shown at the
  end of the package column in the packages-list command).
  
@@ -3052,12 +3067,12 @@ index 1a8202a..8c156f0 100644
  .I \fB>\fR - The rpmdb was changed, outside yum, after the transaction.
  .br
  .I \fB<\fR - The rpmdb was changed, outside yum, before the transaction.
-@@ -371,7 +531,123 @@ end of the package column in the packages-list command).
+@@ -371,7 +545,123 @@ end of the package column in the packages-list command).
  .I \fBs\fR - The transaction completed fine, but --skip-broken was enabled and had to skip some packages.
  .br
  
 +
- .IP
++.IP
 +.IP "\fBload-transaction\fP"
 +This command will re-load a saved yum transaction file, this allows you to
 +run a transaction on one machine and then use it on another.
@@ -3070,7 +3085,7 @@ index 1a8202a..8c156f0 100644
 +still available, if the rpmdb matches the current rpmdb, how many transaction
 +install/removes members are in the saved transaction and what the filename is.
 +
-+.IP
+ .IP
 +.IP "\fBupdateinfo\fP"
 +This command has a bunch of sub-commands to act on the updateinfo in the
 +repositories. The simplest commands are:
@@ -3176,7 +3191,7 @@ index 1a8202a..8c156f0 100644
  .IP "\fBcheck\fP"
  Checks the local rpmdb and produces information on any problems it finds. You
  can pass the check command the arguments "dependencies" or "duplicates", to
-@@ -401,6 +677,11 @@ Assume yes; assume that the answer to any question which would be asked
+@@ -401,6 +691,11 @@ Assume yes; assume that the answer to any question which would be asked
  is yes\&.
  .br
  Configuration Option: \fBassumeyes\fP
@@ -3188,7 +3203,7 @@ index 1a8202a..8c156f0 100644
  .IP "\fB\-c, \-\-config=[config file]\fP" 
  Specifies the config file location - can take HTTP and FTP URLs and local file
  paths\&.
-@@ -420,7 +701,7 @@ Sets the error level to [number] Practical range 0 \- 10. 0 means print only cri
+@@ -420,7 +715,7 @@ Sets the error level to [number] Practical range 0 \- 10. 0 means print only cri
  .br
  Configuration Option: \fBerrorlevel\fP
  .IP "\fB\-\-rpmverbosity=[name]\fP" 
@@ -3197,7 +3212,7 @@ index 1a8202a..8c156f0 100644
  options are: 'critical', 'emergency', 'error', 'warn' and 'debug'.
  .br
  Configuration Option: \fBrpmverbosity\fP
-@@ -461,8 +742,13 @@ processing logic. For more information see the \fBupdate\fP command above.
+@@ -461,8 +756,13 @@ processing logic. For more information see the \fBupdate\fP command above.
  .br
  Configuration Option: \fBobsoletes\fP
  .IP "\fB\-x, \-\-exclude=package\fP"
@@ -3213,7 +3228,7 @@ index 1a8202a..8c156f0 100644
  .br
  .IP "\fB\-\-color=[always|auto|never]\fP"
  Display colorized output automatically, depending on the output terminal,
-@@ -506,7 +792,14 @@ option will corrupt your cache (and you can use $releasever in your cachedir
+@@ -506,7 +806,14 @@ option will corrupt your cache (and you can use $releasever in your cachedir
  configuration to stop this).
  .PP 
  .IP "\fB\-t, \-\-tolerant\fP"
@@ -3229,7 +3244,7 @@ index 1a8202a..8c156f0 100644
  .br
  .IP "\fB\-\-setopt=option=value\fP"
  Set any config option in yum config or repo files. For options in the global 
-@@ -523,7 +816,7 @@ version of the package\&.
+@@ -523,7 +830,7 @@ version of the package\&.
  
  The format of the output of yum list is:
  
@@ -3238,7 +3253,7 @@ index 1a8202a..8c156f0 100644
  
  .IP "\fByum list [all | glob_exp1] [glob_exp2] [\&.\&.\&.]\fP"
  List all available and installed packages\&.
-@@ -542,6 +835,10 @@ shell\-style glob and any matches are printed\&.
+@@ -542,6 +849,10 @@ shell\-style glob and any matches are printed\&.
  List the packages installed on the system that are not available in any yum
  repository listed in the config file.
  .IP
@@ -186132,9 +186147,27 @@ index abd203f..455c3ae 100644
  - 3.4.1
  - umask bug fix.
 diff --git a/yum/Errors.py b/yum/Errors.py
-index c1af4ad..e3e3956 100644
+index c1af4ad..70de539 100644
 --- a/yum/Errors.py
 +++ b/yum/Errors.py
+@@ -18,7 +18,7 @@
+ Exceptions and Errors thrown by yum.
+ """
+ 
+-from i18n import to_unicode
++from i18n import to_unicode, to_utf8
+ 
+ class YumBaseError(Exception):
+     """
+@@ -29,7 +29,7 @@ class YumBaseError(Exception):
+         Exception.__init__(self)
+         self.value = value
+     def __str__(self):
+-        return "%s" %(self.value,)
++        return "%s" % to_utf8(self.value)
+ 
+     def __unicode__(self):
+         return '%s' % to_unicode(self.value)
 @@ -79,9 +79,20 @@ class RepoError(YumBaseError):
  class DuplicateRepoError(RepoError):
      pass
@@ -186159,7 +186192,7 @@ index c1af4ad..e3e3956 100644
      pass
      
 diff --git a/yum/__init__.py b/yum/__init__.py
-index 99039e0..50e2fad 100644
+index 99039e0..5ea797e 100644
 --- a/yum/__init__.py
 +++ b/yum/__init__.py
 @@ -21,6 +21,7 @@ The Yum RPM software updater.
@@ -187349,7 +187382,7 @@ index 99039e0..50e2fad 100644
          errors = {}
          def adderror(po, msg):
              errors.setdefault(po, []).append(msg)
-@@ -1943,116 +2259,194 @@ class YumBase(depsolve.Depsolve):
+@@ -1943,116 +2259,199 @@ class YumBase(depsolve.Depsolve):
          self.history.close()
  
          self.plugins.run('predownload', pkglist=pkglist)
@@ -187425,6 +187458,12 @@ index 99039e0..50e2fad 100644
 +        if deltasize:
 +            self.verbose_logger.info(_('Delta RPMs reduced %s of updates to %s (%d%% saved)'),
 +                format_number(rpmsize), format_number(deltasize), 100 - deltasize*100.0/rpmsize)
++
++        if downloadonly:
++            # close DBs, unlock
++            self.repos.close()
++            self.closeRpmDB()
++            self.doUnlock()
  
 -        remote_pkgs.sort(mediasort)
 -        #  This is kind of a hack and does nothing in non-Fedora versions,
@@ -187432,7 +187471,7 @@ index 99039e0..50e2fad 100644
 -        if (hasattr(urlgrabber.progress, 'text_meter_total_size') and
 -            len(remote_pkgs) > 1):
 -            urlgrabber.progress.text_meter_total_size(remote_size)
--        beg_download = time.time()
+         beg_download = time.time()
 -        i = 0
 -        local_size = 0
 -        done_repos = set()
@@ -187445,12 +187484,8 @@ index 99039e0..50e2fad 100644
 -                if self.verifyPkg(local, po, False):
 -                    self.verbose_logger.debug(_("using local copy of %s") %(po,))
 -                    remote_size -= po.size
-+        if downloadonly:
-+            # close DBs, unlock
-+            self.repos.close()
-+            self.closeRpmDB()
-+            self.doUnlock()
-+
++        all_remote_pkgs = remote_pkgs
++        all_remote_size = remote_size
 +        while True:
 +            remote_pkgs.sort(mediasort)
 +            #  This is kind of a hack and does nothing in non-Fedora versions,
@@ -187458,7 +187493,6 @@ index 99039e0..50e2fad 100644
 +            if (hasattr(urlgrabber.progress, 'text_meter_total_size') and
 +                len(remote_pkgs) > 1):
 +                urlgrabber.progress.text_meter_total_size(remote_size)
-+            beg_download = time.time()
 +            i = 0
 +            local_size = [0]
 +            done_repos = set()
@@ -187516,6 +187550,11 @@ index 99039e0..50e2fad 100644
 -                po.localpath = mylocal
 -                if po in errors:
 -                    del errors[po]
+-
+-        if hasattr(urlgrabber.progress, 'text_meter_total_size'):
+-            urlgrabber.progress.text_meter_total_size(0)
+-        if callback_total is not None and not errors:
+-            callback_total(remote_pkgs, remote_size, beg_download)
 +                                                                  local_size[0])
 +                    if isinstance(po, DeltaPackage):
 +                        presto.rebuild(po)
@@ -187557,8 +187596,6 @@ index 99039e0..50e2fad 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:
-+                callback_total(remote_pkgs, remote_size, beg_download)
 +
 +            if downloadonly:
 +                for po in remote_pkgs:
@@ -187584,10 +187621,7 @@ index 99039e0..50e2fad 100644
 +            if not errors or fatal:
 +                break
  
--        if hasattr(urlgrabber.progress, 'text_meter_total_size'):
--            urlgrabber.progress.text_meter_total_size(0)
--        if callback_total is not None and not errors:
--            callback_total(remote_pkgs, remote_size, beg_download)
+-        self.plugins.run('postdownload', pkglist=pkglist, errors=errors)
 +            # there were drpm related errors *only*
 +            remote_pkgs = []
 +            remote_size = 0
@@ -187595,10 +187629,14 @@ index 99039e0..50e2fad 100644
 +                po = po.rpm
 +                remote_pkgs.append(po)
 +                remote_size += po.size
++            # callback_total needs the total pkg count
++            all_remote_pkgs.extend(remote_pkgs)
++            all_remote_size += remote_size
 +            errors.clear()
 +            self.verbose_logger.warn(_('Some delta RPMs failed to download or rebuild. Retrying..'))
- 
--        self.plugins.run('postdownload', pkglist=pkglist, errors=errors)
++        if callback_total and not errors:
++            callback_total(all_remote_pkgs, all_remote_size, beg_download)
++
 +        if not downloadonly:
 +            # XXX: Run unlocked?  Skip this for now..
 +            self.plugins.run('postdownload', pkglist=pkglist, errors=errors)
@@ -187633,7 +187671,7 @@ index 99039e0..50e2fad 100644
          if type(fo) is types.InstanceType:
              fo = fo.filename
              
-@@ -2076,9 +2470,12 @@ class YumBase(depsolve.Depsolve):
+@@ -2076,9 +2475,12 @@ class YumBase(depsolve.Depsolve):
          return 1
          
      def downloadHeader(self, po):
@@ -187648,7 +187686,7 @@ index 99039e0..50e2fad 100644
          if hasattr(po, 'pkgtype') and po.pkgtype == 'local':
              return
                  
-@@ -2122,15 +2519,17 @@ class YumBase(depsolve.Depsolve):
+@@ -2122,15 +2524,17 @@ class YumBase(depsolve.Depsolve):
              return
  
      def sigCheckPkg(self, po):
@@ -187674,7 +187712,7 @@ index 99039e0..50e2fad 100644
          if self._override_sigchecks:
              check = False
              hasgpgkey = 0
-@@ -2181,6 +2580,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2181,6 +2585,9 @@ class YumBase(depsolve.Depsolve):
          return result, msg
  
      def cleanUsedHeadersPackages(self):
@@ -187684,7 +187722,7 @@ index 99039e0..50e2fad 100644
          filelist = []
          for txmbr in self.tsInfo:
              if txmbr.po.state not in TS_INSTALL_STATES:
-@@ -2218,27 +2620,42 @@ class YumBase(depsolve.Depsolve):
+@@ -2218,27 +2625,42 @@ class YumBase(depsolve.Depsolve):
                      _('%s removed'), fn)
          
      def cleanHeaders(self):
@@ -187729,7 +187767,7 @@ index 99039e0..50e2fad 100644
          cachedir = self.conf.persistdir + "/rpmdb-indexes/"
          if not os.path.exists(cachedir):
              filelist = []
-@@ -2271,9 +2688,31 @@ class YumBase(depsolve.Depsolve):
+@@ -2271,9 +2693,31 @@ class YumBase(depsolve.Depsolve):
          return 0, [msg]
  
      def doPackageLists(self, pkgnarrow='all', patterns=None, showdups=None,
@@ -187764,7 +187802,7 @@ index 99039e0..50e2fad 100644
          if showdups is None:
              showdups = self.conf.showdupesfromrepos
          ygh = misc.GenericHolder(iter=pkgnarrow)
-@@ -2295,6 +2734,8 @@ class YumBase(depsolve.Depsolve):
+@@ -2295,6 +2739,8 @@ class YumBase(depsolve.Depsolve):
              ndinst = {} # Newest versions by name.arch
              for po in self.rpmdb.returnPackages(patterns=patterns,
                                                  ignore_case=ic):
@@ -187773,7 +187811,7 @@ index 99039e0..50e2fad 100644
                  dinst[po.pkgtup] = po
                  if showdups:
                      continue
-@@ -2304,8 +2745,13 @@ class YumBase(depsolve.Depsolve):
+@@ -2304,8 +2750,13 @@ class YumBase(depsolve.Depsolve):
              installed = dinst.values()
                          
              if showdups:
@@ -187788,7 +187826,7 @@ index 99039e0..50e2fad 100644
              else:
                  try:
                      avail = self.pkgSack.returnNewestByNameArch(patterns=patterns,
-@@ -2323,16 +2769,30 @@ class YumBase(depsolve.Depsolve):
+@@ -2323,16 +2774,30 @@ class YumBase(depsolve.Depsolve):
                      key = (pkg.name, pkg.arch)
                      if pkg.pkgtup in dinst:
                          reinstall_available.append(pkg)
@@ -187822,7 +187860,7 @@ index 99039e0..50e2fad 100644
                  if len(matches) > 1:
                      updates.append(matches[0])
                      self.verbose_logger.log(logginglevels.DEBUG_1,
-@@ -2352,13 +2812,19 @@ class YumBase(depsolve.Depsolve):
+@@ -2352,13 +2817,19 @@ class YumBase(depsolve.Depsolve):
          elif pkgnarrow == 'installed':
              installed = self.rpmdb.returnPackages(patterns=patterns,
                                                    ignore_case=ic)
@@ -187843,7 +187881,7 @@ index 99039e0..50e2fad 100644
              else:
                  try:
                      avail = self.pkgSack.returnNewestByNameArch(patterns=patterns,
-@@ -2392,9 +2858,21 @@ class YumBase(depsolve.Depsolve):
+@@ -2392,9 +2863,21 @@ class YumBase(depsolve.Depsolve):
              avail = set(avail)
              for po in self.rpmdb.returnPackages(patterns=patterns,
                                                  ignore_case=ic):
@@ -187865,7 +187903,7 @@ index 99039e0..50e2fad 100644
          # obsoleting packages (and what they obsolete)
          elif pkgnarrow == 'obsoletes':
              self.conf.obsoletes = 1
-@@ -2402,6 +2880,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2402,6 +2885,7 @@ class YumBase(depsolve.Depsolve):
              for (pkgtup, instTup) in self.up.getObsoletesTuples():
                  (n,a,e,v,r) = pkgtup
                  pkgs = self.pkgSack.searchNevra(name=n, arch=a, ver=v, rel=r, epoch=e)
@@ -187873,7 +187911,7 @@ index 99039e0..50e2fad 100644
                  instpo = self.getInstalledPackageObject(instTup)
                  for po in pkgs:
                      obsoletes.append(po)
-@@ -2433,7 +2912,12 @@ class YumBase(depsolve.Depsolve):
+@@ -2433,7 +2917,12 @@ class YumBase(depsolve.Depsolve):
              recentlimit = now-(self.conf.recent*86400)
              if showdups:
                  avail = self.pkgSack.returnPackages(patterns=patterns,
@@ -187887,7 +187925,7 @@ index 99039e0..50e2fad 100644
              else:
                  try:
                      avail = self.pkgSack.returnNewestByNameArch(patterns=patterns,
-@@ -2461,14 +2945,13 @@ class YumBase(depsolve.Depsolve):
+@@ -2461,14 +2950,13 @@ class YumBase(depsolve.Depsolve):
  
          
      def findDeps(self, pkgs):
@@ -187907,7 +187945,7 @@ index 99039e0..50e2fad 100644
          results = {}
  
          for pkg in pkgs:
-@@ -2495,10 +2978,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2495,10 +2983,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):
@@ -187934,7 +187972,7 @@ index 99039e0..50e2fad 100644
          sql_fields = []
          for f in fields:
              sql_fields.append(RPM_TO_SQLITE.get(f, f))
-@@ -2614,7 +3109,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2614,7 +3114,7 @@ class YumBase(depsolve.Depsolve):
          # ...but without showdups we want to output _just_ #3, which requires
          # we find the newest EVR po for the best "matching value". Without keys
          # it's the same, except we just want the newest EVR.
@@ -187943,7 +187981,7 @@ index 99039e0..50e2fad 100644
          # either, so it's pretty thankless. HTH. HAND.
          # By default just sort using package sorting
          sort_func = operator.itemgetter(0)
-@@ -2661,6 +3156,14 @@ class YumBase(depsolve.Depsolve):
+@@ -2661,6 +3161,14 @@ class YumBase(depsolve.Depsolve):
                      yield (po, vs)
  
      def searchPackageTags(self, criteria):
@@ -187958,7 +187996,7 @@ index 99039e0..50e2fad 100644
          results = {} # name = [(criteria, taglist)]
          for c in criteria:
              c = c.lower()
-@@ -2677,11 +3180,16 @@ class YumBase(depsolve.Depsolve):
+@@ -2677,11 +3185,16 @@ class YumBase(depsolve.Depsolve):
          return results
          
      def searchPackages(self, fields, criteria, callback=None):
@@ -187980,7 +188018,7 @@ index 99039e0..50e2fad 100644
          warnings.warn(_('searchPackages() will go away in a future version of Yum.\
                        Use searchGenerator() instead. \n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)           
-@@ -2700,13 +3208,23 @@ class YumBase(depsolve.Depsolve):
+@@ -2700,13 +3213,23 @@ class YumBase(depsolve.Depsolve):
      
      def searchPackageProvides(self, args, callback=None,
                                callback_has_matchfor=False):
@@ -188008,7 +188046,7 @@ index 99039e0..50e2fad 100644
              else:
                  isglob = True
                  canBeFile = misc.re_filename(arg)
-@@ -2723,7 +3241,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2723,7 +3246,7 @@ class YumBase(depsolve.Depsolve):
                  where = self.returnPackagesByDep(arg)
              else:
                  usedDepString = False
@@ -188017,7 +188055,7 @@ index 99039e0..50e2fad 100644
              self.verbose_logger.log(logginglevels.DEBUG_1,
                 P_('Searching %d package', 'Searching %d packages', len(where)), len(where))
              
-@@ -2817,25 +3335,160 @@ class YumBase(depsolve.Depsolve):
+@@ -2817,25 +3340,160 @@ class YumBase(depsolve.Depsolve):
              
          return matches
  
@@ -188190,7 +188228,7 @@ index 99039e0..50e2fad 100644
                  if uservisible:
                      if grp.user_visible:
                          installed.append(grp)
-@@ -2847,34 +3500,98 @@ class YumBase(depsolve.Depsolve):
+@@ -2847,34 +3505,98 @@ class YumBase(depsolve.Depsolve):
                          available.append(grp)
                  else:
                      available.append(grp)
@@ -188268,7 +188306,6 @@ index 99039e0..50e2fad 100644
 -            pkgs = thisgroup.packages
 -            for pkg in thisgroup.packages:
 -                txmbrs = self.remove(name=pkg, silence_warnings=True)
--                txmbrs_used.extend(txmbrs)
 +
 +            if self.conf.group_command == 'objects':
 +                pkgs = thisgroup.pkg_names
@@ -188282,7 +188319,7 @@ index 99039e0..50e2fad 100644
 +                    continue
 +
 +                txmbrs = self.remove(name=pkg, silence_warnings=True)
-+                txmbrs_used.extend(txmbrs)
+                 txmbrs_used.extend(txmbrs)
                  for txmbr in txmbrs:
 -                    txmbr.groups.append(thisgroup.groupid)
 +                    txmbr.groups.append(gid)
@@ -188301,7 +188338,7 @@ index 99039e0..50e2fad 100644
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -2898,13 +3615,58 @@ class YumBase(depsolve.Depsolve):
+@@ -2898,13 +3620,58 @@ class YumBase(depsolve.Depsolve):
                              self.tsInfo.remove(txmbr.po.pkgtup)
          
          
@@ -188367,7 +188404,7 @@ index 99039e0..50e2fad 100644
          """
  
          if not self.comps.has_group(grpid):
-@@ -2920,6 +3682,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2920,6 +3687,9 @@ class YumBase(depsolve.Depsolve):
          if group_package_types:
              package_types = group_package_types
  
@@ -188377,7 +188414,7 @@ index 99039e0..50e2fad 100644
          for thisgroup in thesegroups:
              if thisgroup.selected:
                  continue
-@@ -2934,12 +3699,51 @@ class YumBase(depsolve.Depsolve):
+@@ -2934,12 +3704,51 @@ class YumBase(depsolve.Depsolve):
              if 'optional' in package_types:
                  pkgs.extend(thisgroup.optional_packages)
  
@@ -188430,7 +188467,7 @@ index 99039e0..50e2fad 100644
                  except Errors.InstallError, e:
                      self.verbose_logger.debug(_('No package named %s available to be installed'),
                          pkg)
-@@ -2953,7 +3757,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2953,7 +3762,9 @@ class YumBase(depsolve.Depsolve):
                  group_conditionals = enable_group_conditionals
  
              count_cond_test = 0
@@ -188441,7 +188478,7 @@ index 99039e0..50e2fad 100644
                  for condreq, cond in thisgroup.conditional_packages.iteritems():
                      if self.isPackageInstalled(cond):
                          try:
-@@ -2990,17 +3796,23 @@ class YumBase(depsolve.Depsolve):
+@@ -2990,17 +3801,23 @@ class YumBase(depsolve.Depsolve):
                          if cond not in self.tsInfo.conditionals:
                              self.tsInfo.conditionals[cond] = []
                          self.tsInfo.conditionals[cond].extend(pkgs)
@@ -188472,7 +188509,7 @@ index 99039e0..50e2fad 100644
          
          if not self.comps.has_group(grpid):
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -3008,7 +3820,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3008,7 +3825,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)
@@ -188482,7 +188519,7 @@ index 99039e0..50e2fad 100644
          for thisgroup in thesegroups:
              thisgroup.selected = False
              
-@@ -3034,13 +3847,102 @@ class YumBase(depsolve.Depsolve):
+@@ -3034,13 +3852,102 @@ class YumBase(depsolve.Depsolve):
                          for pkg in self.tsInfo.conditionals.get(txmbr.name, []):
                              self.tsInfo.remove(pkg.pkgtup)
          
@@ -188591,7 +188628,7 @@ index 99039e0..50e2fad 100644
          # look it up in the self.localPackages first:
          for po in self.localPackages:
              if po.pkgtup == pkgtup:
-@@ -3049,7 +3951,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3049,7 +3956,7 @@ class YumBase(depsolve.Depsolve):
          pkgs = self.pkgSack.searchPkgTuple(pkgtup)
  
          if len(pkgs) == 0:
@@ -188600,7 +188637,7 @@ index 99039e0..50e2fad 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 +3967,21 @@ class YumBase(depsolve.Depsolve):
+@@ -3065,13 +3972,21 @@ class YumBase(depsolve.Depsolve):
          return result
  
      def getInstalledPackageObject(self, pkgtup):
@@ -188627,7 +188664,7 @@ index 99039e0..50e2fad 100644
              raise Errors.RpmDBError, _('Package tuple %s could not be found in rpmdb') % str(pkgtup)
  
          # Dito. FIXME from getPackageObject() for len() > 1 ... :)
-@@ -3079,9 +3989,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3079,9 +3994,11 @@ class YumBase(depsolve.Depsolve):
          return po
          
      def gpgKeyCheck(self):
@@ -188641,7 +188678,7 @@ index 99039e0..50e2fad 100644
          gpgkeyschecked = self.conf.cachedir + '/.gpgkeyschecked.yum'
          if os.path.exists(gpgkeyschecked):
              return 1
-@@ -3106,9 +4018,13 @@ class YumBase(depsolve.Depsolve):
+@@ -3106,9 +4023,13 @@ class YumBase(depsolve.Depsolve):
              return 1
  
      def returnPackagesByDep(self, depstring):
@@ -188657,7 +188694,14 @@ index 99039e0..50e2fad 100644
          if not depstring:
              return []
  
-@@ -3135,9 +4051,16 @@ class YumBase(depsolve.Depsolve):
+@@ -3132,12 +4053,23 @@ class YumBase(depsolve.Depsolve):
+                         raise Errors.YumBaseError, _('Invalid version flag from: %s') % str(depstring)
+                     depflags = SYMBOLFLAGS[flagsymbol]
+ 
++        if depflags is None: # This does wildcards...
++            return self.pkgSack.searchProvides(depstring)
++
++        # This does flags+versions, but no wildcards...
          return self.pkgSack.getProvides(depname, depflags, depver).keys()
  
      def returnPackageByDep(self, depstring):
@@ -188677,7 +188721,7 @@ index 99039e0..50e2fad 100644
          # we get all sorts of randomness here
          errstring = depstring
          if type(depstring) not in types.StringTypes:
-@@ -3149,16 +4072,22 @@ class YumBase(depsolve.Depsolve):
+@@ -3149,16 +4081,22 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _('No Package found for %s') % errstring
          
          ps = ListPackageSack(pkglist)
@@ -188704,8 +188748,14 @@ index 99039e0..50e2fad 100644
          if not depstring:
              return []
  
-@@ -3184,12 +4113,47 @@ class YumBase(depsolve.Depsolve):
+@@ -3182,14 +4120,53 @@ class YumBase(depsolve.Depsolve):
+                         raise Errors.YumBaseError, _('Invalid version flag from: %s') % str(depstring)
+                     depflags = SYMBOLFLAGS[flagsymbol]
  
++        if depflags is None: # This does wildcards...
++            return self.rpmdb.searchProvides(depstring)
++
++        # This does flags+versions, but no wildcards...
          return self.rpmdb.getProvides(depname, depflags, depver).keys()
  
 -    def _bestPackageFromList(self, pkglist):
@@ -188754,7 +188804,7 @@ index 99039e0..50e2fad 100644
          
          
          if len(pkglist) == 0:
-@@ -3198,14 +4162,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3198,14 +4175,23 @@ class YumBase(depsolve.Depsolve):
          if len(pkglist) == 1:
              return pkglist[0]
  
@@ -188784,7 +188834,7 @@ index 99039e0..50e2fad 100644
          returnlist = []
          compatArchList = self.arch.get_arch_list(arch)
          multiLib = []
-@@ -3222,9 +4195,9 @@ class YumBase(depsolve.Depsolve):
+@@ -3222,9 +4208,9 @@ class YumBase(depsolve.Depsolve):
                  singleLib.append(po)
                  
          # we now have three lists.  find the best package(s) of each
@@ -188797,7 +188847,7 @@ index 99039e0..50e2fad 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 +4211,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3238,7 +4224,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:
@@ -188806,7 +188856,7 @@ index 99039e0..50e2fad 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3246,7 +4219,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3246,7 +4232,7 @@ class YumBase(depsolve.Depsolve):
                  if single: returnlist.append(single)
          # similar for the non-multilib case
          elif single:
@@ -188815,7 +188865,7 @@ index 99039e0..50e2fad 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3350,28 +4323,58 @@ class YumBase(depsolve.Depsolve):
+@@ -3350,28 +4336,58 @@ class YumBase(depsolve.Depsolve):
              done = True
  
              slow = next_func(slow)
@@ -188879,7 +188929,7 @@ index 99039e0..50e2fad 100644
          try:
              txmbrs = self.groupRemove(group_string)
          except yum.Errors.GroupsError:
-@@ -3387,6 +4390,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3387,6 +4403,8 @@ class YumBase(depsolve.Depsolve):
          assert pattern[0] == '@'
          grpid = pattern[1:]
  
@@ -188888,7 +188938,7 @@ index 99039e0..50e2fad 100644
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -3398,7 +4403,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3398,7 +4416,11 @@ class YumBase(depsolve.Depsolve):
      def _minus_deselect(self, pattern):
          """ Remove things from the transaction, like kickstart. """
          assert pattern[0] == '-'
@@ -188901,7 +188951,7 @@ index 99039e0..50e2fad 100644
  
          if pat and pat[0] == '@':
              pat = pat[1:]
-@@ -3437,14 +4446,87 @@ class YumBase(depsolve.Depsolve):
+@@ -3437,14 +4459,87 @@ class YumBase(depsolve.Depsolve):
              if flag not in self.tsInfo.probFilterFlags:
                  self.tsInfo.probFilterFlags.append(flag)
  
@@ -188995,7 +189045,7 @@ index 99039e0..50e2fad 100644
          pkgs = []
          was_pattern = False
          if po:
-@@ -3464,9 +4546,14 @@ class YumBase(depsolve.Depsolve):
+@@ -3464,9 +4559,14 @@ class YumBase(depsolve.Depsolve):
                  if kwargs['pattern'] and kwargs['pattern'][0] == '@':
                      return self._at_groupinstall(kwargs['pattern'])
  
@@ -189010,7 +189060,7 @@ index 99039e0..50e2fad 100644
                                                        ignore_case=False)
                  pkgs.extend(mypkgs)
                  # if we have anything left unmatched, let's take a look for it
-@@ -3477,20 +4564,12 @@ class YumBase(depsolve.Depsolve):
+@@ -3477,20 +4577,12 @@ class YumBase(depsolve.Depsolve):
                      self.verbose_logger.debug(_('Checking for virtual provide or file-provide for %s'), 
                          arg)
  
@@ -189028,7 +189078,7 @@ index 99039e0..50e2fad 100644
 -                        if mypkgs:
 -                            pkgs.extend(mypkgs)
 -                        
-+                    mypkgs = self.pkgSack.searchProvides(arg)
++                    mypkgs = self.pkgSack.returnPackagesByDep(arg)
 +                    if not misc.re_glob(arg):
 +                        mypkgs = self.bestPackagesFromList(mypkgs,
 +                                                           single_name=True,
@@ -189037,7 +189087,7 @@ index 99039e0..50e2fad 100644
              else:
                  nevra_dict = self._nevra_kwarg_parse(kwargs)
  
-@@ -3499,6 +4578,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3499,6 +4591,8 @@ class YumBase(depsolve.Depsolve):
                       ver=nevra_dict['version'], rel=nevra_dict['release'])
                  self._add_not_found_a(pkgs, nevra_dict)
                  
@@ -189046,7 +189096,7 @@ index 99039e0..50e2fad 100644
              if pkgs:
                  # if was_pattern or nevra-dict['arch'] is none, take the list
                  # of arches based on our multilib_compat config and 
-@@ -3577,17 +4658,21 @@ class YumBase(depsolve.Depsolve):
+@@ -3577,17 +4671,21 @@ class YumBase(depsolve.Depsolve):
                      continue
              
              # make sure this shouldn't be passed to update:
@@ -189072,7 +189122,7 @@ index 99039e0..50e2fad 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 +4685,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3600,23 +4698,23 @@ class YumBase(depsolve.Depsolve):
                      already_obs = pkgs[0]
  
                  if already_obs:
@@ -189103,7 +189153,7 @@ index 99039e0..50e2fad 100644
                      continue
  
              # make sure we don't have a name.arch of this already installed
-@@ -3630,8 +4715,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3630,8 +4728,8 @@ class YumBase(depsolve.Depsolve):
                          found = True
                          break
                  if not found:
@@ -189114,7 +189164,7 @@ index 99039e0..50e2fad 100644
                      tx_return.extend(txmbrs)
                      continue
  
-@@ -3719,19 +4804,47 @@ class YumBase(depsolve.Depsolve):
+@@ -3719,19 +4817,47 @@ class YumBase(depsolve.Depsolve):
          return txmbr
  
      def update(self, po=None, requiringPo=None, update_to=False, **kwargs):
@@ -189169,7 +189219,7 @@ index 99039e0..50e2fad 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 +4878,14 @@ class YumBase(depsolve.Depsolve):
+@@ -3765,7 +4891,14 @@ class YumBase(depsolve.Depsolve):
                      if new is None:
                          continue
                      tx_return.extend(self.update(po=new))
@@ -189185,7 +189235,7 @@ index 99039e0..50e2fad 100644
              return tx_return
  
          # complications
-@@ -3787,13 +4907,16 @@ class YumBase(depsolve.Depsolve):
+@@ -3787,13 +4920,16 @@ class YumBase(depsolve.Depsolve):
                  return self._minus_deselect(kwargs['pattern'])
  
              if kwargs['pattern'] and kwargs['pattern'][0] == '@':
@@ -189204,7 +189254,7 @@ index 99039e0..50e2fad 100644
  
              if not instpkgs and not availpkgs:
                  depmatches = []
-@@ -3805,6 +4928,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3805,6 +4941,8 @@ class YumBase(depsolve.Depsolve):
                  except yum.Errors.YumBaseError, e:
                      self.logger.critical(_('%s') % e)
  
@@ -189213,7 +189263,7 @@ index 99039e0..50e2fad 100644
                  if update_to:
                      availpkgs.extend(depmatches)
                  else:
-@@ -3816,9 +4941,12 @@ class YumBase(depsolve.Depsolve):
+@@ -3816,9 +4954,12 @@ class YumBase(depsolve.Depsolve):
              try:
                  if update_to:
                      m = []
@@ -189227,7 +189277,7 @@ index 99039e0..50e2fad 100644
                      m = self.pkgSack.returnNewestByNameArch(patterns=pats)
              except Errors.PackageSackError:
                  m = []
-@@ -3843,7 +4971,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3843,7 +4984,7 @@ class YumBase(depsolve.Depsolve):
                      availpkgs = self._compare_providers(availpkgs, requiringPo)
                      availpkgs = map(lambda x: x[0], availpkgs)
                  elif not availpkgs:
@@ -189236,7 +189286,7 @@ index 99039e0..50e2fad 100644
         
          # for any thing specified
          # get the list of available pkgs matching it (or take the po)
-@@ -3879,6 +5007,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3879,6 +5020,7 @@ class YumBase(depsolve.Depsolve):
                      if obsoleting_pkg is None:
                          continue
                      obs_pkgs.append(obsoleting_pkg)
@@ -189244,7 +189294,7 @@ index 99039e0..50e2fad 100644
                  for obsoleting_pkg in packagesNewestByName(obs_pkgs):
                      tx_return.extend(self.install(po=obsoleting_pkg))
              for available_pkg in availpkgs:
-@@ -3920,11 +5049,29 @@ class YumBase(depsolve.Depsolve):
+@@ -3920,11 +5062,29 @@ class YumBase(depsolve.Depsolve):
                      tx_return.append(txmbr)
                          
          for available_pkg in availpkgs:
@@ -189274,7 +189324,7 @@ index 99039e0..50e2fad 100644
                  self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is obsoleted: %s'), available_pkg)
                  tx_return.extend(self.update(po=obsoleting_pkg))
                  continue
-@@ -3985,11 +5132,18 @@ class YumBase(depsolve.Depsolve):
+@@ -3985,11 +5145,18 @@ class YumBase(depsolve.Depsolve):
          return tx_return
          
      def remove(self, po=None, **kwargs):
@@ -189298,7 +189348,7 @@ index 99039e0..50e2fad 100644
          if not po and not kwargs:
              raise Errors.RemoveError, 'Nothing specified to remove'
          
-@@ -4008,6 +5162,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4008,6 +5175,10 @@ class YumBase(depsolve.Depsolve):
                      return self._at_groupremove(kwargs['pattern'])
  
                  (e,m,u) = self.rpmdb.matchPackageNames([kwargs['pattern']])
@@ -189309,7 +189359,7 @@ index 99039e0..50e2fad 100644
                  pkgs.extend(e)
                  pkgs.extend(m)
                  if u:
-@@ -4018,6 +5176,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4018,6 +5189,10 @@ class YumBase(depsolve.Depsolve):
                      except yum.Errors.YumBaseError, e:
                          self.logger.critical(_('%s') % e)
                      
@@ -189320,7 +189370,7 @@ index 99039e0..50e2fad 100644
                      if not depmatches:
                          arg = to_unicode(arg)
                          self.logger.critical(_('No Match for argument: %s') % to_unicode(arg))
-@@ -4055,17 +5217,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4055,17 +5230,19 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def installLocal(self, pkg, po=None, updateonly=False):
@@ -189350,7 +189400,7 @@ index 99039e0..50e2fad 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 +5347,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4183,16 +5360,15 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def reinstallLocal(self, pkg, po=None):
@@ -189375,7 +189425,7 @@ index 99039e0..50e2fad 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4215,13 +5378,29 @@ class YumBase(depsolve.Depsolve):
+@@ -4215,13 +5391,29 @@ class YumBase(depsolve.Depsolve):
          return self.reinstall(po=po)
  
      def reinstall(self, po=None, **kwargs):
@@ -189408,7 +189458,7 @@ index 99039e0..50e2fad 100644
          tx_mbrs = []
          if po: # The po, is the "available" po ... we want the installed po
              tx_mbrs.extend(self.remove(pkgtup=po.pkgtup))
-@@ -4240,10 +5419,11 @@ class YumBase(depsolve.Depsolve):
+@@ -4240,10 +5432,11 @@ class YumBase(depsolve.Depsolve):
              # pkgs that are obsolete.
              old_conf_obs = self.conf.obsoletes
              self.conf.obsoletes = False
@@ -189422,7 +189472,7 @@ index 99039e0..50e2fad 100644
              self.conf.obsoletes = old_conf_obs
              if len(members) == 0:
                  self.tsInfo.remove(item.pkgtup)
-@@ -4259,16 +5439,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4259,16 +5452,15 @@ class YumBase(depsolve.Depsolve):
          return tx_mbrs
          
      def downgradeLocal(self, pkg, po=None):
@@ -189447,7 +189497,7 @@ index 99039e0..50e2fad 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4309,13 +5488,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4309,13 +5501,19 @@ class YumBase(depsolve.Depsolve):
          return False
          
      def downgrade(self, po=None, **kwargs):
@@ -189474,7 +189524,7 @@ index 99039e0..50e2fad 100644
          if not po and not kwargs:
              raise Errors.DowngradeError, 'Nothing specified to downgrade'
  
-@@ -4397,6 +5582,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4397,6 +5595,10 @@ class YumBase(depsolve.Depsolve):
          # installed version. Indexed fromn the latest installed pkgtup.
          downgrade_apkgs = {}
          for pkg in sorted(apkgs):
@@ -189485,7 +189535,7 @@ index 99039e0..50e2fad 100644
              na  = (pkg.name, pkg.arch)
  
              # Here we allow downgrades from .i386 => .noarch, or .i586 => .i386
-@@ -4421,6 +5610,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4421,6 +5623,9 @@ class YumBase(depsolve.Depsolve):
                  warned_nas.add(na)
                  continue
  
@@ -189495,7 +189545,7 @@ index 99039e0..50e2fad 100644
              if pkg.verGE(lipkg):
                  if na not in warned_nas:
                      msg = _('Only Upgrade available on package: %s') % pkg
-@@ -4457,7 +5649,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4457,7 +5662,7 @@ class YumBase(depsolve.Depsolve):
          if e and v and r:
              evr = '%s:%s-%s' % (e, v, r)
          elif v and r:
@@ -189504,7 +189554,7 @@ index 99039e0..50e2fad 100644
          elif e and v:
              evr = '%s:%s' % (e, v)
          elif v: # e and r etc. is just too weird to print
-@@ -4500,12 +5692,24 @@ class YumBase(depsolve.Depsolve):
+@@ -4500,12 +5705,24 @@ class YumBase(depsolve.Depsolve):
  
          return returndict
  
@@ -189532,7 +189582,7 @@ index 99039e0..50e2fad 100644
          old_conf_obs = self.conf.obsoletes
          self.conf.obsoletes = False
          done = False
-@@ -4515,19 +5719,46 @@ class YumBase(depsolve.Depsolve):
+@@ -4515,19 +5732,46 @@ class YumBase(depsolve.Depsolve):
                      done = True
          for pkg in transaction.trans_data:
              if pkg.state == 'Downgrade':
@@ -189579,7 +189629,7 @@ index 99039e0..50e2fad 100644
                  if self.install(pkgtup=pkg.pkgtup):
                      done = True
          for pkg in transaction.trans_data:
-@@ -4538,8 +5769,14 @@ class YumBase(depsolve.Depsolve):
+@@ -4538,8 +5782,14 @@ class YumBase(depsolve.Depsolve):
          return done
  
      def history_undo(self, transaction):
@@ -189596,7 +189646,7 @@ index 99039e0..50e2fad 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 +5853,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4616,7 +5866,7 @@ class YumBase(depsolve.Depsolve):
  
          except urlgrabber.grabber.URLGrabError, e:
              raise Errors.YumBaseError(_('GPG key retrieval failed: ') +
@@ -189605,7 +189655,7 @@ index 99039e0..50e2fad 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 +5886,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4649,7 +5899,7 @@ class YumBase(depsolve.Depsolve):
              keys_info = misc.getgpgkeyinfo(rawkey, multiple=True)
          except ValueError, e:
              raise Errors.YumBaseError(_('Invalid GPG Key from %s: %s') % 
@@ -189614,7 +189664,7 @@ index 99039e0..50e2fad 100644
          keys = []
          for keyinfo in keys_info:
              thiskey = {}
-@@ -4674,39 +5911,49 @@ class YumBase(depsolve.Depsolve):
+@@ -4674,39 +5924,49 @@ class YumBase(depsolve.Depsolve):
              if pkgs:
                  pkgs = sorted(pkgs)[-1]
                  msg = (_('Importing %s key 0x%s:\n'
@@ -189682,7 +189732,7 @@ index 99039e0..50e2fad 100644
          user_cb_fail = False
          for keyurl in keyurls:
              keys = self._retrievePublicKey(keyurl, repo)
-@@ -4725,7 +5972,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4725,7 +5985,9 @@ class YumBase(depsolve.Depsolve):
                      # Try installing/updating GPG key
                      self._getKeyImportMessage(info, keyurl)
                      rc = False
@@ -189693,7 +189743,7 @@ index 99039e0..50e2fad 100644
                          rc = True
                          
                      # grab the .sig/.asc for the keyurl, if it exists
-@@ -4751,8 +6000,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4751,8 +6013,8 @@ class YumBase(depsolve.Depsolve):
                  ts = self.rpmdb.readOnlyTS()
                  result = ts.pgpImportPubkey(misc.procgpgkey(info['raw_key']))
                  if result != 0:
@@ -189704,7 +189754,7 @@ index 99039e0..50e2fad 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
  
-@@ -4760,18 +6009,20 @@ class YumBase(depsolve.Depsolve):
+@@ -4760,18 +6022,20 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _("Didn't install any keys")
  
          if not key_installed:
@@ -189730,7 +189780,7 @@ index 99039e0..50e2fad 100644
      
      def _getAnyKeyForRepo(self, repo, destdir, keyurl_list, is_cakey=False, callback=None):
          """
-@@ -4788,6 +6039,18 @@ class YumBase(depsolve.Depsolve):
+@@ -4788,6 +6052,18 @@ class YumBase(depsolve.Depsolve):
          """
  
          key_installed = False
@@ -189749,7 +189799,7 @@ index 99039e0..50e2fad 100644
          user_cb_fail = False
          for keyurl in keyurl_list:
              keys = self._retrievePublicKey(keyurl, repo, getSig=not is_cakey)
-@@ -4819,8 +6082,11 @@ class YumBase(depsolve.Depsolve):
+@@ -4819,8 +6095,11 @@ class YumBase(depsolve.Depsolve):
                  if not key_installed:
                      self._getKeyImportMessage(info, keyurl, keytype)
                      rc = False
@@ -189762,7 +189812,7 @@ index 99039e0..50e2fad 100644
                      elif callback:
                          rc = callback({"repo": repo, "userid": info['userid'],
                                          "hexkeyid": info['hexkeyid'], "keyurl": keyurl,
-@@ -4835,7 +6101,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4835,7 +6114,8 @@ class YumBase(depsolve.Depsolve):
                  # Import the key
                  result = misc.import_key_to_pubring(info['raw_key'], info['hexkeyid'], gpgdir=destdir)
                  if not result:
@@ -189772,7 +189822,7 @@ index 99039e0..50e2fad 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
                  # write out the key id to imported_cakeys in the repos basedir
-@@ -4851,36 +6118,35 @@ class YumBase(depsolve.Depsolve):
+@@ -4851,36 +6131,35 @@ class YumBase(depsolve.Depsolve):
                              pass
  
          if not key_installed and user_cb_fail:
@@ -189825,7 +189875,7 @@ index 99039e0..50e2fad 100644
          self._getAnyKeyForRepo(repo, repo.gpgcadir, repo.gpgcakey, is_cakey=True, callback=callback)
  
      def _limit_installonly_pkgs(self):
-@@ -4889,7 +6155,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4889,7 +6168,7 @@ class YumBase(depsolve.Depsolve):
              New in 3.2.24: Obey yumdb_info.installonly data. """
  
          def _sort_and_filter_installonly(pkgs):
@@ -189834,7 +189884,7 @@ index 99039e0..50e2fad 100644
                  using the yumdb. """
              ret_beg = []
              ret_mid = []
-@@ -4926,23 +6192,30 @@ class YumBase(depsolve.Depsolve):
+@@ -4926,23 +6205,30 @@ class YumBase(depsolve.Depsolve):
          # so self.rpmdb.ts should be valid.
          ts = self.rpmdb.readOnlyTS()
          (cur_kernel_v, cur_kernel_r) = misc.get_running_kernel_version_release(ts)
@@ -189873,7 +189923,7 @@ index 99039e0..50e2fad 100644
              for po in installed:
                  if (po.version, po.release) == (cur_kernel_v, cur_kernel_r): 
                      # don't remove running
-@@ -4959,19 +6232,22 @@ class YumBase(depsolve.Depsolve):
+@@ -4959,19 +6245,22 @@ class YumBase(depsolve.Depsolve):
              txmbr.depends_on.append(rel)
  
      def processTransaction(self, callback=None,rpmTestDisplay=None, rpmDisplay=None):
@@ -189909,7 +189959,7 @@ index 99039e0..50e2fad 100644
          
          if not callback:
              callback = callbacks.ProcessTransNoOutputCallback()
-@@ -5062,8 +6338,8 @@ class YumBase(depsolve.Depsolve):
+@@ -5062,8 +6351,8 @@ class YumBase(depsolve.Depsolve):
                  raise Errors.YumRPMCheckError, retmsgs
              retmsgs = [_('ERROR with transaction check vs depsolve:')]
              retmsgs.extend(msgs) 
@@ -189920,7 +189970,7 @@ index 99039e0..50e2fad 100644
              raise Errors.YumRPMCheckError,retmsgs
          
          tsConf = {}
-@@ -5114,13 +6390,19 @@ class YumBase(depsolve.Depsolve):
+@@ -5114,13 +6403,19 @@ class YumBase(depsolve.Depsolve):
          return results
  
      def add_enable_repo(self, repoid, baseurls=[], mirrorlist=None, **kwargs):
@@ -189947,7 +189997,7 @@ index 99039e0..50e2fad 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 +6449,15 @@ class YumBase(depsolve.Depsolve):
+@@ -5167,9 +6462,15 @@ class YumBase(depsolve.Depsolve):
  
      def setCacheDir(self, force=False, tmpdir=None, reuse=True,
                      suffix='/$basearch/$releasever'):
@@ -189966,7 +190016,7 @@ index 99039e0..50e2fad 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 +6467,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5179,7 +6480,7 @@ class YumBase(depsolve.Depsolve):
          try:
              cachedir = misc.getCacheDir(tmpdir, reuse)
          except (IOError, OSError), e:
@@ -189975,7 +190025,7 @@ index 99039e0..50e2fad 100644
              cachedir = None
              
          if cachedir is None:
-@@ -5190,6 +6478,8 @@ class YumBase(depsolve.Depsolve):
+@@ -5190,6 +6491,8 @@ class YumBase(depsolve.Depsolve):
              self.prerepoconf.cachedir = cachedir
          else:
              self.repos.setCacheDir(cachedir)
@@ -189984,7 +190034,7 @@ index 99039e0..50e2fad 100644
          self.conf.cachedir = cachedir
          return True # We got a new cache dir
  
-@@ -5220,13 +6510,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5220,13 +6523,24 @@ class YumBase(depsolve.Depsolve):
          self.history.write_addon_data('config-repos', myrepos)
          
      def verify_plugins_cb(self, verify_package):
@@ -190012,7 +190062,7 @@ index 99039e0..50e2fad 100644
          if self.tsInfo._unresolvedMembers:
              if auto:
                  self.logger.critical(_("Dependencies not solved. Will not save unresolved transaction."))
-@@ -5234,7 +6535,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5234,7 +6548,7 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError(_("Dependencies not solved. Will not save unresolved transaction."))
          
          if not filename:
@@ -190021,7 +190071,7 @@ index 99039e0..50e2fad 100644
              fd,filename = tempfile.mkstemp(suffix='.yumtx', prefix=prefix)
              f = os.fdopen(fd, 'w')
          else:
-@@ -5244,13 +6545,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5244,13 +6558,17 @@ class YumBase(depsolve.Depsolve):
          
          msg = "%s\n" % self.rpmdb.simpleVersion(main_only=True)[0]
          msg += "%s\n" % self.ts.getTsFlags()
@@ -190042,7 +190092,7 @@ index 99039e0..50e2fad 100644
          msg += "%s\n" % len(self.tsInfo.getMembers())
          for txmbr in self.tsInfo.getMembers():
              msg += txmbr._dump()
-@@ -5260,42 +6565,84 @@ class YumBase(depsolve.Depsolve):
+@@ -5260,42 +6578,84 @@ class YumBase(depsolve.Depsolve):
          except (IOError, OSError), e:
              self._ts_save_file = None
              if auto:
@@ -190139,7 +190189,7 @@ index 99039e0..50e2fad 100644
              if ignorerpm:
                  msg += _(" ignoring, as requested.")
                  self.logger.critical(_(msg))
-@@ -5318,8 +6665,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5318,8 +6678,17 @@ class YumBase(depsolve.Depsolve):
          numrepos = int(data[2].strip())
          repos = []
          rindex=3+numrepos
@@ -190158,7 +190208,7 @@ index 99039e0..50e2fad 100644
  
          # pkgs/txmbrs
          numpkgs = int(data[rindex].strip())
-@@ -5329,6 +6685,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5329,6 +6698,7 @@ class YumBase(depsolve.Depsolve):
          pkgcount = 0
          pkgprob = False
          curpkg = None
@@ -190166,7 +190216,7 @@ index 99039e0..50e2fad 100644
          for l in data[pkgstart:]:
              l = l.rstrip()
              # our main txmbrs
-@@ -5356,6 +6713,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5356,6 +6726,7 @@ class YumBase(depsolve.Depsolve):
                      if not ignoremissing:
                          raise Errors.YumBaseError(msg)
                      else:
@@ -190174,7 +190224,7 @@ index 99039e0..50e2fad 100644
                          self.logger.critical(msg)
                  else:
                      pkgcount += 1
-@@ -5432,12 +6790,18 @@ class YumBase(depsolve.Depsolve):
+@@ -5432,12 +6803,18 @@ class YumBase(depsolve.Depsolve):
          if pkgprob:
              msg = _("Transaction members, relations are missing or ts has been modified,")
              if ignoremissing:
@@ -190193,7 +190243,7 @@ index 99039e0..50e2fad 100644
          return self.tsInfo.getMembers()
  
      def _remove_old_deps(self):
-@@ -5470,18 +6834,6 @@ class YumBase(depsolve.Depsolve):
+@@ -5470,18 +6847,6 @@ class YumBase(depsolve.Depsolve):
                      if requiring == required: # if they are self-requiring skip them
                          continue
                          
@@ -190212,7 +190262,7 @@ index 99039e0..50e2fad 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 +6885,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5533,7 +6898,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
@@ -190237,7 +190287,7 @@ index 99039e0..50e2fad 100644
                  visited[curpkg] = True
              all_leaves_visited = True
              leaves = curpkg.requiring_packages()
-@@ -5547,4 +6916,3 @@ class YumBase(depsolve.Depsolve):
+@@ -5547,4 +6929,3 @@ class YumBase(depsolve.Depsolve):
          # Debugging output
          self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has no user-installed revdeps."), pkg)
          return False
@@ -190390,7 +190440,7 @@ index 7ad25ce..a9a8e53 100644
          pass
          
 diff --git a/yum/comps.py b/yum/comps.py
-index 65f6d5e..b9c6202 100755
+index 65f6d5e..aa13b9a 100755
 --- a/yum/comps.py
 +++ b/yum/comps.py
 @@ -16,14 +16,14 @@
@@ -190437,7 +190487,18 @@ index 65f6d5e..b9c6202 100755
          self.groupid = None
          self.display_order = 1024
          self.installed = False
-@@ -271,6 +281,155 @@ class Group(CompsObj):
+@@ -191,6 +201,10 @@ class Group(CompsObj):
+                     continue
+ 
+                 package = child.text
++                if not package:
++                    #  Ignore this too, or we end up doing:
++                    # .searchNevra(name=None)
++                    continue
+                 if genre == 'mandatory':
+                     self.mandatory_packages[package] = 1
+                 elif genre == 'default':
+@@ -271,6 +285,155 @@ class Group(CompsObj):
  
          return msg      
  
@@ -190593,7 +190654,7 @@ index 65f6d5e..b9c6202 100755
  
  class Category(CompsObj):
      """ Category object parsed from group data in each repo. and merged. """
-@@ -371,12 +530,61 @@ class Category(CompsObj):
+@@ -371,12 +534,61 @@ class Category(CompsObj):
          msg += """  </category>\n"""
  
          return msg                
@@ -190656,7 +190717,7 @@ index 65f6d5e..b9c6202 100755
          self.compscount = 0
          self.overwrite_groups = overwrite_groups
          self.compiled = False # have groups been compiled into avail/installed 
-@@ -387,14 +595,24 @@ class Comps(object):
+@@ -387,14 +599,24 @@ class Comps(object):
          grps = self._groups.values()
          grps.sort(key=lambda x: (x.display_order, x.name))
          return grps
@@ -190682,7 +190743,7 @@ index 65f6d5e..b9c6202 100755
      
      def has_group(self, grpid):
          exists = self.return_groups(grpid)
-@@ -447,6 +665,57 @@ class Comps(object):
+@@ -447,6 +669,57 @@ class Comps(object):
  
          return returns.values()
  
@@ -190740,7 +190801,7 @@ index 65f6d5e..b9c6202 100755
      #  This is close to returnPackages() etc. API ... need to std. these names
      # the above return_groups uses different, but equal, API.
      def return_categories(self, pattern, ignore_case=True):
-@@ -490,6 +759,13 @@ class Comps(object):
+@@ -490,6 +763,13 @@ class Comps(object):
          else:
              self._groups[group.groupid] = group
  
@@ -190754,7 +190815,7 @@ index 65f6d5e..b9c6202 100755
      def add_category(self, category):
          if category.categoryid in self._categories:
              thatcat = self._categories[category.categoryid]
-@@ -497,6 +773,9 @@ class Comps(object):
+@@ -497,6 +777,9 @@ class Comps(object):
          else:
              self._categories[category.categoryid] = category
  
@@ -190764,7 +190825,7 @@ index 65f6d5e..b9c6202 100755
      def add(self, srcfile = None):
          if not srcfile:
              raise CompsException
-@@ -520,9 +799,14 @@ class Comps(object):
+@@ -520,9 +803,14 @@ class Comps(object):
                  if elem.tag == "group":
                      group = Group(elem)
                      self.add_group(group)
@@ -190779,7 +190840,7 @@ index 65f6d5e..b9c6202 100755
          except SyntaxError, e:
              raise CompsException, "comps file is empty/damaged"
              
-@@ -557,13 +841,32 @@ class Comps(object):
+@@ -557,13 +845,32 @@ class Comps(object):
                      if pkgname in inst_pkg_names:
                          group.installed = True
                          break
@@ -190813,7 +190874,7 @@ index 65f6d5e..b9c6202 100755
              return ""
              
          msg = """<?xml version="1.0" encoding="UTF-8"?>
-@@ -575,7 +878,9 @@ class Comps(object):
+@@ -575,7 +882,9 @@ class Comps(object):
              msg += g.xml()
          for c in self.get_categories():
              msg += c.xml()
@@ -190824,7 +190885,7 @@ index 65f6d5e..b9c6202 100755
          msg += """\n</comps>\n"""
          
          return msg
-@@ -590,16 +895,34 @@ def main():
+@@ -590,16 +899,34 @@ def main():
          for srcfile in sys.argv[1:]:
              p.add(srcfile)
  
@@ -192525,10 +192586,10 @@ index 6d744c0..52b751b 100644
          self.conflict = conflict # what the conflict was between them
 diff --git a/yum/drpm.py b/yum/drpm.py
 new file mode 100644
-index 0000000..b04779d
+index 0000000..b88d1ce
 --- /dev/null
 +++ b/yum/drpm.py
-@@ -0,0 +1,316 @@
+@@ -0,0 +1,317 @@
 +#  Integrated delta rpm support
 +#  Copyright 2013 Zdenek Pavlas
 +
@@ -192806,7 +192867,8 @@ index 0000000..b04779d
 +                if hasattr(progress, 'text_meter_total_size'):
 +                    progress.text_meter_total_size(0)
 +                self.progress = po.repo.callback
-+                self.progress.start(text='<locally rebuilding deltarpms>', size=total)
++                self.progress.start(filename=None, url=None, # BZ 963023
++                                    text='<locally rebuilding deltarpms>', size=total)
 +                self.done = 0
 +        while self._future_jobs:
 +            self.dequeue()
@@ -195438,7 +195500,7 @@ index 3793bad..e519bc1 100644
              sack = repo.getPackageSack()
              try:
 diff --git a/yum/rpmsack.py b/yum/rpmsack.py
-index e289a7a..ff0666c 100644
+index e289a7a..56c3793 100644
 --- a/yum/rpmsack.py
 +++ b/yum/rpmsack.py
 @@ -48,6 +48,17 @@ def _open_no_umask(*args):
@@ -195732,6 +195794,15 @@ index e289a7a..ff0666c 100644
              except (IOError, OSError), e:
                  return
  
+@@ -1223,7 +1320,7 @@ class RPMDBPackageSack(PackageSackBase):
+                 if not pkgs:
+                     self._pkgname_fails.add(name)
+             else:
+-                pkgs = self.returnPkgs()
++                pkgs = self.returnPackages()
+             for po in pkgs:
+                 for tag in ('arch', 'rel', 'ver', 'epoch'):
+                     if loc[tag] is not None and loc[tag] != getattr(po, tag):
 @@ -1456,7 +1553,7 @@ class RPMDBPackageSack(PackageSackBase):
          providers = set() # Speedup, as usual :)
          problems = []
@@ -196375,10 +196446,10 @@ index 2cb1acb..714de89 100644
          ret = u''
 diff --git a/yum/updateinfo.py b/yum/updateinfo.py
 new file mode 100644
-index 0000000..8c6e295
+index 0000000..1cc207f
 --- /dev/null
 +++ b/yum/updateinfo.py
-@@ -0,0 +1,515 @@
+@@ -0,0 +1,526 @@
 +
 +import os.path
 +
@@ -196416,8 +196487,19 @@ index 0000000..8c6e295
 +    for i in sec_cmds:
 +        if fnmatch.fnmatch(pkgname, i):
 +            return i
-+        if notice['update_id'] == i:
++        if fnmatch.fnmatch(notice['update_id'], i):
 +            return i
++
++        cvei = i
++        if not (i.startswith("CVE-") or i.startswith("*")):
++            cvei = 'CVE-' + i
++        for ref in _ysp_safe_refs(notice['references']):
++            if ref['id'] is None:
++                continue
++            if fnmatch.fnmatch(ref['id'], i):
++                return i
++            if fnmatch.fnmatch(ref['id'], cvei):
++                return i
 +    return None
 +
 +def _has_id(used_map, refs, ref_type, ref_ids):
@@ -196895,7 +196977,7 @@ index 0000000..8c6e295
 +    return txmbrs
 +
 diff --git a/yum/yumRepo.py b/yum/yumRepo.py
-index e5e9ece..2e4fcd9 100644
+index e5e9ece..41d180e 100644
 --- a/yum/yumRepo.py
 +++ b/yum/yumRepo.py
 @@ -20,10 +20,12 @@ import time
@@ -197248,7 +197330,7 @@ index e5e9ece..2e4fcd9 100644
  
          if proxy_string is not None:
              self._proxy_dict['http'] = proxy_string
-@@ -483,14 +605,49 @@ class YumRepository(Repository, config.RepoConf):
+@@ -483,14 +605,50 @@ class YumRepository(Repository, config.RepoConf):
  
          ugopts = self._default_grabopts()
          self._grabfunc = URLGrabber(progress_obj=self.callback,
@@ -197278,8 +197360,9 @@ index e5e9ece..2e4fcd9 100644
 +        def mirror_failure(obj):
 +            action = {}
 +
-+            # special handling of 503 errors
-+            if getattr(obj.exception, 'code', 0) == 503:
++            # timeouts and 503 errors may retry
++            e = obj.exception
++            if e.errno == 12 or getattr(e, 'code', 0) == 503:
 +                tries = getattr(obj, 'tries', self.retries)
 +                if tries <= self.retries - len(self.urls):
 +                    # don't remove this mirror yet
@@ -197300,7 +197383,7 @@ index e5e9ece..2e4fcd9 100644
  
      def _default_grabopts(self, cache=True):
          opts = { 'keepalive': self.keepalive,
-@@ -499,6 +656,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -499,6 +657,7 @@ class YumRepository(Repository, config.RepoConf):
                   'throttle': self.throttle,
                   'proxies': self.proxy_dict,
                   'timeout': self.timeout,
@@ -197308,7 +197391,7 @@ index e5e9ece..2e4fcd9 100644
                   'http_headers': tuple(self.__headersListFromDict(cache=cache)),
                   'ssl_verify_peer': self.sslverify,
                   'ssl_verify_host': self.sslverify,
-@@ -561,7 +719,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -561,7 +720,7 @@ class YumRepository(Repository, config.RepoConf):
          cookie = self.cachedir + '/' + self.metadata_cookie_fn
          self.setAttribute('_dir_setup_metadata_cookie', cookie)
  
@@ -197317,7 +197400,7 @@ index e5e9ece..2e4fcd9 100644
              self._dirSetupMkdir_p(dir)
  
          # persistdir is really root-only but try the make anyway and just
-@@ -714,15 +872,15 @@ class YumRepository(Repository, config.RepoConf):
+@@ -714,15 +873,15 @@ class YumRepository(Repository, config.RepoConf):
              local = self.metalink_filename + '.tmp'
              if not self._metalinkCurrent():
                  url = misc.to_utf8(self.metalink)
@@ -197337,7 +197420,7 @@ index e5e9ece..2e4fcd9 100644
                          raise Errors.RepoError, msg
                      #  Now, we have an old usable metalink, so we can't move to
                      # a newer repomd.xml ... or checksums won't match.
-@@ -749,9 +907,22 @@ class YumRepository(Repository, config.RepoConf):
+@@ -749,9 +908,22 @@ class YumRepository(Repository, config.RepoConf):
                                                                value),
                               fdel=lambda self: setattr(self, "_metalink", None))
  
@@ -197361,7 +197444,7 @@ index e5e9ece..2e4fcd9 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"""
-@@ -768,7 +939,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -768,7 +940,7 @@ class YumRepository(Repository, config.RepoConf):
  
          if local is None or relative is None:
              raise Errors.RepoError, \
@@ -197370,7 +197453,7 @@ index e5e9ece..2e4fcd9 100644
  
          if self.cache == 1:
              if os.path.exists(local): # FIXME - we should figure out a way
-@@ -778,7 +949,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -778,7 +950,7 @@ class YumRepository(Repository, config.RepoConf):
                  raise Errors.RepoError, \
                      "Caching enabled but no local cache of %s from %s" % (local,
  
@@ -197379,7 +197462,7 @@ index e5e9ece..2e4fcd9 100644
  
          if url:
              (scheme, netloc, path, query, fragid) = urlparse.urlsplit(url)
-@@ -796,6 +967,16 @@ class YumRepository(Repository, config.RepoConf):
+@@ -796,6 +968,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,))
  
@@ -197396,7 +197479,7 @@ index e5e9ece..2e4fcd9 100644
          if url and scheme != "media":
              ugopts = self._default_grabopts(cache=cache)
              ug = URLGrabber(progress_obj = self.callback,
-@@ -815,14 +996,9 @@ class YumRepository(Repository, config.RepoConf):
+@@ -815,14 +997,9 @@ class YumRepository(Repository, config.RepoConf):
                                      range=(start, end),
                                      )
              except URLGrabError, e:
@@ -197414,7 +197497,7 @@ index e5e9ece..2e4fcd9 100644
  
  
          else:
-@@ -835,19 +1011,19 @@ class YumRepository(Repository, config.RepoConf):
+@@ -835,19 +1012,19 @@ class YumRepository(Repository, config.RepoConf):
                                             reget = reget,
                                             checkfunc=checkfunc,
                                             http_headers=headers,
@@ -197441,7 +197524,7 @@ index e5e9ece..2e4fcd9 100644
          remote = package.relativepath
          local = package.localPkg()
          basepath = package.basepath
-@@ -857,15 +1033,30 @@ class YumRepository(Repository, config.RepoConf):
+@@ -857,15 +1034,30 @@ class YumRepository(Repository, config.RepoConf):
                  return local
              misc.unlink_f(local)
  
@@ -197473,7 +197556,7 @@ index e5e9ece..2e4fcd9 100644
      def getHeader(self, package, checkfunc = None, reget = 'simple',
              cache = True):
  
-@@ -933,7 +1124,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -933,7 +1125,7 @@ class YumRepository(Repository, config.RepoConf):
              self._metadataCurrent = False
          return self._metadataCurrent
  
@@ -197482,7 +197565,7 @@ index e5e9ece..2e4fcd9 100644
          """check if any file is older than a certain amount of time. Used for
             the cachecookie and the mirrorlist
             return True if w/i the expiration time limit
-@@ -943,6 +1134,24 @@ class YumRepository(Repository, config.RepoConf):
+@@ -943,6 +1135,24 @@ class YumRepository(Repository, config.RepoConf):
             file. If any of them are newer then invalidate the cache
             """
  
@@ -197507,7 +197590,7 @@ index e5e9ece..2e4fcd9 100644
          # -1 is special and should never get refreshed
          if expiration_time == -1 and os.path.exists(myfile):
              return True
-@@ -991,7 +1200,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -991,7 +1201,7 @@ class YumRepository(Repository, config.RepoConf):
      def _cachingRepoXML(self, local):
          """ Should we cache the current repomd.xml """
          if self.cache and not os.path.exists(local):
@@ -197516,7 +197599,7 @@ index e5e9ece..2e4fcd9 100644
          if self.cache or self.metadataCurrent():
              return True
          return False
-@@ -1020,7 +1229,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1020,7 +1230,7 @@ class YumRepository(Repository, config.RepoConf):
              if grab_can_fail:
                  return None
              raise Errors.RepoError, 'Error downloading file %s: %s' % (local, e)
@@ -197525,7 +197608,7 @@ index e5e9ece..2e4fcd9 100644
              misc.unlink_f(tfname)
              if grab_can_fail:
                  return None
-@@ -1047,7 +1256,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1047,7 +1257,7 @@ class YumRepository(Repository, config.RepoConf):
                  parse_can_fail = 'old_repo_XML' in self._oldRepoMDData
              if parse_can_fail:
                  return None
@@ -197534,7 +197617,7 @@ index e5e9ece..2e4fcd9 100644
  
      def _saveOldRepoXML(self, local):
          """ If we have an older repomd.xml file available, save it out. """
-@@ -1074,7 +1283,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1074,7 +1284,7 @@ class YumRepository(Repository, config.RepoConf):
          #  We still want the old data, so we don't download twice. So we
          # pretend everything is good until the revert.
          if not self.timestamp_check:
@@ -197543,7 +197626,7 @@ index e5e9ece..2e4fcd9 100644
  
          if 'old_repo_XML' not in self._oldRepoMDData:
              self._oldRepoMDData = {}
-@@ -1250,7 +1459,6 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1250,7 +1460,6 @@ class YumRepository(Repository, config.RepoConf):
              self._revertOldRepoXML()
              return False
  
@@ -197551,7 +197634,7 @@ index e5e9ece..2e4fcd9 100644
          if caching:
              return False # Skip any work.
  
-@@ -1260,6 +1468,9 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1260,6 +1469,9 @@ class YumRepository(Repository, config.RepoConf):
          return True
  
      def _check_db_version(self, mdtype, repoXML=None):
@@ -197561,7 +197644,7 @@ index e5e9ece..2e4fcd9 100644
          if repoXML is None:
              repoXML = self.repoXML
          if mdtype in repoXML.repoData:
-@@ -1277,11 +1488,11 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1277,11 +1489,11 @@ class YumRepository(Repository, config.RepoConf):
              return None
  
          if not file_check:
@@ -197576,7 +197659,7 @@ index e5e9ece..2e4fcd9 100644
              if not os.path.exists(local):
                  local = misc.decompress(local, fn_only=True)
                  compressed = True
-@@ -1302,6 +1513,17 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1302,6 +1514,17 @@ class YumRepository(Repository, config.RepoConf):
              into the delete list, this means metadata can change filename
              without us leaking it. """
  
@@ -197594,7 +197677,7 @@ index e5e9ece..2e4fcd9 100644
          def _mdtype_eq(omdtype, odata, nmdtype, ndata):
              """ Check if two returns from _get_mdtype_data() are equal. """
              if ndata is None:
-@@ -1321,6 +1543,14 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1321,6 +1544,14 @@ class YumRepository(Repository, config.RepoConf):
              return True
  
          all_mdtypes = self.retrieved.keys()
@@ -197609,7 +197692,7 @@ index e5e9ece..2e4fcd9 100644
          if mdtypes is None:
              mdtypes = all_mdtypes
  
-@@ -1333,8 +1563,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1333,8 +1564,7 @@ class YumRepository(Repository, config.RepoConf):
  
          # Inited twice atm. ... sue me
          self._oldRepoMDData['new_MD_files'] = []
@@ -197619,7 +197702,7 @@ index e5e9ece..2e4fcd9 100644
          for mdtype in all_mdtypes:
              (nmdtype, ndata) = self._get_mdtype_data(mdtype)
  
-@@ -1371,43 +1600,16 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1371,43 +1601,16 @@ class YumRepository(Repository, config.RepoConf):
              # No old repomd data, but we might still have uncompressed MD
              if self._groupCheckDataMDValid(ndata, nmdtype, mdtype):
                  continue
@@ -197668,7 +197751,7 @@ index e5e9ece..2e4fcd9 100644
  
      def _groupLoadRepoXML(self, text=None, mdtypes=None):
          """ Retrieve the new repomd.xml from the repository, then check it
-@@ -1421,7 +1623,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1421,7 +1624,7 @@ class YumRepository(Repository, config.RepoConf):
              self._commonRetrieveDataMD(mdtypes)
  
      def _mdpolicy2mdtypes(self):
@@ -197677,7 +197760,7 @@ index e5e9ece..2e4fcd9 100644
                       'group:primary' : ['primary'],
                       'group:small'   : ["primary", "updateinfo"],
                       'group:main'    : ["primary", "group", "filelists",
-@@ -1436,6 +1638,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1436,6 +1639,7 @@ class YumRepository(Repository, config.RepoConf):
          if not mdtypes or 'group:all' in mdtypes:
              mdtypes = None
          else:
@@ -197685,7 +197768,7 @@ index e5e9ece..2e4fcd9 100644
              mdtypes = sorted(list(mdtypes))
          return mdtypes
  
-@@ -1446,17 +1649,12 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1446,17 +1650,12 @@ class YumRepository(Repository, config.RepoConf):
          except KeyboardInterrupt:
              self._revertOldRepoXML() # Undo metadata cookie?
              raise
@@ -197705,7 +197788,7 @@ index e5e9ece..2e4fcd9 100644
          return self._repoXML
  
  
-@@ -1480,7 +1678,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1480,7 +1679,7 @@ class YumRepository(Repository, config.RepoConf):
                  result = self._getFile(relative='repodata/repomd.xml.asc',
                                         copy_local=1,
                                         local = sigfile,
@@ -197714,7 +197797,7 @@ index e5e9ece..2e4fcd9 100644
                                         reget=None,
                                         checkfunc=None,
                                         cache=self.http_caching == 'all',
-@@ -1508,6 +1706,18 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1508,6 +1707,18 @@ class YumRepository(Repository, config.RepoConf):
              raise URLGrabError(-1, 'repomd.xml does not match metalink for %s' %
                                 self)
  
@@ -197733,7 +197816,7 @@ index e5e9ece..2e4fcd9 100644
  
      def checkMD(self, fn, mdtype, openchecksum=False):
          """check the metadata type against its checksum"""
-@@ -1537,6 +1747,16 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1537,6 +1748,16 @@ class YumRepository(Repository, config.RepoConf):
          if size is not None:
              size = int(size)
  
@@ -197750,7 +197833,7 @@ index e5e9ece..2e4fcd9 100644
          try: # get the local checksum
              l_csum = self._checksum(r_ctype, file, datasize=size)
          except Errors.RepoError, e:
-@@ -1545,21 +1765,20 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1545,21 +1766,20 @@ class YumRepository(Repository, config.RepoConf):
              raise URLGrabError(-3, 'Error performing checksum')
  
          if l_csum == r_csum:
@@ -197774,7 +197857,7 @@ index e5e9ece..2e4fcd9 100644
          """ Internal function, use .retrieveMD() from outside yum. """
          #  Note that this can raise Errors.RepoMDError if mdtype doesn't exist
          # for this repo.
-@@ -1580,15 +1799,19 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1580,15 +1800,19 @@ class YumRepository(Repository, config.RepoConf):
                  try:
                      self.checkMD(local, mdtype)
                  except URLGrabError, e:
@@ -197795,7 +197878,7 @@ index e5e9ece..2e4fcd9 100644
  
          if (os.path.exists(local) or
              self._preload_md_from_system_cache(os.path.basename(local))):
-@@ -1597,15 +1820,22 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1597,15 +1821,22 @@ class YumRepository(Repository, config.RepoConf):
                  return local # it's the same return the local one
  
          try:
@@ -197823,7 +197906,7 @@ index e5e9ece..2e4fcd9 100644
              local = self._getFile(relative=remote,
                                    local=local, 
                                    copy_local=1,
-@@ -1613,8 +1843,9 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1613,8 +1844,9 @@ class YumRepository(Repository, config.RepoConf):
                                    checkfunc=checkfunc, 
                                    text=text,
                                    cache=self.http_caching == 'all',
@@ -197835,7 +197918,7 @@ index e5e9ece..2e4fcd9 100644
              if retrieve_can_fail:
                  return None
              raise
-@@ -1622,9 +1853,8 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1622,9 +1854,8 @@ class YumRepository(Repository, config.RepoConf):
              if retrieve_can_fail:
                  return None
              raise Errors.RepoError, \
@@ -197846,7 +197929,7 @@ index e5e9ece..2e4fcd9 100644
              return local
  
  
-@@ -1646,13 +1876,21 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1646,13 +1877,21 @@ class YumRepository(Repository, config.RepoConf):
  
      def getGroups(self):
          """gets groups and returns group file path for the repository, if there
@@ -197871,7 +197954,7 @@ index e5e9ece..2e4fcd9 100644
          self._callbacks_changed = True
  
      def setFailureObj(self, failure_obj):
-@@ -1681,7 +1919,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1681,7 +1920,7 @@ class YumRepository(Repository, config.RepoConf):
                  print "Could not read mirrorlist %s, error was \n%s" %(url, e)
                  content = []
              for line in content:
@@ -197880,7 +197963,7 @@ index e5e9ece..2e4fcd9 100644
                      continue
                  mirror = line.rstrip() # no more trailing \n's
                  mirror = mirror.replace('$ARCH', '$BASEARCH')
-@@ -1701,7 +1939,8 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1701,7 +1940,8 @@ class YumRepository(Repository, config.RepoConf):
          fo = None
  
          cacheok = False
@@ -197890,7 +197973,7 @@ index e5e9ece..2e4fcd9 100644
              cacheok = True
              fo = open(self.mirrorlist_file, 'r')
              url = 'file://' + self.mirrorlist_file # just to keep self._readMirrorList(fo,url) happy
-@@ -1713,7 +1952,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1713,7 +1953,7 @@ class YumRepository(Repository, config.RepoConf):
              ugopts = self._default_grabopts()
              try:
                  fo = urlgrabber.grabber.urlopen(url, **ugopts)
@@ -197899,7 +197982,7 @@ index e5e9ece..2e4fcd9 100644
                  print "Could not retrieve mirrorlist %s error was\n%s: %s" % (url, e.args[0], misc.to_unicode(e.args[1]))
                  fo = None
  
-@@ -1740,7 +1979,11 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1740,7 +1980,11 @@ class YumRepository(Repository, config.RepoConf):
          if os.path.exists(destfn):
              if os.stat(fn)[stat.ST_CTIME] <= os.stat(destfn)[stat.ST_CTIME]:
                  return False
@@ -197912,7 +197995,7 @@ index e5e9ece..2e4fcd9 100644
          return True
  
      def _preload_file_from_system_cache(self, filename, subdir='',
-@@ -1877,7 +2120,7 @@ def getMirrorList(mirrorlist, pdict = None):
+@@ -1877,7 +2121,7 @@ def getMirrorList(mirrorlist, pdict = None):
  
      try:
          fo = urlresolver.urlopen(url, proxies=pdict)
@@ -197922,7 +198005,7 @@ index e5e9ece..2e4fcd9 100644
          fo = None
  
 diff --git a/yumcommands.py b/yumcommands.py
-index 4dcbea7..0407c92 100644
+index 4dcbea7..700e76c 100644
 --- a/yumcommands.py
 +++ b/yumcommands.py
 @@ -13,6 +13,7 @@
@@ -198139,7 +198222,7 @@ index 4dcbea7..0407c92 100644
      """
      if base.repos.listEnabled():
          return
-@@ -152,113 +255,305 @@ def checkEnabledRepo(base, possible_local_files=[]):
+@@ -152,113 +255,296 @@ def checkEnabledRepo(base, possible_local_files=[]):
      raise cli.CliError
  
  class YumCommand:
@@ -198323,12 +198406,11 @@ index 4dcbea7..0407c92 100644
 +            2 = we've got work yet to do, onto the next stage
 +        """
          self.doneCommand(base, _("Setting up Install Process"))
-         try:
+-        try:
 -            return base.installPkgs(extcmds)
-+            return base.installPkgs(extcmds, basecmd=basecmd)
-         except yum.Errors.YumBaseError, e:
+-        except yum.Errors.YumBaseError, e:
 -            return 1, [str(e)]
-+            return 1, [exception2msg(e)]
++        return base.installPkgs(extcmds, basecmd=basecmd)
 +
  
  class UpdateCommand(YumCommand):
@@ -198387,14 +198469,13 @@ index 4dcbea7..0407c92 100644
 +            2 = we've got work yet to do, onto the next stage
 +        """
          self.doneCommand(base, _("Setting up Update Process"))
-         try:
+-        try:
 -            return base.updatePkgs(extcmds, update_to=(basecmd == 'update-to'))
-+            ret = base.updatePkgs(extcmds, update_to=(basecmd == 'update-to'))
-+            updateinfo.remove_txmbrs(base)
-+            return ret
-         except yum.Errors.YumBaseError, e:
+-        except yum.Errors.YumBaseError, e:
 -            return 1, [str(e)]
-+            return 1, [exception2msg(e)]
++        ret = base.updatePkgs(extcmds, update_to=(basecmd == 'update-to'))
++        updateinfo.remove_txmbrs(base)
++        return ret
  
  class DistroSyncCommand(YumCommand):
 +    """A class containing methods needed by the cli to execute the
@@ -198451,19 +198532,19 @@ index 4dcbea7..0407c92 100644
 +            2 = we've got work yet to do, onto the next stage
 +        """
          self.doneCommand(base, _("Setting up Distribution Synchronization Process"))
-         try:
-             base.conf.obsoletes = 1
+-        try:
+-            base.conf.obsoletes = 1
 -            return base.distroSyncPkgs(extcmds)
-+            ret = base.distroSyncPkgs(extcmds)
-+            updateinfo.remove_txmbrs(base)
-+            return ret
-         except yum.Errors.YumBaseError, e:
+-        except yum.Errors.YumBaseError, e:
 -            return 1, [str(e)]
-+            return 1, [exception2msg(e)]
++        base.conf.obsoletes = 1
++        ret = base.distroSyncPkgs(extcmds)
++        updateinfo.remove_txmbrs(base)
++        return ret
  
  def _add_pkg_simple_list_lens(data, pkg, indent=''):
      """ Get the length of each pkg's column. Add that to data.
-@@ -289,21 +584,63 @@ def _list_cmd_calc_columns(base, ypl):
+@@ -289,22 +575,62 @@ def _list_cmd_calc_columns(base, ypl):
      return (-columns[0], -columns[1], -columns[2])
  
  class InfoCommand(YumCommand):
@@ -198495,6 +198576,11 @@ index 4dcbea7..0407c92 100644
          return _("Display details about a package or group of packages")
  
 -    def doCommand(self, base, basecmd, extcmds):
+-        try:
+-            highlight = base.term.MODE['bold']
+-            ypl = base.returnPkgLists(extcmds, installed_available=highlight)
+-        except yum.Errors.YumBaseError, e:
+-            return 1, [str(e)]
 +    def doCommand(self, base, basecmd, extcmds, repoid=None):
 +        """Execute this command.
 +
@@ -198512,12 +198598,11 @@ index 4dcbea7..0407c92 100644
 +
 +        if extcmds and extcmds[0] in ('updates', 'obsoletes'):
 +            updateinfo.exclude_updates(base)
-+        else:
+         else:
 +            updateinfo.exclude_all(base)
 +
-         try:
-             highlight = base.term.MODE['bold']
--            ypl = base.returnPkgLists(extcmds, installed_available=highlight)
++        if True: # Try, YumBase...
++            highlight = base.term.MODE['bold']
 +            #  If we are doing: "yum info installed blah" don't do the highlight
 +            # because the usability of not accessing the repos. is still higher
 +            # than providing colour for a single line. Usable updatesd/etc. FTW.
@@ -198525,13 +198610,11 @@ index 4dcbea7..0407c92 100644
 +                highlight = False
 +            ypl = base.returnPkgLists(extcmds, installed_available=highlight,
 +                                      repoid=repoid)
-         except yum.Errors.YumBaseError, e:
--            return 1, [str(e)]
-+            return 1, [exception2msg(e)]
-         else:
++
              update_pkgs = {}
              inst_pkgs   = {}
-@@ -341,6 +678,7 @@ class InfoCommand(YumCommand):
+             local_pkgs  = {}
+@@ -341,6 +667,7 @@ class InfoCommand(YumCommand):
                          local_pkgs[(po.name, po.arch)] = po
  
              # Output the packages:
@@ -198539,7 +198622,7 @@ index 4dcbea7..0407c92 100644
              clio = base.conf.color_list_installed_older
              clin = base.conf.color_list_installed_newer
              clir = base.conf.color_list_installed_reinstall
-@@ -348,7 +686,9 @@ class InfoCommand(YumCommand):
+@@ -348,7 +675,9 @@ class InfoCommand(YumCommand):
              rip = base.listPkgs(ypl.installed, _('Installed Packages'), basecmd,
                                  highlight_na=update_pkgs, columns=columns,
                                  highlight_modes={'>' : clio, '<' : clin,
@@ -198549,7 +198632,7 @@ index 4dcbea7..0407c92 100644
              clau = base.conf.color_list_available_upgrade
              clad = base.conf.color_list_available_downgrade
              clar = base.conf.color_list_available_reinstall
-@@ -356,6 +696,7 @@ class InfoCommand(YumCommand):
+@@ -356,6 +685,7 @@ class InfoCommand(YumCommand):
              rap = base.listPkgs(ypl.available, _('Available Packages'), basecmd,
                                  highlight_na=inst_pkgs, columns=columns,
                                  highlight_modes={'<' : clau, '>' : clad,
@@ -198557,7 +198640,7 @@ index 4dcbea7..0407c92 100644
                                                   '=' : clar, 'not in' : clai})
              rep = base.listPkgs(ypl.extras, _('Extra Packages'), basecmd,
                                  columns=columns)
-@@ -374,7 +715,7 @@ class InfoCommand(YumCommand):
+@@ -374,7 +704,7 @@ class InfoCommand(YumCommand):
                  for obtup in sorted(ypl.obsoletesTuples,
                                      key=operator.itemgetter(0)):
                      base.updatesObsoletesList(obtup, 'obsoletes',
@@ -198566,7 +198649,7 @@ index 4dcbea7..0407c92 100644
              else:
                  rop = base.listPkgs(ypl.obsoletes, _('Obsoleting Packages'),
                                      basecmd, columns=columns)
-@@ -389,45 +730,163 @@ class InfoCommand(YumCommand):
+@@ -389,45 +719,160 @@ class InfoCommand(YumCommand):
              return 0, []
  
      def needTs(self, base, basecmd, extcmds):
@@ -198701,12 +198784,11 @@ index 4dcbea7..0407c92 100644
 +                    extcmds.append(pkg)
 +
          self.doneCommand(base, _("Setting up Remove Process"))
-         try:
+-        try:
 -            return base.erasePkgs(extcmds)
-+            ret = base.erasePkgs(extcmds, pos=pos, basecmd=basecmd)
-         except yum.Errors.YumBaseError, e:
+-        except yum.Errors.YumBaseError, e:
 -            return 1, [str(e)]
-+            ret = (1, [exception2msg(e)])
++        ret = base.erasePkgs(extcmds, pos=pos, basecmd=basecmd)
 +
 +        return ret
  
@@ -198733,7 +198815,7 @@ index 4dcbea7..0407c92 100644
          return True
  
   
-@@ -442,12 +901,25 @@ class GroupsCommand(YumCommand):
+@@ -442,12 +887,25 @@ class GroupsCommand(YumCommand):
                         'groupinfo'    : 'info'}
  
      def getNames(self):
@@ -198759,16 +198841,16 @@ index 4dcbea7..0407c92 100644
          return _("Display, or use, the groups information")
      
      def _grp_setup_doCommand(self, base):
-@@ -459,7 +931,7 @@ class GroupsCommand(YumCommand):
+@@ -459,7 +917,7 @@ class GroupsCommand(YumCommand):
          except yum.Errors.GroupsError:
              return 1, [_('No Groups on which to run command')]
          except yum.Errors.YumBaseError, e:
 -            return 1, [str(e)]
-+            return 1, [exception2msg(e)]
++            raise
  
      def _grp_cmd(self, basecmd, extcmds):
          if basecmd in self.direct_commands:
-@@ -470,6 +942,10 @@ class GroupsCommand(YumCommand):
+@@ -470,6 +928,10 @@ class GroupsCommand(YumCommand):
          else:
              cmd = 'summary'
  
@@ -198779,7 +198861,7 @@ index 4dcbea7..0407c92 100644
          remap = {'update' : 'upgrade',
                   'erase' : 'remove',
                   'mark-erase' : 'mark-remove',
-@@ -479,32 +955,76 @@ class GroupsCommand(YumCommand):
+@@ -479,32 +941,76 @@ class GroupsCommand(YumCommand):
          return cmd, extcmds
  
      def doCheck(self, base, basecmd, extcmds):
@@ -198866,7 +198948,14 @@ index 4dcbea7..0407c92 100644
          cmd, extcmds = self._grp_cmd(basecmd, extcmds)
  
          self._grp_setup_doCommand(base)
-@@ -520,126 +1040,538 @@ class GroupsCommand(YumCommand):
+@@ -514,136 +1020,546 @@ class GroupsCommand(YumCommand):
+         if cmd == 'list':
+             return base.returnGroupLists(extcmds)
+ 
+-        try:
++        if True: # Try, YumBase...
+             if cmd == 'info':
+                 return base.returnGroupInfo(extcmds)
              if cmd == 'install':
                  return base.installGroups(extcmds)
              if cmd == 'upgrade':
@@ -198877,6 +198966,8 @@ index 4dcbea7..0407c92 100644
              if cmd == 'remove':
                  return base.removeGroups(extcmds)
  
+-        except yum.Errors.YumBaseError, e:
+-            return 1, [str(e)]
 +            if cmd == 'mark-install':
 +                gRG = base._groupReturnGroups(extcmds,ignore_case=False)
 +                igrps, grps, ievgrps, evgrps = gRG
@@ -198884,7 +198975,10 @@ index 4dcbea7..0407c92 100644
 +                    base.igroups.add_environment(evgrp.environmentid,
 +                                                 evgrp.allgroups)
 +                for grp in grps:
-+                    base.igroups.add_group(grp.groupid, grp.packages)
++                    pkg_names = set() # Only see names that are installed.
++                    for pkg in base.rpmdb.searchNames(grp.packages):
++                        pkg_names.add(pkg.name)
++                    base.igroups.add_group(grp.groupid, pkg_names)
 +                base.igroups.save()
 +                return 0, ['Marked install: ' + ','.join(extcmds)]
 +
@@ -198989,13 +199083,17 @@ index 4dcbea7..0407c92 100644
 +                def _convert_grp(grp):
 +                    if not grp.installed:
 +                        return
-+                    pkg_names = grp.packages
-+                    base.igroups.add_group(grp.groupid, pkg_names)
-+
++                    pkg_names = []
 +                    for pkg in base.rpmdb.searchNames(pkg_names):
 +                        if 'group_member' in pkg.yumdb_info:
 +                            continue
 +                        pkg.yumdb_info.group_member = grp.groupid
++                        pkg_names.append(pkg.name)
++
++                    #  We only mark the packages installed as a known part of
++                    # the group. This way "group update" will work and install
++                    # any remaining packages, as it would before the conversion.
++                    base.igroups.add_group(grp.groupid, pkg_names)
 +
 +                # Blank everything.
 +                for gid in base.igroups.groups.keys():
@@ -199040,11 +199138,6 @@ index 4dcbea7..0407c92 100644
 +                    base.igroups.del_group(grp.gid)
 +                base.igroups.save()
 +                return 0, ['Marked remove: ' + ','.join(extcmds)]
-+
-+
-         except yum.Errors.YumBaseError, e:
--            return 1, [str(e)]
-+            return 1, [exception2msg(e)]
  
  
      def needTs(self, base, basecmd, extcmds):
@@ -199150,13 +199243,14 @@ index 4dcbea7..0407c92 100644
 +        """
          base.logger.debug(_("Making cache files for all metadata files."))
          base.logger.debug(_("This may take a while depending on the speed of this computer"))
+-        try:
 +
 +        # Fast == don't download any extra MD
 +        fast = False
 +        if extcmds and extcmds[0] == 'fast':
 +            fast = True
 +
-         try:
++        if True: # Try, YumBase...
              for repo in base.repos.findRepos('*'):
                  repo.metadata_expire = 0
 -                repo.mdpolicy = "group:all"
@@ -199198,9 +199292,8 @@ index 4dcbea7..0407c92 100644
 +                                             fname_map[MD],
 +                                             cached=repo.cache)
  
-         except yum.Errors.YumBaseError, e:
+-        except yum.Errors.YumBaseError, e:
 -            return 1, [str(e)]
-+            return 1, [exception2msg(e)]
          return 0, [_('Metadata Cache Created')]
  
      def needTs(self, base, basecmd, extcmds):
@@ -199281,9 +199374,13 @@ index 4dcbea7..0407c92 100644
 +        """
          return False
  
+-class ProvidesCommand(YumCommand):
+-    def getNames(self):
+-        return ['provides', 'whatprovides']
 +    def cacheRequirement(self, base, basecmd, extcmds):
 +        """Return the cache requirements for the remote repos.
-+
+ 
+-    def getUsage(self):
 +        :param base: a :class:`yum.Yumbase` object
 +        :param basecmd: the name of the command
 +        :param extcmds: a list of arguments passed to *basecmd*
@@ -199292,20 +199389,20 @@ index 4dcbea7..0407c92 100644
 +        return 'read-only:past'
 +
 +
- class ProvidesCommand(YumCommand):
++class ProvidesCommand(YumCommand):
 +    """A class containing methods needed by the cli to execute the
 +    provides command.
 +    """
 +
-     def getNames(self):
++    def getNames(self):
 +        """Return a list containing the names of this command.  This
 +        command can be called from the command line by using any of these names.
 +
 +        :return: a list containing the names of this command
 +        """
-         return ['provides', 'whatprovides']
- 
-     def getUsage(self):
++        return ['provides', 'whatprovides']
++
++    def getUsage(self):
 +        """Return a usage string for this command.
 +
 +        :return: a usage string for this command
@@ -199344,12 +199441,12 @@ index 4dcbea7..0407c92 100644
 +            2 = we've got work yet to do, onto the next stage
 +        """
          base.logger.debug("Searching Packages: ")
-         try:
-+            updateinfo.exclude_updates(base)
-             return base.provides(extcmds)
-         except yum.Errors.YumBaseError, e:
+-        try:
+-            return base.provides(extcmds)
+-        except yum.Errors.YumBaseError, e:
 -            return 1, [str(e)]
-+            return 1, [exception2msg(e)]
++        updateinfo.exclude_updates(base)
++        return base.provides(extcmds)
 +
 +    def cacheRequirement(self, base, basecmd, extcmds):
 +        """Return the cache requirements for the remote repos.
@@ -199417,22 +199514,27 @@ index 4dcbea7..0407c92 100644
          obscmds = ['obsoletes'] + extcmds
          base.extcmds.insert(0, 'updates')
          result = 0
-@@ -675,162 +1607,492 @@ class CheckUpdateCommand(YumCommand):
+-        try:
++        if True:
+             ypl = base.returnPkgLists(extcmds)
+             if (base.conf.obsoletes or
+                 base.verbose_logger.isEnabledFor(logginglevels.DEBUG_3)):
+@@ -675,162 +1591,471 @@ class CheckUpdateCommand(YumCommand):
                      base.updatesObsoletesList(obtup, 'obsoletes',
                                                columns=columns)
                  result = 100
+-        except yum.Errors.YumBaseError, e:
+-            return 1, [str(e)]
+-        else:
+-            return result, []
 +
 +            # Add check_running_kernel call, if updateinfo is available.
 +            if updateinfo._repos_downloaded(base.repos.listEnabled()):
 +                def _msg(x):
 +                    base.verbose_logger.info("%s", x)
 +                updateinfo._check_running_kernel(base, base.upinfo, _msg)
-         except yum.Errors.YumBaseError, e:
--            return 1, [str(e)]
-+            return 1, [exception2msg(e)]
-         else:
-             return result, []
- 
++        return result, []
++
 +    def cacheRequirement(self, base, basecmd, extcmds):
 +        """Return the cache requirements for the remote repos.
 +
@@ -199443,7 +199545,7 @@ index 4dcbea7..0407c92 100644
 +        """
 +        return 'read-only:future'
 +
-+
+ 
  class SearchCommand(YumCommand):
 +    """A class containing methods needed by the cli to execute the
 +    search command.
@@ -199496,12 +199598,12 @@ index 4dcbea7..0407c92 100644
 +            2 = we've got work yet to do, onto the next stage
 +        """
          base.logger.debug(_("Searching Packages: "))
-         try:
-+            updateinfo.exclude_updates(base)
-             return base.search(extcmds)
-         except yum.Errors.YumBaseError, e:
+-        try:
+-            return base.search(extcmds)
+-        except yum.Errors.YumBaseError, e:
 -            return 1, [str(e)]
-+            return 1, [exception2msg(e)]
++        updateinfo.exclude_updates(base)
++        return base.search(extcmds)
  
      def needTs(self, base, basecmd, extcmds):
 +        """Return whether a transaction set must be set up before this
@@ -199581,14 +199683,13 @@ index 4dcbea7..0407c92 100644
 +        """
          base.conf.obsoletes = 1
          self.doneCommand(base, _("Setting up Upgrade Process"))
-         try:
+-        try:
 -            return base.updatePkgs(extcmds, update_to=(basecmd == 'upgrade-to'))
-+            ret = base.updatePkgs(extcmds, update_to=(basecmd == 'upgrade-to'))
-+            updateinfo.remove_txmbrs(base)
-+            return ret
-         except yum.Errors.YumBaseError, e:
+-        except yum.Errors.YumBaseError, e:
 -            return 1, [str(e)]
-+            return 1, [exception2msg(e)]
++        ret = base.updatePkgs(extcmds, update_to=(basecmd == 'upgrade-to'))
++        updateinfo.remove_txmbrs(base)
++        return ret
  
  class LocalInstallCommand(YumCommand):
 +    """A class containing methods needed by the cli to execute the
@@ -199652,11 +199753,11 @@ index 4dcbea7..0407c92 100644
          self.doneCommand(base, _("Setting up Local Package Process"))
  
          updateonly = basecmd == 'localupdate'
-         try:
-             return base.localInstall(filelist=extcmds, updateonly=updateonly)
-         except yum.Errors.YumBaseError, e:
+-        try:
+-            return base.localInstall(filelist=extcmds, updateonly=updateonly)
+-        except yum.Errors.YumBaseError, e:
 -            return 1, [str(e)]
-+            return 1, [exception2msg(e)]
++        return base.localInstall(filelist=extcmds, updateonly=updateonly)
  
      def needTs(self, base, basecmd, extcmds):
 +        """Return whether a transaction set must be set up before this
@@ -199716,12 +199817,12 @@ index 4dcbea7..0407c92 100644
 +            2 = we've got work yet to do, onto the next stage
 +        """
          base.logger.debug(_("Searching Packages for Dependency:"))
-         try:
-+            updateinfo.exclude_updates(base)
-             return base.resolveDepCli(extcmds)
-         except yum.Errors.YumBaseError, e:
+-        try:
+-            return base.resolveDepCli(extcmds)
+-        except yum.Errors.YumBaseError, e:
 -            return 1, [str(e)]
-+            return 1, [exception2msg(e)]
++        updateinfo.exclude_updates(base)
++        return base.resolveDepCli(extcmds)
 +
 +    def cacheRequirement(self, base, basecmd, extcmds):
 +        """Return the cache requirements for the remote repos.
@@ -199786,11 +199887,11 @@ index 4dcbea7..0407c92 100644
 +            2 = we've got work yet to do, onto the next stage
 +        """
          self.doneCommand(base, _('Setting up Yum Shell'))
-         try:
-             return base.doShell()
-         except yum.Errors.YumBaseError, e:
+-        try:
+-            return base.doShell()
+-        except yum.Errors.YumBaseError, e:
 -            return 1, [str(e)]
-+            return 1, [exception2msg(e)]
++        return base.doShell()
  
      def needTs(self, base, basecmd, extcmds):
 +        """Return whether a transaction set must be set up before this
@@ -199857,12 +199958,12 @@ index 4dcbea7..0407c92 100644
 +            2 = we've got work yet to do, onto the next stage
 +        """
          self.doneCommand(base, _("Finding dependencies: "))
-         try:
-+            updateinfo.exclude_updates(base)
-             return base.deplist(extcmds)
-         except yum.Errors.YumBaseError, e:
+-        try:
+-            return base.deplist(extcmds)
+-        except yum.Errors.YumBaseError, e:
 -            return 1, [str(e)]
-+            return 1, [exception2msg(e)]
++        updateinfo.exclude_updates(base)
++        return base.deplist(extcmds)
 +
 +    def cacheRequirement(self, base, basecmd, extcmds):
 +        """Return the cache requirements for the remote repos.
@@ -199920,7 +200021,7 @@ index 4dcbea7..0407c92 100644
          def _repo_size(repo):
              ret = 0
              for pkg in repo.sack.returnPackages():
-@@ -857,7 +2119,10 @@ class RepoListCommand(YumCommand):
+@@ -857,7 +2082,10 @@ class RepoListCommand(YumCommand):
              arg = 'enabled'
          extcmds = map(lambda x: x.lower(), extcmds)
  
@@ -199932,7 +200033,7 @@ index 4dcbea7..0407c92 100644
          if arg != 'disabled' or extcmds:
              try:
                  # Setup so len(repo.sack) is correct
-@@ -866,6 +2131,13 @@ class RepoListCommand(YumCommand):
+@@ -866,6 +2094,13 @@ class RepoListCommand(YumCommand):
              except yum.Errors.RepoError:
                  if verbose:
                      raise
@@ -199946,7 +200047,7 @@ index 4dcbea7..0407c92 100644
  
          repos = base.repos.repos.values()
          repos.sort()
-@@ -924,111 +2196,108 @@ class RepoListCommand(YumCommand):
+@@ -924,111 +2159,108 @@ class RepoListCommand(YumCommand):
                  ui_enabled = dhibeg + _('disabled') + hiend
                  ui_endis_wid = utf8_width(_('disabled'))
  
@@ -200151,7 +200252,7 @@ index 4dcbea7..0407c92 100644
  
          if not verbose and cols:
              #  Work out the first (id) and last (enabled/disalbed/count),
-@@ -1088,21 +2357,64 @@ class RepoListCommand(YumCommand):
+@@ -1088,21 +2320,64 @@ class RepoListCommand(YumCommand):
          return 0, ['repolist: ' +to_unicode(locale.format("%d", tot_num, True))]
  
      def needTs(self, base, basecmd, extcmds):
@@ -200216,7 +200317,7 @@ index 4dcbea7..0407c92 100644
          if len(extcmds) == 0:
              base.usage()
              raise cli.CliError
-@@ -1147,28 +2459,85 @@ class HelpCommand(YumCommand):
+@@ -1147,79 +2422,219 @@ class HelpCommand(YumCommand):
          return help_output
  
      def doCommand(self, base, basecmd, extcmds):
@@ -200300,10 +200401,12 @@ index 4dcbea7..0407c92 100644
 +            2 = we've got work yet to do, onto the next stage
 +        """
          self.doneCommand(base, _("Setting up Reinstall Process"))
-         try:
-             return base.reinstallPkgs(extcmds)
-@@ -1177,49 +2546,139 @@ class ReInstallCommand(YumCommand):
-             return 1, [to_unicode(e)]
+-        try:
+-            return base.reinstallPkgs(extcmds)
+-            
+-        except yum.Errors.YumBaseError, e:
+-            return 1, [to_unicode(e)]
++        return base.reinstallPkgs(extcmds)
  
      def getSummary(self):
 +        """Return a one line summary of this command.
@@ -200374,11 +200477,11 @@ index 4dcbea7..0407c92 100644
 +            2 = we've got work yet to do, onto the next stage
 +        """
          self.doneCommand(base, _("Setting up Downgrade Process"))
-         try:
-             return base.downgradePkgs(extcmds)
-         except yum.Errors.YumBaseError, e:
+-        try:
+-            return base.downgradePkgs(extcmds)
+-        except yum.Errors.YumBaseError, e:
 -            return 1, [str(e)]
-+            return 1, [exception2msg(e)]
++        return base.downgradePkgs(extcmds)
  
      def getSummary(self):
 +        """Return a one line summary of this command.
@@ -200443,25 +200546,38 @@ index 4dcbea7..0407c92 100644
          vcmd = 'installed'
          if extcmds:
              vcmd = extcmds[0]
-@@ -1308,7 +2767,7 @@ class VersionCommand(YumCommand):
+@@ -1288,7 +2703,7 @@ class VersionCommand(YumCommand):
+         ba  = base.conf.yumvar['basearch']
+         cols = []
+         if vcmd in ('installed', 'all', 'group-installed', 'group-all'):
+-            try:
++            if True: # Try, YumBase...
+                 data = base.rpmdb.simpleVersion(not verbose, groups=groups)
+                 lastdbv = base.history.last()
+                 if lastdbv is not None:
+@@ -1307,10 +2722,9 @@ class VersionCommand(YumCommand):
+                         cols.append(("%s %s" % (_("Group-Installed:"), grp),
                                       str(data[2][grp])))
                          _append_repos(cols, data[3][grp])
-             except yum.Errors.YumBaseError, e:
+-            except yum.Errors.YumBaseError, e:
 -                return 1, [str(e)]
-+                return 1, [exception2msg(e)]
++
          if vcmd in ('available', 'all', 'group-available', 'group-all'):
-             try:
+-            try:
++            if True: # Try, YumBase...
                  data = base.pkgSack.simpleVersion(not verbose, groups=groups)
-@@ -1327,7 +2786,7 @@ class VersionCommand(YumCommand):
+                 if vcmd not in ('group-available', 'group-all'):
+                     cols.append(("%s %s/%s" % (_("Available:"), rel, ba),
+@@ -1326,8 +2740,6 @@ class VersionCommand(YumCommand):
+                                      str(data[2][grp])))
                          if verbose:
                              _append_repos(cols, data[3][grp])
-             except yum.Errors.YumBaseError, e:
+-            except yum.Errors.YumBaseError, e:
 -                return 1, [str(e)]
-+                return 1, [exception2msg(e)]
  
          data = {'rid' : {}, 'ver' : {}}
          for (rid, ver) in cols:
-@@ -1344,6 +2803,14 @@ class VersionCommand(YumCommand):
+@@ -1344,6 +2756,14 @@ class VersionCommand(YumCommand):
          return 0, ['version']
  
      def needTs(self, base, basecmd, extcmds):
@@ -200476,7 +200592,7 @@ index 4dcbea7..0407c92 100644
          vcmd = 'installed'
          if extcmds:
              vcmd = extcmds[0]
-@@ -1352,25 +2819,74 @@ class VersionCommand(YumCommand):
+@@ -1352,25 +2772,74 @@ class VersionCommand(YumCommand):
              return True
          return vcmd in ('available', 'all', 'group-available', 'group-all')
  
@@ -200552,7 +200668,7 @@ index 4dcbea7..0407c92 100644
              return 2, ["Repeating transaction %u" % (old.tid,)]
  
      def _hcmd_undo(self, base, extcmds):
-@@ -1426,12 +2942,57 @@ class HistoryCommand(YumCommand):
+@@ -1426,12 +2895,57 @@ class HistoryCommand(YumCommand):
      def _hcmd_new(self, base, extcmds):
          base.history._create_db_file()
  
@@ -200611,7 +200727,7 @@ index 4dcbea7..0407c92 100644
          if extcmds and extcmds[0] not in cmds:
              base.logger.critical(_('Invalid history sub-command, use: %s.'),
                                   ", ".join(cmds))
-@@ -1444,6 +3005,19 @@ class HistoryCommand(YumCommand):
+@@ -1444,6 +2958,19 @@ class HistoryCommand(YumCommand):
              raise cli.CliError
  
      def doCommand(self, base, basecmd, extcmds):
@@ -200631,7 +200747,7 @@ index 4dcbea7..0407c92 100644
          vcmd = 'list'
          if extcmds:
              vcmd = extcmds[0]
-@@ -1468,29 +3042,88 @@ class HistoryCommand(YumCommand):
+@@ -1468,29 +2995,88 @@ class HistoryCommand(YumCommand):
              ret = self._hcmd_rollback(base, extcmds)
          elif vcmd == 'new':
              ret = self._hcmd_new(base, extcmds)
@@ -200720,7 +200836,7 @@ index 4dcbea7..0407c92 100644
          chkcmd = 'all'
          if extcmds:
              chkcmd = extcmds
-@@ -1505,24 +3138,171 @@ class CheckRpmdbCommand(YumCommand):
+@@ -1505,33 +3091,983 @@ class CheckRpmdbCommand(YumCommand):
          return rc, ['%s %s' % (basecmd, chkcmd)]
  
      def needTs(self, base, basecmd, extcmds):
@@ -200894,8 +201010,12 @@ index 4dcbea7..0407c92 100644
 +
          self.doneCommand(base, _("loading transaction from %s") % load_file)
          
-         try:
-@@ -1533,5 +3313,809 @@ class LoadTransactionCommand(YumCommand):
+-        try:
+-            base.load_ts(load_file)
+-        except yum.Errors.YumBaseError, e:
+-            return 1, [to_unicode(e)]
++        base.load_ts(load_file)
+         return 2, [_('Transaction loaded from %s with %s members') % (load_file, len(base.tsInfo.getMembers()))]
  
  
      def needTs(self, base, basecmd, extcmds):
@@ -200910,8 +201030,8 @@ index 4dcbea7..0407c92 100644
 +        if not extcmds or os.path.isdir(extcmds[0]):
 +            return False
 +
-         return True
- 
++        return True
++
 +    def cacheRequirement(self, base, basecmd, extcmds):
 +        """Return the cache requirements for the remote repos.
 +
@@ -201299,8 +201419,8 @@ index 4dcbea7..0407c92 100644
 +        if cmd in ('info', 'list'):
 +            return InfoCommand().cacheRequirement(base, cmd, extcmds[2:])
 +
-+        return True
-+
+         return True
+ 
 +    def cacheRequirement(self, base, basecmd, extcmds):
 +        """Return the cache requirements for the remote repos.
 +
@@ -201606,6 +201726,8 @@ index 4dcbea7..0407c92 100644
 +        list_type = "available"
 +        if extcmds and extcmds[0] in ("updates","available","installed", "all"):
 +            list_type = extcmds.pop(0)
++            if filt_type is None:
++                extcmds, show_type, filt_type = self._parse_extcmds(extcmds)
 +
 +        if filt_type == "newpackage":
 +            # No filtering here, as we want what isn't installed...
@@ -201916,29 +202038,3 @@ index 9f79f4f..ac94f65 100755
      errcode = None
      if 'YUM_PROF' in os.environ:
          if os.environ['YUM_PROF'] == 'cprof':
-commit 31a4a3bcb48b67231dc0314d9ed2693eb1e41b6d
-Author: Zdenek Pavlas <zpavlas at redhat.com>
-Date:   Fri May 10 12:23:09 2013 +0200
-
-    same-mirror retry also on timeout.  BZ 853432
-    
-    We should be able to retry on timeouts, too.
-    Works around connection-limited ftpds, that
-    may block for too long.
-
-diff --git a/yum/yumRepo.py b/yum/yumRepo.py
-index 2e4fcd9..41d180e 100644
---- a/yum/yumRepo.py
-+++ b/yum/yumRepo.py
-@@ -631,8 +631,9 @@ class YumRepository(Repository, config.RepoConf):
-         def mirror_failure(obj):
-             action = {}
- 
--            # special handling of 503 errors
--            if getattr(obj.exception, 'code', 0) == 503:
-+            # timeouts and 503 errors may retry
-+            e = obj.exception
-+            if e.errno == 12 or getattr(e, 'code', 0) == 503:
-                 tries = getattr(obj, 'tries', self.retries)
-                 if tries <= self.retries - len(self.urls):
-                     # don't remove this mirror yet
diff --git a/yum.spec b/yum.spec
index 7b7de40..857b203 100644
--- a/yum.spec
+++ b/yum.spec
@@ -41,7 +41,7 @@ BuildRequires: bash-completion
 Summary: RPM package installer/updater/manager
 Name: yum
 Version: 3.4.3
-Release: 91%{?dist}
+Release: 92%{?dist}
 License: GPLv2+
 Group: System Environment/Base
 Source0: http://yum.baseurl.org/download/3.4/%{name}-%{version}.tar.gz
@@ -402,6 +402,14 @@ exit 0
 %endif
 
 %changelog
+* Tue May 21 2013 James Antill <james at fedoraproject.org> - 3.4.3-92
+- update to latest HEAD.
+- returnPackagesByDep() API fix (really old break).
+- Try to make groups conversion better.
+- progress.start: supply the default filename & url.  BZ 963023
+- drpm retry: add RPM sizes to total size.  BZ 959786
+- YumBaseError: safe str(e).  BZ 963698
+
 * Mon May 13 2013 Zdenek Pavlas <zpavlas at redhat.com> - 3.4.3-91
 - same-mirror retry also on timeout.  BZ 853432
 


More information about the scm-commits mailing list