[yum] Update to latest HEAD.

James Antill james at fedoraproject.org
Mon Nov 18 22:44:44 UTC 2013


commit 8aee42059778b168b41f3074936408bfa3adeced
Author: James Antill <james at and.org>
Date:   Mon Nov 18 17:45:06 2013 -0500

    Update to latest HEAD.
    
    - Add installed for groups pkg. lists on transaction output. BZ 1031374.
    - Add autocheck_running_kernel config. so people can turn it off.
    - Add upgrade_group_objects_upgrade config. so people can turn it off.
    - Add distupgrade command as alias for distro-sync, to be compat. with zypper.

 yum-HEAD.patch |  429 ++++++++++++++++++++++++++++++++------------------------
 yum.spec       |    9 +-
 2 files changed, 257 insertions(+), 181 deletions(-)
---
diff --git a/yum-HEAD.patch b/yum-HEAD.patch
index bb08096..76730b3 100644
--- a/yum-HEAD.patch
+++ b/yum-HEAD.patch
@@ -3475,7 +3475,7 @@ index 1a8202a..2cbdf72 100644
  http://yum.baseurl.org/wiki/Faq
  yum search yum
 diff --git a/docs/yum.conf.5 b/docs/yum.conf.5
-index 515aa73..53cef2e 100644
+index 515aa73..6fae41d 100644
 --- a/docs/yum.conf.5
 +++ b/docs/yum.conf.5
 @@ -64,7 +64,7 @@ options are: 'critical', 'emergency', 'error', 'warn' and 'debug'.
@@ -3592,7 +3592,7 @@ index 515aa73..53cef2e 100644
  
  .IP
  \fBgroupremove_leaf_only \fR
-@@ -215,6 +246,30 @@ of packages in groups will be installed when 'groupinstall' is called.
+@@ -215,6 +246,43 @@ of packages in groups will be installed when 'groupinstall' is called.
  Default is: default, mandatory
  
  .IP
@@ -3620,10 +3620,23 @@ index 515aa73..53cef2e 100644
 +Default is: compat
 +
 +.IP
++\fBupgrade_group_objects_upgrade\fR
++Either `0' or `1'. Set this to `0' to disable the automatic running of
++"group upgrade" when running the "upgrade" command, and group_command is set to
++"objects". Default is `1' (perform the operation).
++
++.IP
++\fBautocheck_running_kernel\fR
++Either `0' or `1'. Set this to `0' to disable the automatic checking of the
++running kernel against updateinfo ("yum updateinfo check-running-kernel"), in
++the "check-update" and "updateinfo summary" commands.
++Default is `1' (perform the check).
++
++.IP
  \fBinstallroot \fR
  Specifies an alternative installroot, relative to which all packages will be
  installed. 
-@@ -223,14 +278,21 @@ Command-line option: \fB\-\-installroot\fP
+@@ -223,14 +291,21 @@ Command-line option: \fB\-\-installroot\fP
  
  .IP
  \fBdistroverpkg\fR
@@ -3649,7 +3662,7 @@ index 515aa73..53cef2e 100644
  
  .IP
  \fBtsflags\fR
-@@ -291,6 +353,16 @@ the maximum available bandwidth.
+@@ -291,6 +366,16 @@ the maximum available bandwidth.
  
  Set to `0' to disable bandwidth throttling. This is the default.
  
@@ -3666,7 +3679,7 @@ index 515aa73..53cef2e 100644
  .IP
  \fBbandwidth \fR
  Use to specify the maximum available network bandwidth in bytes/second.  Used
-@@ -300,6 +372,41 @@ with the \fBthrottle\fR option (above). If \fBthrottle\fR is a percentage and
+@@ -300,6 +385,41 @@ with the \fBthrottle\fR option (above). If \fBthrottle\fR is a percentage and
  ignored. Default is `0' (no bandwidth throttling). 
  
  .IP
@@ -3708,7 +3721,7 @@ index 515aa73..53cef2e 100644
  \fBsslcacert \fR
  Path to the directory containing the databases of the certificate authorities
  yum should use to verify SSL certificates. Defaults to none - uses system
-@@ -331,6 +438,15 @@ Path to the SSL client key yum should use to connect to repos/remote sites
+@@ -331,6 +451,15 @@ Path to the SSL client key yum should use to connect to repos/remote sites
  Defaults to none.
  
  .IP
@@ -3724,7 +3737,7 @@ index 515aa73..53cef2e 100644
  \fBhistory_record \fR
  Boolean - should yum record history entries for transactions. This takes some
  disk space, and some extra time in the transactions. But it allows how to know a
-@@ -391,7 +507,9 @@ syslog logging is disabled.  Default is `/dev/log'.
+@@ -391,7 +520,9 @@ syslog logging is disabled.  Default is `/dev/log'.
  
  .IP
  \fBproxy \fR
@@ -3735,7 +3748,7 @@ index 515aa73..53cef2e 100644
  
  .IP
  \fBproxy_username \fR
-@@ -438,6 +556,31 @@ It's also possible to use the word "never", meaning that the metadata will
+@@ -438,6 +569,31 @@ It's also possible to use the word "never", meaning that the metadata will
  never expire. Note that when using a metalink file the metalink must always
  be newer than the metadata for the repository, due to the validation, so this
  timeout also applies to the metalink file.
@@ -3767,7 +3780,7 @@ index 515aa73..53cef2e 100644
  
  .IP
  \fBmirrorlist_expire \fR
-@@ -462,12 +605,12 @@ always did, however it now does some checking on the index and reverts if
+@@ -462,12 +618,12 @@ always did, however it now does some checking on the index and reverts if
  it classifies it as bad.
  
  `group:primary' - Download the primary metadata with the index. This contains
@@ -3785,7 +3798,7 @@ index 515aa73..53cef2e 100644
  
  `group:main' - With the primary and updateinfo download the filelists metadata
  and the group metadata. The filelists data is required for operations like
-@@ -480,6 +623,19 @@ not listed above is the other metadata, which contains the changelog information
+@@ -480,6 +636,19 @@ not listed above is the other metadata, which contains the changelog information
  which is used by yum-changelog. This is what "yum makecache" uses.
  
  .IP
@@ -3805,7 +3818,7 @@ index 515aa73..53cef2e 100644
  \fBmultilib_policy \fR
  Can be set to 'all' or 'best'. All means install all possible arches for any package you 
  want to install. Therefore yum install foo will install foo.i386 and foo.x86_64 on x86_64, 
-@@ -523,6 +679,13 @@ Default is `normal'.
+@@ -523,6 +692,13 @@ Default is `normal'.
  See color_list_installed_older for possible values.
  
  .IP
@@ -3819,7 +3832,7 @@ index 515aa73..53cef2e 100644
  \fBcolor_list_installed_extra \fR
  The colorization/highlighting for packages in list/info installed which has
  no available package with the same name and arch.
-@@ -558,6 +721,13 @@ Default is `bold,underline,green.
+@@ -558,6 +734,13 @@ Default is `bold,underline,green.
  See color_list_installed_older for possible values.
  
  .IP
@@ -3833,7 +3846,7 @@ index 515aa73..53cef2e 100644
  \fBcolor_search_match \fR
  The colorization/highlighting for text matches in search.
  Default is `bold'.
-@@ -587,14 +757,98 @@ be downloaded. The updates list is what is printed when you run "yum update",
+@@ -587,14 +770,98 @@ be downloaded. The updates list is what is printed when you run "yum update",
  Default is `normal'.
  See color_list_installed_older for possible values.
  
@@ -3855,15 +3868,15 @@ index 515aa73..53cef2e 100644
 +\fBupgrade_requirements_on_install \fR
 +When installing/reinstalling/upgrading packages go through each package's
 +installed dependencies and check for an update.
- Boolean (1, 0, True, False, yes,no) Defaults to False
- 
++Boolean (1, 0, True, False, yes,no) Defaults to False
++
 +.IP
 +\fBrecheck_installed_requires \fR
 +When upgrading a package do we recheck any requirements that existed in the old
 +package. Turning this on shouldn't do anything but slow yum depsolving down,
 +however using rpm --nodeps etc. can break the rpmdb and then this will help.
-+Boolean (1, 0, True, False, yes,no) Defaults to False
-+
+ Boolean (1, 0, True, False, yes,no) Defaults to False
+ 
 +.IP
 +\fBreset_nice \fR
 +If set to true then yum will try to reset the nice value to zero, before
@@ -3932,7 +3945,7 @@ index 515aa73..53cef2e 100644
  
  
  .SH "[repository] OPTIONS"
-@@ -668,6 +922,10 @@ value of mirrorlist is copied to metalink (if metalink is not set).
+@@ -668,6 +935,10 @@ value of mirrorlist is copied to metalink (if metalink is not set).
  Either `1' or `0'. This tells yum whether or not use this repository.
  
  .IP
@@ -3943,7 +3956,7 @@ index 515aa73..53cef2e 100644
  \fBgpgcheck\fR
  Either `1' or `0'. This tells yum whether or not it should perform a GPG
  signature check on the packages gotten from this repository.
-@@ -702,12 +960,18 @@ key will be automatically imported without user confirmation.
+@@ -702,12 +973,18 @@ key will be automatically imported without user confirmation.
  Same as the [main] \fBexclude\fR option but only for this repository.
  Substitution variables, described below, are honored here.
  
@@ -3966,7 +3979,7 @@ index 515aa73..53cef2e 100644
  
  .IP
  \fBenablegroups\fR
-@@ -755,6 +1019,15 @@ repository.
+@@ -755,6 +1032,15 @@ repository.
  Overrides the \fBbandwidth\fR option from the [main] section for this
  repository.
  
@@ -3982,7 +3995,7 @@ index 515aa73..53cef2e 100644
  
  .IP
  \fBsslcacert \fR
-@@ -776,6 +1049,10 @@ repository.
+@@ -776,6 +1062,10 @@ repository.
  Overrides the \fBsslclientkey\fR option from the [main] section for this
  repository.
  
@@ -3993,7 +4006,7 @@ index 515aa73..53cef2e 100644
  
  .IP
  \fBmetadata_expire \fR
-@@ -783,6 +1060,11 @@ Overrides the \fBmetadata_expire\fR option from the [main] section for this
+@@ -783,6 +1073,11 @@ Overrides the \fBmetadata_expire\fR option from the [main] section for this
  repository.
  
  .IP
@@ -4005,7 +4018,7 @@ index 515aa73..53cef2e 100644
  \fBmirrorlist_expire \fR
  Overrides the \fBmirrorlist_expire\fR option from the [main] section for this
  repository.
-@@ -824,7 +1106,16 @@ as greater/less than any other. defaults to 1000
+@@ -824,7 +1119,16 @@ as greater/less than any other. defaults to 1000
  If set to True yum will continue running if this repository cannot be 
  contacted for any reason. This should be set carefully as all repos are consulted
  for any given command. Defaults to False.
@@ -4022,7 +4035,7 @@ index 515aa73..53cef2e 100644
  
  .SH "URL INCLUDE SYNTAX"
  .LP
-@@ -861,8 +1152,8 @@ package.
+@@ -861,8 +1165,8 @@ package.
  
  .IP
  \fB$arch\fR
@@ -4977,7 +4990,7 @@ index f1e06e8..40541af 100644
  complete -F _yum -o filenames yum yummain.py
  
 diff --git a/output.py b/output.py
-index b6aa277..cf9e985 100755
+index b6aa277..e42702e 100755
 --- a/output.py
 +++ b/output.py
 @@ -1,6 +1,6 @@
@@ -5944,7 +5957,7 @@ index b6aa277..cf9e985 100755
          self.tsInfo.makelists(True, True)
          pkglist_lines = []
          data  = {'n' : {}, 'v' : {}, 'r' : {}}
-@@ -1032,8 +1503,7 @@ class YumOutput:
+@@ -1032,11 +1503,33 @@ class YumOutput:
              for (d, v) in (("n",len(n)), ("v",len(evr)), ("r",len(repoid))):
                  data[d].setdefault(v, 0)
                  data[d][v] += 1
@@ -5953,8 +5966,35 @@ index b6aa277..cf9e985 100755
 +            a_wid = max(a_wid, len(a))
              return a_wid
  
-         for (action, pkglist) in [(_('Installing'), self.tsInfo.installed),
-@@ -1102,19 +1572,72 @@ class YumOutput:
+-        for (action, pkglist) in [(_('Installing'), self.tsInfo.installed),
++        ninstalled = self.tsInfo.installed
++        ginstalled = {}
++        if self.conf.group_command == 'objects' and ninstalled:
++            # Show new pkgs. that are installed via. a group.
++            ninstalled = []
++            for txmbr in self.tsInfo.installed:
++                if not hasattr(txmbr, '_ugroup_member'):
++                    ninstalled.append(txmbr)
++                    continue
++                if txmbr._ugroup_member not in ginstalled:
++                    ginstalled[txmbr._ugroup_member] = []
++                ginstalled[txmbr._ugroup_member].append(txmbr)
++
++        for grp in sorted(ginstalled, key=lambda x: x.ui_name):
++            action = _('Installing for group upgrade "%s"') % grp.ui_name
++            pkglist = ginstalled[grp]
++
++            lines = []
++            for txmbr in pkglist:
++                a_wid = _add_line(lines, data, a_wid, txmbr.po, txmbr.obsoletes)
++
++            pkglist_lines.append((action, lines))
++
++        for (action, pkglist) in [(_('Installing'), ninstalled),
+                             (_('Updating'), self.tsInfo.updated),
+                             (_('Removing'), self.tsInfo.removed),
+                             (_('Reinstalling'), self.tsInfo.reinstalled),
+@@ -1102,19 +1595,72 @@ class YumOutput:
  Transaction Summary
  %s
  """) % ('=' * self.term.columns))
@@ -6037,7 +6077,7 @@ index b6aa277..cf9e985 100755
          out = ''
          
          self.tsInfo.makelists()
-@@ -1179,17 +1702,19 @@ Transaction Summary
+@@ -1179,17 +1725,19 @@ Transaction Summary
          return out
  
      def setupProgressCallbacks(self):
@@ -6060,7 +6100,7 @@ index b6aa277..cf9e985 100755
              callback = CacheProgressCallback()
  
          # setup our failure report for failover
-@@ -1200,13 +1725,14 @@ Transaction Summary
+@@ -1200,13 +1748,14 @@ Transaction Summary
          interrupt_callback = self.interrupt_callback
          if hasattr(self, 'prerepoconf'):
              self.prerepoconf.progressbar = progressbar
@@ -6076,7 +6116,7 @@ index b6aa277..cf9e985 100755
              self.repos.callback = callback
              self.repos.setFailureCallback(failure_callback)
              self.repos.setInterruptCallback(interrupt_callback)
-@@ -1216,10 +1742,12 @@ Transaction Summary
+@@ -1216,10 +1765,12 @@ Transaction Summary
          self.dsCallback = dscb
      
      def setupProgessCallbacks(self):
@@ -6090,7 +6130,7 @@ index b6aa277..cf9e985 100755
          confirm_func = self._cli_confirm_gpg_key_import
          gpg_import_func = self.getKeyForRepo
          gpgca_import_func = self.getCAKeyForRepo
-@@ -1233,14 +1761,12 @@ Transaction Summary
+@@ -1233,14 +1784,12 @@ Transaction Summary
              self.repos.gpgca_import_func = gpgca_import_func
  
      def interrupt_callback(self, cbobj):
@@ -6110,7 +6150,7 @@ index b6aa277..cf9e985 100755
          '''
          delta_exit_chk = 2.0      # Delta between C-c's so we treat as exit
          delta_exit_str = _("two") # Human readable version of above
-@@ -1253,7 +1779,7 @@ Transaction Summary
+@@ -1253,7 +1802,7 @@ Transaction Summary
              # For translators: This is output like:
  #  Current download cancelled, interrupt (ctrl-c) again within two seconds
  # to exit.
@@ -6119,7 +6159,7 @@ index b6aa277..cf9e985 100755
              msg = _("""
   Current download cancelled, %sinterrupt (ctrl-c) again%s within %s%s%s seconds
  to exit.
-@@ -1269,6 +1795,14 @@ to exit.
+@@ -1269,6 +1818,14 @@ to exit.
  
      def download_callback_total_cb(self, remote_pkgs, remote_size,
                                     download_start_timestamp):
@@ -6134,7 +6174,7 @@ index b6aa277..cf9e985 100755
          if len(remote_pkgs) <= 1:
              return
          if not hasattr(urlgrabber.progress, 'TerminalLine'):
-@@ -1434,10 +1968,21 @@ to exit.
+@@ -1434,10 +1991,21 @@ to exit.
          return tids, printall
  
      def historyListCmd(self, extcmds):
@@ -6144,9 +6184,9 @@ index b6aa277..cf9e985 100755
 +
 +        :param extcmds: list of extra command line arguments
 +        :return: (exit_code, [errors])
- 
-+        exit_code is::
 +
++        exit_code is::
+ 
 +            0 = we're done, exit
 +            1 = we've errored, exit with error string
 +        """
@@ -6157,7 +6197,7 @@ index b6aa277..cf9e985 100755
              return 1, ['Failed history list']
  
          limit = 20
-@@ -1564,6 +2109,16 @@ to exit.
+@@ -1564,6 +2132,16 @@ to exit.
          return old[0]
  
      def historyInfoCmd(self, extcmds):
@@ -6174,7 +6214,7 @@ index b6aa277..cf9e985 100755
          def str2int(x):
              try:
                  return int(x)
-@@ -1656,6 +2211,9 @@ to exit.
+@@ -1656,6 +2234,9 @@ to exit.
      def _hpkg2from_repo(self, hpkg):
          """ Given a pkg, find the ipkg.ui_from_repo ... if none, then
              get an apkg. ... and put a ? in there. """
@@ -6184,7 +6224,7 @@ index b6aa277..cf9e985 100755
          ipkgs = self.rpmdb.searchPkgTuple(hpkg.pkgtup)
          if not ipkgs:
              apkgs = self.pkgSack.searchPkgTuple(hpkg.pkgtup)
-@@ -1672,13 +2230,12 @@ to exit.
+@@ -1672,13 +2253,12 @@ to exit.
                                   'o' : _('Updated'), 'n' : _('Downgraded')}
          _pkg_states_available = {'i' : _('Installed'), 'e' : _('Not installed'),
                                   'o' : _('Older'), 'n' : _('Newer')}
@@ -6201,7 +6241,7 @@ index b6aa277..cf9e985 100755
              prefix = " " * prefix_len
              if was_installed:
                  _pkg_states = _pkg_states_installed
-@@ -1702,9 +2259,11 @@ to exit.
+@@ -1702,9 +2282,11 @@ to exit.
              else:
                  (hibeg, hiend) = self._highlight('normal')
              state = utf8_width_fill(state, _pkg_states['maxlen'])
@@ -6215,7 +6255,7 @@ index b6aa277..cf9e985 100755
  
          if type(old.tid) == type([]):
              print _("Transaction ID :"), "%u..%u" % (old.tid[0], old.tid[-1])
-@@ -1778,8 +2337,8 @@ to exit.
+@@ -1778,8 +2360,8 @@ to exit.
              default_addons = set(['config-main', 'config-repos', 'saved_tx'])
              non_default = set(addon_info).difference(default_addons)
              if len(non_default) > 0:
@@ -6226,7 +6266,7 @@ index b6aa277..cf9e985 100755
  
          if old.trans_with:
              # This is _possible_, but not common
-@@ -1794,7 +2353,9 @@ to exit.
+@@ -1794,7 +2376,9 @@ to exit.
              print _("Packages Skipped:")
              pkg_max_len = max((len(str(hpkg)) for hpkg in old.trans_skip))
          for hpkg in old.trans_skip:
@@ -6237,7 +6277,7 @@ index b6aa277..cf9e985 100755
  
          if old.rpmdb_problems:
              print _("Rpmdb Problems:")
-@@ -1833,6 +2394,13 @@ to exit.
+@@ -1833,6 +2417,13 @@ to exit.
                                'Updated'      : _('Updated'),
                                }
      def historyInfoCmdPkgsAltered(self, old, pats=[]):
@@ -6251,7 +6291,7 @@ index b6aa277..cf9e985 100755
          last = None
          #  Note that these don't use _simple_pkg() because we are showing what
          # happened to them in the transaction ... not the difference between the
-@@ -1886,6 +2454,10 @@ to exit.
+@@ -1886,6 +2477,10 @@ to exit.
                                          self._hpkg2from_repo(hpkg))
  
      def historySummaryCmd(self, extcmds):
@@ -6262,7 +6302,7 @@ index b6aa277..cf9e985 100755
          tids, printall = self._history_list_transactions(extcmds)
          if tids is None:
              return 1, ['Failed history info']
-@@ -1946,6 +2518,10 @@ to exit.
+@@ -1946,6 +2541,10 @@ to exit.
                               utf8_width_fill(uiacts, 16, 16), count)
  
      def historyAddonInfoCmd(self, extcmds):
@@ -6273,7 +6313,7 @@ index b6aa277..cf9e985 100755
          tid = None
          if len(extcmds) > 1:
              tid = extcmds[1]
-@@ -1983,16 +2559,19 @@ to exit.
+@@ -1983,16 +2582,19 @@ to exit.
          
          for item in extcmds[2:]:
              if item in addon_info:
@@ -6299,7 +6339,7 @@ index b6aa277..cf9e985 100755
          tids = self.history.search(extcmds)
          limit = None
          if extcmds and not tids:
-@@ -2078,9 +2657,94 @@ to exit.
+@@ -2078,9 +2680,94 @@ to exit.
              if lastdbv.end_rpmdbversion != rpmdbv:
                  self._rpmdb_warn_checks()
  
@@ -6395,7 +6435,7 @@ index b6aa277..cf9e985 100755
      
      def __init__(self, ayum=None):
          """requires yum-cli log and errorlog functions as arguments"""
-@@ -2089,6 +2753,25 @@ class DepSolveProgressCallBack:
+@@ -2089,6 +2776,25 @@ class DepSolveProgressCallBack:
          self.ayum = ayum
  
      def pkgAdded(self, pkgtup, mode):
@@ -6421,7 +6461,7 @@ index b6aa277..cf9e985 100755
          modedict = { 'i': _('installed'),
                       'u': _('an update'),
                       'e': _('erased'),
-@@ -2104,43 +2787,86 @@ class DepSolveProgressCallBack:
+@@ -2104,43 +2810,86 @@ class DepSolveProgressCallBack:
              modeterm)
          
      def start(self):
@@ -6512,7 +6552,7 @@ index b6aa277..cf9e985 100755
          needname, needflags, needversion = reqTup
  
          yb = self.ayum
-@@ -2164,6 +2890,18 @@ class DepSolveProgressCallBack:
+@@ -2164,6 +2913,18 @@ class DepSolveProgressCallBack:
                  done = True
                  msg += _('\n        %s') % yum.misc.prco_tuple_to_string(pkgtup)
              if not done:
@@ -6531,7 +6571,7 @@ index b6aa277..cf9e985 100755
                  msg += _('\n        Not found')
              return msg
  
-@@ -2225,46 +2963,106 @@ class DepSolveProgressCallBack:
+@@ -2225,46 +2986,106 @@ class DepSolveProgressCallBack:
          return msg
      
      def procConflict(self, name, confname):
@@ -6643,7 +6683,7 @@ index b6aa277..cf9e985 100755
  
  def _pkgname_ui(ayum, pkgname, ts_states=None):
      """ Get more information on a simple pkgname, if we can. We need to search
-@@ -2316,10 +3114,7 @@ def _pkgname_ui(ayum, pkgname, ts_states=None):
+@@ -2316,10 +3137,7 @@ def _pkgname_ui(ayum, pkgname, ts_states=None):
      return pkgname
  
  class YumCliRPMCallBack(RPMBaseCallback):
@@ -6655,7 +6695,7 @@ index b6aa277..cf9e985 100755
  
      width = property(lambda x: _term_width())
  
-@@ -2337,21 +3132,34 @@ class YumCliRPMCallBack(RPMBaseCallback):
+@@ -2337,21 +3155,34 @@ class YumCliRPMCallBack(RPMBaseCallback):
      #  Installing things have pkg objects passed to the events, so only need to
      # lookup for erased/obsoleted.
      def pkgname_ui(self, pkgname, ts_states=('e', 'od', 'ud', None)):
@@ -6700,7 +6740,7 @@ index b6aa277..cf9e985 100755
          
          if type(package) not in types.StringTypes:
              pkgname = str(package)
-@@ -2363,9 +3171,25 @@ class YumCliRPMCallBack(RPMBaseCallback):
+@@ -2363,9 +3194,25 @@ class YumCliRPMCallBack(RPMBaseCallback):
              percent = 0
          else:
              percent = (te_current*100L)/te_total
@@ -6727,7 +6767,7 @@ index b6aa277..cf9e985 100755
                                                pkgname=pkgname, wid1=wid1)
              msg = fmt % (utf8_width_fill(process, wid1, wid1),
                           utf8_width_fill(pkgname, wid2, wid2))
-@@ -2377,6 +3201,11 @@ class YumCliRPMCallBack(RPMBaseCallback):
+@@ -2377,6 +3224,11 @@ class YumCliRPMCallBack(RPMBaseCallback):
                  print " "
  
      def scriptout(self, package, msgs):
@@ -6739,7 +6779,7 @@ index b6aa277..cf9e985 100755
          if msgs:
              sys.stdout.write(to_unicode(msgs))
              sys.stdout.flush()
-@@ -2396,7 +3225,7 @@ class YumCliRPMCallBack(RPMBaseCallback):
+@@ -2396,7 +3248,7 @@ class YumCliRPMCallBack(RPMBaseCallback):
              pnl = utf8_width(pkgname)
  
          overhead  = (2 * l) + 2 # Length of done, above
@@ -6748,7 +6788,7 @@ index b6aa277..cf9e985 100755
          overhead +=  1          # Space between pn and done
          overhead +=  2          # Ends for progress
          overhead +=  1          # Space for end
-@@ -2429,8 +3258,30 @@ class YumCliRPMCallBack(RPMBaseCallback):
+@@ -2429,8 +3281,30 @@ class YumCliRPMCallBack(RPMBaseCallback):
              wid2 = pnl
          return fmt, wid1, wid2
  
@@ -184512,10 +184552,10 @@ index 0000000..28e1964
 +- Check if we're running as root; exit nicely.
 diff --git a/yum-cron/yum-cron.py b/yum-cron/yum-cron.py
 new file mode 100755
-index 0000000..79c1907
+index 0000000..dd0a4c6
 --- /dev/null
 +++ b/yum-cron/yum-cron.py
-@@ -0,0 +1,1133 @@
+@@ -0,0 +1,1154 @@
 +#!/usr/bin/python -tt
 +import os
 +import sys
@@ -184944,10 +184984,31 @@ index 0000000..79c1907
 +
 +            return a_wid
 +
-+        
++        ninstalled = self.tsInfo.installed
++        ginstalled = {}
++        if self.conf.group_command == 'objects' and ninstalled:
++            # Show new pkgs. that are installed via. a group.
++            ninstalled = []
++            for txmbr in self.tsInfo.installed:
++                if not hasattr(txmbr, '_ugroup_member'):
++                    ninstalled.append(txmbr)
++                    continue
++                if txmbr._ugroup_member not in ginstalled:
++                    ginstalled[txmbr._ugroup_member] = []
++                ginstalled[txmbr._ugroup_member].append(txmbr)
++
++        for grp in sorted(ginstalled, key=lambda x: x.ui_name):
++            action = _('Installing for group upgrade "%s"') % grp.ui_name
++            pkglist = ginstalled[grp]
++
++            lines = []
++            for txmbr in pkglist:
++                a_wid = _add_line(lines, data, a_wid, txmbr.po, txmbr.obsoletes)
++
++            pkglist_lines.append((action, lines))        
 +
 +        # Iterate through the different groups of packages
-+        for (action, pkglist) in [(_('Installing'), tsInfo.installed),
++        for (action, pkglist) in [(_('Installing'), ninstalled),
 +                            (_('Updating'), tsInfo.updated),
 +                            (_('Removing'), tsInfo.removed),
 +                            (_('Reinstalling'), tsInfo.reinstalled),
@@ -186861,7 +186922,7 @@ index c1af4ad..70de539 100644
      pass
      
 diff --git a/yum/__init__.py b/yum/__init__.py
-index 99039e0..6a6f1fc 100644
+index 99039e0..f212884 100644
 --- a/yum/__init__.py
 +++ b/yum/__init__.py
 @@ -21,6 +21,7 @@ The Yum RPM software updater.
@@ -189240,7 +189301,7 @@ index 99039e0..6a6f1fc 100644
              pkgs = []
              if 'mandatory' in package_types:
                  pkgs.extend(thisgroup.mandatory_packages)
-@@ -2934,12 +3799,52 @@ class YumBase(depsolve.Depsolve):
+@@ -2934,12 +3799,54 @@ class YumBase(depsolve.Depsolve):
              if 'optional' in package_types:
                  pkgs.extend(thisgroup.optional_packages)
  
@@ -189291,10 +189352,12 @@ index 99039e0..6a6f1fc 100644
 +                                              pkg_warning_level='debug2')
 +                        for txmbr in txmbrs:
 +                            txmbr.group_member = thisgroup.groupid
++                            if lupgrade: # For list transaction.
++                                txmbr._ugroup_member = thisgroup
                  except Errors.InstallError, e:
                      self.verbose_logger.debug(_('No package named %s available to be installed'),
                          pkg)
-@@ -2953,7 +3858,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2953,7 +3860,9 @@ class YumBase(depsolve.Depsolve):
                  group_conditionals = enable_group_conditionals
  
              count_cond_test = 0
@@ -189305,7 +189368,7 @@ index 99039e0..6a6f1fc 100644
                  for condreq, cond in thisgroup.conditional_packages.iteritems():
                      if self.isPackageInstalled(cond):
                          try:
-@@ -2990,17 +3897,23 @@ class YumBase(depsolve.Depsolve):
+@@ -2990,17 +3899,23 @@ class YumBase(depsolve.Depsolve):
                          if cond not in self.tsInfo.conditionals:
                              self.tsInfo.conditionals[cond] = []
                          self.tsInfo.conditionals[cond].extend(pkgs)
@@ -189336,7 +189399,7 @@ index 99039e0..6a6f1fc 100644
          
          if not self.comps.has_group(grpid):
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -3008,7 +3921,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3008,7 +3923,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)
@@ -189346,7 +189409,7 @@ index 99039e0..6a6f1fc 100644
          for thisgroup in thesegroups:
              thisgroup.selected = False
              
-@@ -3034,13 +3948,102 @@ class YumBase(depsolve.Depsolve):
+@@ -3034,13 +3950,102 @@ class YumBase(depsolve.Depsolve):
                          for pkg in self.tsInfo.conditionals.get(txmbr.name, []):
                              self.tsInfo.remove(pkg.pkgtup)
          
@@ -189455,7 +189518,7 @@ index 99039e0..6a6f1fc 100644
          # look it up in the self.localPackages first:
          for po in self.localPackages:
              if po.pkgtup == pkgtup:
-@@ -3049,7 +4052,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3049,7 +4054,7 @@ class YumBase(depsolve.Depsolve):
          pkgs = self.pkgSack.searchPkgTuple(pkgtup)
  
          if len(pkgs) == 0:
@@ -189464,7 +189527,7 @@ index 99039e0..6a6f1fc 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 +4068,21 @@ class YumBase(depsolve.Depsolve):
+@@ -3065,13 +4070,21 @@ class YumBase(depsolve.Depsolve):
          return result
  
      def getInstalledPackageObject(self, pkgtup):
@@ -189491,7 +189554,7 @@ index 99039e0..6a6f1fc 100644
              raise Errors.RpmDBError, _('Package tuple %s could not be found in rpmdb') % str(pkgtup)
  
          # Dito. FIXME from getPackageObject() for len() > 1 ... :)
-@@ -3079,9 +4090,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3079,9 +4092,11 @@ class YumBase(depsolve.Depsolve):
          return po
          
      def gpgKeyCheck(self):
@@ -189505,7 +189568,7 @@ index 99039e0..6a6f1fc 100644
          gpgkeyschecked = self.conf.cachedir + '/.gpgkeyschecked.yum'
          if os.path.exists(gpgkeyschecked):
              return 1
-@@ -3106,9 +4119,13 @@ class YumBase(depsolve.Depsolve):
+@@ -3106,9 +4121,13 @@ class YumBase(depsolve.Depsolve):
              return 1
  
      def returnPackagesByDep(self, depstring):
@@ -189521,7 +189584,7 @@ index 99039e0..6a6f1fc 100644
          if not depstring:
              return []
  
-@@ -3132,12 +4149,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3132,12 +4151,23 @@ class YumBase(depsolve.Depsolve):
                          raise Errors.YumBaseError, _('Invalid version flag from: %s') % str(depstring)
                      depflags = SYMBOLFLAGS[flagsymbol]
  
@@ -189548,7 +189611,7 @@ index 99039e0..6a6f1fc 100644
          # we get all sorts of randomness here
          errstring = depstring
          if type(depstring) not in types.StringTypes:
-@@ -3149,16 +4177,22 @@ class YumBase(depsolve.Depsolve):
+@@ -3149,16 +4179,22 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _('No Package found for %s') % errstring
          
          ps = ListPackageSack(pkglist)
@@ -189575,7 +189638,7 @@ index 99039e0..6a6f1fc 100644
          if not depstring:
              return []
  
-@@ -3182,14 +4216,53 @@ class YumBase(depsolve.Depsolve):
+@@ -3182,14 +4218,53 @@ class YumBase(depsolve.Depsolve):
                          raise Errors.YumBaseError, _('Invalid version flag from: %s') % str(depstring)
                      depflags = SYMBOLFLAGS[flagsymbol]
  
@@ -189631,7 +189694,7 @@ index 99039e0..6a6f1fc 100644
          
          
          if len(pkglist) == 0:
-@@ -3198,14 +4271,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3198,14 +4273,23 @@ class YumBase(depsolve.Depsolve):
          if len(pkglist) == 1:
              return pkglist[0]
  
@@ -189661,7 +189724,7 @@ index 99039e0..6a6f1fc 100644
          returnlist = []
          compatArchList = self.arch.get_arch_list(arch)
          multiLib = []
-@@ -3222,9 +4304,9 @@ class YumBase(depsolve.Depsolve):
+@@ -3222,9 +4306,9 @@ class YumBase(depsolve.Depsolve):
                  singleLib.append(po)
                  
          # we now have three lists.  find the best package(s) of each
@@ -189674,7 +189737,7 @@ index 99039e0..6a6f1fc 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 +4320,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3238,7 +4322,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:
@@ -189683,7 +189746,7 @@ index 99039e0..6a6f1fc 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3246,7 +4328,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3246,7 +4330,7 @@ class YumBase(depsolve.Depsolve):
                  if single: returnlist.append(single)
          # similar for the non-multilib case
          elif single:
@@ -189692,7 +189755,7 @@ index 99039e0..6a6f1fc 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3350,28 +4432,69 @@ class YumBase(depsolve.Depsolve):
+@@ -3350,28 +4434,69 @@ class YumBase(depsolve.Depsolve):
              done = True
  
              slow = next_func(slow)
@@ -189768,7 +189831,7 @@ index 99039e0..6a6f1fc 100644
          try:
              txmbrs = self.groupRemove(group_string)
          except yum.Errors.GroupsError:
-@@ -3387,6 +4510,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3387,6 +4512,8 @@ class YumBase(depsolve.Depsolve):
          assert pattern[0] == '@'
          grpid = pattern[1:]
  
@@ -189777,7 +189840,7 @@ index 99039e0..6a6f1fc 100644
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -3398,7 +4523,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3398,7 +4525,11 @@ class YumBase(depsolve.Depsolve):
      def _minus_deselect(self, pattern):
          """ Remove things from the transaction, like kickstart. """
          assert pattern[0] == '-'
@@ -189790,7 +189853,7 @@ index 99039e0..6a6f1fc 100644
  
          if pat and pat[0] == '@':
              pat = pat[1:]
-@@ -3437,14 +4566,87 @@ class YumBase(depsolve.Depsolve):
+@@ -3437,14 +4568,87 @@ class YumBase(depsolve.Depsolve):
              if flag not in self.tsInfo.probFilterFlags:
                  self.tsInfo.probFilterFlags.append(flag)
  
@@ -189884,7 +189947,7 @@ index 99039e0..6a6f1fc 100644
          pkgs = []
          was_pattern = False
          if po:
-@@ -3464,9 +4666,14 @@ class YumBase(depsolve.Depsolve):
+@@ -3464,9 +4668,14 @@ class YumBase(depsolve.Depsolve):
                  if kwargs['pattern'] and kwargs['pattern'][0] == '@':
                      return self._at_groupinstall(kwargs['pattern'])
  
@@ -189899,7 +189962,7 @@ index 99039e0..6a6f1fc 100644
                                                        ignore_case=False)
                  pkgs.extend(mypkgs)
                  # if we have anything left unmatched, let's take a look for it
-@@ -3477,20 +4684,12 @@ class YumBase(depsolve.Depsolve):
+@@ -3477,20 +4686,12 @@ class YumBase(depsolve.Depsolve):
                      self.verbose_logger.debug(_('Checking for virtual provide or file-provide for %s'), 
                          arg)
  
@@ -189926,7 +189989,7 @@ index 99039e0..6a6f1fc 100644
              else:
                  nevra_dict = self._nevra_kwarg_parse(kwargs)
  
-@@ -3499,6 +4698,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3499,6 +4700,8 @@ class YumBase(depsolve.Depsolve):
                       ver=nevra_dict['version'], rel=nevra_dict['release'])
                  self._add_not_found_a(pkgs, nevra_dict)
                  
@@ -189935,7 +189998,7 @@ index 99039e0..6a6f1fc 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 +4778,21 @@ class YumBase(depsolve.Depsolve):
+@@ -3577,17 +4780,21 @@ class YumBase(depsolve.Depsolve):
                      continue
              
              # make sure this shouldn't be passed to update:
@@ -189961,7 +190024,7 @@ index 99039e0..6a6f1fc 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 +4805,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3600,23 +4807,23 @@ class YumBase(depsolve.Depsolve):
                      already_obs = pkgs[0]
  
                  if already_obs:
@@ -189992,7 +190055,7 @@ index 99039e0..6a6f1fc 100644
                      continue
  
              # make sure we don't have a name.arch of this already installed
-@@ -3630,8 +4835,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3630,8 +4837,8 @@ class YumBase(depsolve.Depsolve):
                          found = True
                          break
                  if not found:
@@ -190003,7 +190066,7 @@ index 99039e0..6a6f1fc 100644
                      tx_return.extend(txmbrs)
                      continue
  
-@@ -3719,19 +4924,47 @@ class YumBase(depsolve.Depsolve):
+@@ -3719,19 +4926,47 @@ class YumBase(depsolve.Depsolve):
          return txmbr
  
      def update(self, po=None, requiringPo=None, update_to=False, **kwargs):
@@ -190058,14 +190121,15 @@ index 99039e0..6a6f1fc 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 +4998,14 @@ class YumBase(depsolve.Depsolve):
+@@ -3765,7 +5000,15 @@ class YumBase(depsolve.Depsolve):
                      if new is None:
                          continue
                      tx_return.extend(self.update(po=new))
 -            
 +
 +            # Upgrade the installed groups, as part of generic "yum upgrade"
-+            if self.conf.group_command == 'objects':
++            if (self.conf.group_command == 'objects' and
++                self.conf.upgrade_group_objects_upgrade):
 +                for ievgrp in self.igroups.environments:
 +                    tx_return.extend(self._at_groupupgrade('@^' + ievgrp))
 +                for igrp in self.igroups.groups:
@@ -190074,7 +190138,7 @@ index 99039e0..6a6f1fc 100644
              return tx_return
  
          # complications
-@@ -3787,13 +5027,16 @@ class YumBase(depsolve.Depsolve):
+@@ -3787,13 +5030,16 @@ class YumBase(depsolve.Depsolve):
                  return self._minus_deselect(kwargs['pattern'])
  
              if kwargs['pattern'] and kwargs['pattern'][0] == '@':
@@ -190093,7 +190157,7 @@ index 99039e0..6a6f1fc 100644
  
              if not instpkgs and not availpkgs:
                  depmatches = []
-@@ -3805,6 +5048,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3805,6 +5051,8 @@ class YumBase(depsolve.Depsolve):
                  except yum.Errors.YumBaseError, e:
                      self.logger.critical(_('%s') % e)
  
@@ -190102,7 +190166,7 @@ index 99039e0..6a6f1fc 100644
                  if update_to:
                      availpkgs.extend(depmatches)
                  else:
-@@ -3816,9 +5061,12 @@ class YumBase(depsolve.Depsolve):
+@@ -3816,9 +5064,12 @@ class YumBase(depsolve.Depsolve):
              try:
                  if update_to:
                      m = []
@@ -190116,7 +190180,7 @@ index 99039e0..6a6f1fc 100644
                      m = self.pkgSack.returnNewestByNameArch(patterns=pats)
              except Errors.PackageSackError:
                  m = []
-@@ -3843,7 +5091,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3843,7 +5094,7 @@ class YumBase(depsolve.Depsolve):
                      availpkgs = self._compare_providers(availpkgs, requiringPo)
                      availpkgs = map(lambda x: x[0], availpkgs)
                  elif not availpkgs:
@@ -190125,7 +190189,7 @@ index 99039e0..6a6f1fc 100644
         
          # for any thing specified
          # get the list of available pkgs matching it (or take the po)
-@@ -3879,6 +5127,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3879,6 +5130,7 @@ class YumBase(depsolve.Depsolve):
                      if obsoleting_pkg is None:
                          continue
                      obs_pkgs.append(obsoleting_pkg)
@@ -190133,7 +190197,7 @@ index 99039e0..6a6f1fc 100644
                  for obsoleting_pkg in packagesNewestByName(obs_pkgs):
                      tx_return.extend(self.install(po=obsoleting_pkg))
              for available_pkg in availpkgs:
-@@ -3920,11 +5169,29 @@ class YumBase(depsolve.Depsolve):
+@@ -3920,11 +5172,29 @@ class YumBase(depsolve.Depsolve):
                      tx_return.append(txmbr)
                          
          for available_pkg in availpkgs:
@@ -190163,7 +190227,7 @@ index 99039e0..6a6f1fc 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 +5252,18 @@ class YumBase(depsolve.Depsolve):
+@@ -3985,11 +5255,18 @@ class YumBase(depsolve.Depsolve):
          return tx_return
          
      def remove(self, po=None, **kwargs):
@@ -190187,7 +190251,7 @@ index 99039e0..6a6f1fc 100644
          if not po and not kwargs:
              raise Errors.RemoveError, 'Nothing specified to remove'
          
-@@ -4008,6 +5282,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4008,6 +5285,10 @@ class YumBase(depsolve.Depsolve):
                      return self._at_groupremove(kwargs['pattern'])
  
                  (e,m,u) = self.rpmdb.matchPackageNames([kwargs['pattern']])
@@ -190198,7 +190262,7 @@ index 99039e0..6a6f1fc 100644
                  pkgs.extend(e)
                  pkgs.extend(m)
                  if u:
-@@ -4018,6 +5296,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4018,6 +5299,10 @@ class YumBase(depsolve.Depsolve):
                      except yum.Errors.YumBaseError, e:
                          self.logger.critical(_('%s') % e)
                      
@@ -190209,7 +190273,7 @@ index 99039e0..6a6f1fc 100644
                      if not depmatches:
                          arg = to_unicode(arg)
                          self.logger.critical(_('No Match for argument: %s') % to_unicode(arg))
-@@ -4055,17 +5337,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4055,17 +5340,19 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def installLocal(self, pkg, po=None, updateonly=False):
@@ -190239,7 +190303,7 @@ index 99039e0..6a6f1fc 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 +5467,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4183,16 +5470,15 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def reinstallLocal(self, pkg, po=None):
@@ -190264,7 +190328,7 @@ index 99039e0..6a6f1fc 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4215,13 +5498,29 @@ class YumBase(depsolve.Depsolve):
+@@ -4215,13 +5501,29 @@ class YumBase(depsolve.Depsolve):
          return self.reinstall(po=po)
  
      def reinstall(self, po=None, **kwargs):
@@ -190297,7 +190361,7 @@ index 99039e0..6a6f1fc 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 +5539,11 @@ class YumBase(depsolve.Depsolve):
+@@ -4240,10 +5542,11 @@ class YumBase(depsolve.Depsolve):
              # pkgs that are obsolete.
              old_conf_obs = self.conf.obsoletes
              self.conf.obsoletes = False
@@ -190311,7 +190375,7 @@ index 99039e0..6a6f1fc 100644
              self.conf.obsoletes = old_conf_obs
              if len(members) == 0:
                  self.tsInfo.remove(item.pkgtup)
-@@ -4259,16 +5559,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4259,16 +5562,15 @@ class YumBase(depsolve.Depsolve):
          return tx_mbrs
          
      def downgradeLocal(self, pkg, po=None):
@@ -190336,7 +190400,7 @@ index 99039e0..6a6f1fc 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4309,13 +5608,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4309,13 +5611,19 @@ class YumBase(depsolve.Depsolve):
          return False
          
      def downgrade(self, po=None, **kwargs):
@@ -190363,7 +190427,7 @@ index 99039e0..6a6f1fc 100644
          if not po and not kwargs:
              raise Errors.DowngradeError, 'Nothing specified to downgrade'
  
-@@ -4397,6 +5702,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4397,6 +5705,10 @@ class YumBase(depsolve.Depsolve):
          # installed version. Indexed fromn the latest installed pkgtup.
          downgrade_apkgs = {}
          for pkg in sorted(apkgs):
@@ -190374,7 +190438,7 @@ index 99039e0..6a6f1fc 100644
              na  = (pkg.name, pkg.arch)
  
              # Here we allow downgrades from .i386 => .noarch, or .i586 => .i386
-@@ -4421,6 +5730,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4421,6 +5733,9 @@ class YumBase(depsolve.Depsolve):
                  warned_nas.add(na)
                  continue
  
@@ -190384,7 +190448,7 @@ index 99039e0..6a6f1fc 100644
              if pkg.verGE(lipkg):
                  if na not in warned_nas:
                      msg = _('Only Upgrade available on package: %s') % pkg
-@@ -4457,7 +5769,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4457,7 +5772,7 @@ class YumBase(depsolve.Depsolve):
          if e and v and r:
              evr = '%s:%s-%s' % (e, v, r)
          elif v and r:
@@ -190393,7 +190457,7 @@ index 99039e0..6a6f1fc 100644
          elif e and v:
              evr = '%s:%s' % (e, v)
          elif v: # e and r etc. is just too weird to print
-@@ -4500,12 +5812,24 @@ class YumBase(depsolve.Depsolve):
+@@ -4500,12 +5815,24 @@ class YumBase(depsolve.Depsolve):
  
          return returndict
  
@@ -190421,7 +190485,7 @@ index 99039e0..6a6f1fc 100644
          old_conf_obs = self.conf.obsoletes
          self.conf.obsoletes = False
          done = False
-@@ -4515,19 +5839,46 @@ class YumBase(depsolve.Depsolve):
+@@ -4515,19 +5842,46 @@ class YumBase(depsolve.Depsolve):
                      done = True
          for pkg in transaction.trans_data:
              if pkg.state == 'Downgrade':
@@ -190468,7 +190532,7 @@ index 99039e0..6a6f1fc 100644
                  if self.install(pkgtup=pkg.pkgtup):
                      done = True
          for pkg in transaction.trans_data:
-@@ -4538,8 +5889,14 @@ class YumBase(depsolve.Depsolve):
+@@ -4538,8 +5892,14 @@ class YumBase(depsolve.Depsolve):
          return done
  
      def history_undo(self, transaction):
@@ -190485,7 +190549,7 @@ index 99039e0..6a6f1fc 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 +5973,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4616,7 +5976,7 @@ class YumBase(depsolve.Depsolve):
  
          except urlgrabber.grabber.URLGrabError, e:
              raise Errors.YumBaseError(_('GPG key retrieval failed: ') +
@@ -190494,7 +190558,7 @@ index 99039e0..6a6f1fc 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 +6006,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4649,7 +6009,7 @@ class YumBase(depsolve.Depsolve):
              keys_info = misc.getgpgkeyinfo(rawkey, multiple=True)
          except ValueError, e:
              raise Errors.YumBaseError(_('Invalid GPG Key from %s: %s') % 
@@ -190503,7 +190567,7 @@ index 99039e0..6a6f1fc 100644
          keys = []
          for keyinfo in keys_info:
              thiskey = {}
-@@ -4674,39 +6031,49 @@ class YumBase(depsolve.Depsolve):
+@@ -4674,39 +6034,49 @@ class YumBase(depsolve.Depsolve):
              if pkgs:
                  pkgs = sorted(pkgs)[-1]
                  msg = (_('Importing %s key 0x%s:\n'
@@ -190571,7 +190635,7 @@ index 99039e0..6a6f1fc 100644
          user_cb_fail = False
          for keyurl in keyurls:
              keys = self._retrievePublicKey(keyurl, repo)
-@@ -4725,7 +6092,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4725,7 +6095,9 @@ class YumBase(depsolve.Depsolve):
                      # Try installing/updating GPG key
                      self._getKeyImportMessage(info, keyurl)
                      rc = False
@@ -190582,7 +190646,7 @@ index 99039e0..6a6f1fc 100644
                          rc = True
                          
                      # grab the .sig/.asc for the keyurl, if it exists
-@@ -4751,8 +6120,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4751,8 +6123,8 @@ class YumBase(depsolve.Depsolve):
                  ts = self.rpmdb.readOnlyTS()
                  result = ts.pgpImportPubkey(misc.procgpgkey(info['raw_key']))
                  if result != 0:
@@ -190593,7 +190657,7 @@ index 99039e0..6a6f1fc 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
  
-@@ -4760,18 +6129,20 @@ class YumBase(depsolve.Depsolve):
+@@ -4760,18 +6132,20 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _("Didn't install any keys")
  
          if not key_installed:
@@ -190619,7 +190683,7 @@ index 99039e0..6a6f1fc 100644
      
      def _getAnyKeyForRepo(self, repo, destdir, keyurl_list, is_cakey=False, callback=None):
          """
-@@ -4788,6 +6159,18 @@ class YumBase(depsolve.Depsolve):
+@@ -4788,6 +6162,18 @@ class YumBase(depsolve.Depsolve):
          """
  
          key_installed = False
@@ -190638,7 +190702,7 @@ index 99039e0..6a6f1fc 100644
          user_cb_fail = False
          for keyurl in keyurl_list:
              keys = self._retrievePublicKey(keyurl, repo, getSig=not is_cakey)
-@@ -4819,8 +6202,11 @@ class YumBase(depsolve.Depsolve):
+@@ -4819,8 +6205,11 @@ class YumBase(depsolve.Depsolve):
                  if not key_installed:
                      self._getKeyImportMessage(info, keyurl, keytype)
                      rc = False
@@ -190651,7 +190715,7 @@ index 99039e0..6a6f1fc 100644
                      elif callback:
                          rc = callback({"repo": repo, "userid": info['userid'],
                                          "hexkeyid": info['hexkeyid'], "keyurl": keyurl,
-@@ -4835,7 +6221,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4835,7 +6224,8 @@ class YumBase(depsolve.Depsolve):
                  # Import the key
                  result = misc.import_key_to_pubring(info['raw_key'], info['hexkeyid'], gpgdir=destdir)
                  if not result:
@@ -190661,7 +190725,7 @@ index 99039e0..6a6f1fc 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
                  # write out the key id to imported_cakeys in the repos basedir
-@@ -4851,36 +6238,35 @@ class YumBase(depsolve.Depsolve):
+@@ -4851,36 +6241,35 @@ class YumBase(depsolve.Depsolve):
                              pass
  
          if not key_installed and user_cb_fail:
@@ -190714,7 +190778,7 @@ index 99039e0..6a6f1fc 100644
          self._getAnyKeyForRepo(repo, repo.gpgcadir, repo.gpgcakey, is_cakey=True, callback=callback)
  
      def _limit_installonly_pkgs(self):
-@@ -4889,7 +6275,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4889,7 +6278,7 @@ class YumBase(depsolve.Depsolve):
              New in 3.2.24: Obey yumdb_info.installonly data. """
  
          def _sort_and_filter_installonly(pkgs):
@@ -190723,7 +190787,7 @@ index 99039e0..6a6f1fc 100644
                  using the yumdb. """
              ret_beg = []
              ret_mid = []
-@@ -4917,6 +6303,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4917,6 +6306,10 @@ class YumBase(depsolve.Depsolve):
  
          if self.conf.installonly_limit < 1 :
              return 
@@ -190734,7 +190798,7 @@ index 99039e0..6a6f1fc 100644
              
          toremove = []
          #  We "probably" want to use either self.ts or self.rpmdb.ts if either
-@@ -4926,23 +6316,30 @@ class YumBase(depsolve.Depsolve):
+@@ -4926,23 +6319,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)
@@ -190773,7 +190837,7 @@ index 99039e0..6a6f1fc 100644
              for po in installed:
                  if (po.version, po.release) == (cur_kernel_v, cur_kernel_r): 
                      # don't remove running
-@@ -4959,19 +6356,22 @@ class YumBase(depsolve.Depsolve):
+@@ -4959,19 +6359,22 @@ class YumBase(depsolve.Depsolve):
              txmbr.depends_on.append(rel)
  
      def processTransaction(self, callback=None,rpmTestDisplay=None, rpmDisplay=None):
@@ -190809,7 +190873,7 @@ index 99039e0..6a6f1fc 100644
          
          if not callback:
              callback = callbacks.ProcessTransNoOutputCallback()
-@@ -5062,8 +6462,8 @@ class YumBase(depsolve.Depsolve):
+@@ -5062,8 +6465,8 @@ class YumBase(depsolve.Depsolve):
                  raise Errors.YumRPMCheckError, retmsgs
              retmsgs = [_('ERROR with transaction check vs depsolve:')]
              retmsgs.extend(msgs) 
@@ -190820,7 +190884,7 @@ index 99039e0..6a6f1fc 100644
              raise Errors.YumRPMCheckError,retmsgs
          
          tsConf = {}
-@@ -5114,13 +6514,19 @@ class YumBase(depsolve.Depsolve):
+@@ -5114,13 +6517,19 @@ class YumBase(depsolve.Depsolve):
          return results
  
      def add_enable_repo(self, repoid, baseurls=[], mirrorlist=None, **kwargs):
@@ -190847,7 +190911,7 @@ index 99039e0..6a6f1fc 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 +6573,15 @@ class YumBase(depsolve.Depsolve):
+@@ -5167,9 +6576,15 @@ class YumBase(depsolve.Depsolve):
  
      def setCacheDir(self, force=False, tmpdir=None, reuse=True,
                      suffix='/$basearch/$releasever'):
@@ -190866,7 +190930,7 @@ index 99039e0..6a6f1fc 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 +6591,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5179,7 +6594,7 @@ class YumBase(depsolve.Depsolve):
          try:
              cachedir = misc.getCacheDir(tmpdir, reuse)
          except (IOError, OSError), e:
@@ -190875,7 +190939,7 @@ index 99039e0..6a6f1fc 100644
              cachedir = None
              
          if cachedir is None:
-@@ -5190,6 +6602,8 @@ class YumBase(depsolve.Depsolve):
+@@ -5190,6 +6605,8 @@ class YumBase(depsolve.Depsolve):
              self.prerepoconf.cachedir = cachedir
          else:
              self.repos.setCacheDir(cachedir)
@@ -190884,7 +190948,7 @@ index 99039e0..6a6f1fc 100644
          self.conf.cachedir = cachedir
          return True # We got a new cache dir
  
-@@ -5220,13 +6634,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5220,13 +6637,24 @@ class YumBase(depsolve.Depsolve):
          self.history.write_addon_data('config-repos', myrepos)
          
      def verify_plugins_cb(self, verify_package):
@@ -190912,7 +190976,7 @@ index 99039e0..6a6f1fc 100644
          if self.tsInfo._unresolvedMembers:
              if auto:
                  self.logger.critical(_("Dependencies not solved. Will not save unresolved transaction."))
-@@ -5234,7 +6659,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5234,7 +6662,7 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError(_("Dependencies not solved. Will not save unresolved transaction."))
          
          if not filename:
@@ -190921,7 +190985,7 @@ index 99039e0..6a6f1fc 100644
              fd,filename = tempfile.mkstemp(suffix='.yumtx', prefix=prefix)
              f = os.fdopen(fd, 'w')
          else:
-@@ -5244,13 +6669,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5244,13 +6672,17 @@ class YumBase(depsolve.Depsolve):
          
          msg = "%s\n" % self.rpmdb.simpleVersion(main_only=True)[0]
          msg += "%s\n" % self.ts.getTsFlags()
@@ -190942,7 +191006,7 @@ index 99039e0..6a6f1fc 100644
          msg += "%s\n" % len(self.tsInfo.getMembers())
          for txmbr in self.tsInfo.getMembers():
              msg += txmbr._dump()
-@@ -5260,42 +6689,84 @@ class YumBase(depsolve.Depsolve):
+@@ -5260,42 +6692,84 @@ class YumBase(depsolve.Depsolve):
          except (IOError, OSError), e:
              self._ts_save_file = None
              if auto:
@@ -191039,7 +191103,7 @@ index 99039e0..6a6f1fc 100644
              if ignorerpm:
                  msg += _(" ignoring, as requested.")
                  self.logger.critical(_(msg))
-@@ -5318,8 +6789,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5318,8 +6792,17 @@ class YumBase(depsolve.Depsolve):
          numrepos = int(data[2].strip())
          repos = []
          rindex=3+numrepos
@@ -191058,7 +191122,7 @@ index 99039e0..6a6f1fc 100644
  
          # pkgs/txmbrs
          numpkgs = int(data[rindex].strip())
-@@ -5329,6 +6809,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5329,6 +6812,7 @@ class YumBase(depsolve.Depsolve):
          pkgcount = 0
          pkgprob = False
          curpkg = None
@@ -191066,7 +191130,7 @@ index 99039e0..6a6f1fc 100644
          for l in data[pkgstart:]:
              l = l.rstrip()
              # our main txmbrs
-@@ -5356,6 +6837,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5356,6 +6840,7 @@ class YumBase(depsolve.Depsolve):
                      if not ignoremissing:
                          raise Errors.YumBaseError(msg)
                      else:
@@ -191074,7 +191138,7 @@ index 99039e0..6a6f1fc 100644
                          self.logger.critical(msg)
                  else:
                      pkgcount += 1
-@@ -5432,12 +6914,18 @@ class YumBase(depsolve.Depsolve):
+@@ -5432,12 +6917,18 @@ class YumBase(depsolve.Depsolve):
          if pkgprob:
              msg = _("Transaction members, relations are missing or ts has been modified,")
              if ignoremissing:
@@ -191093,7 +191157,7 @@ index 99039e0..6a6f1fc 100644
          return self.tsInfo.getMembers()
  
      def _remove_old_deps(self):
-@@ -5470,18 +6958,6 @@ class YumBase(depsolve.Depsolve):
+@@ -5470,18 +6961,6 @@ class YumBase(depsolve.Depsolve):
                      if requiring == required: # if they are self-requiring skip them
                          continue
                          
@@ -191112,7 +191176,7 @@ index 99039e0..6a6f1fc 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 +7009,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5533,7 +7012,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
@@ -191137,7 +191201,7 @@ index 99039e0..6a6f1fc 100644
                  visited[curpkg] = True
              all_leaves_visited = True
              leaves = curpkg.requiring_packages()
-@@ -5547,4 +7040,3 @@ class YumBase(depsolve.Depsolve):
+@@ -5547,4 +7043,3 @@ class YumBase(depsolve.Depsolve):
          # Debugging output
          self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has no user-installed revdeps."), pkg)
          return False
@@ -191811,7 +191875,7 @@ index 65f6d5e..706e2a4 100755
          print >> sys.stderr, "newcomps.py: No such file:\'%s\'" % sys.argv[1]
          sys.exit(1)
 diff --git a/yum/config.py b/yum/config.py
-index d09511f..ecb8490 100644
+index d09511f..c43c41b 100644
 --- a/yum/config.py
 +++ b/yum/config.py
 @@ -38,6 +38,7 @@ if not _use_iniparse:
@@ -192570,7 +192634,7 @@ index d09511f..ecb8490 100644
      alwaysprompt = BoolOption(True)
      exactarch = BoolOption(True)
      tolerant = BoolOption(True)
-@@ -677,18 +784,33 @@ class YumConf(StartupConf):
+@@ -677,18 +784,34 @@ class YumConf(StartupConf):
      obsoletes = BoolOption(True)
      showdupesfromrepos = BoolOption(False)
      enabled = BoolOption(True)
@@ -192582,6 +192646,7 @@ index d09511f..ecb8490 100644
      group_package_types = ListOption(['mandatory', 'default'])
 +    group_command = SelectionOption(__group_command_default__,
 +                                    ('compat', 'objects', 'simple'))
++    upgrade_group_objects_upgrade = BoolOption(True)
      
      timeout = FloatOption(30.0) # FIXME: Should use variation of SecondsOption
  
@@ -192604,7 +192669,7 @@ index d09511f..ecb8490 100644
      # Time in seconds (1 day). NOTE: This isn't used when using metalinks
      mirrorlist_expire = SecondsOption(60 * 60 * 24)
      # XXX rpm_check_debug is unused, left around for API compatibility for now
-@@ -697,13 +819,15 @@ class YumConf(StartupConf):
+@@ -697,13 +820,15 @@ class YumConf(StartupConf):
      skip_broken = BoolOption(False)
      #  Note that "instant" is the old behaviour, but group:primary is very
      # similar but better :).
@@ -192623,7 +192688,7 @@ index d09511f..ecb8490 100644
  
      color = SelectionOption('auto', ('auto', 'never', 'always'),
                              mapper={'on' : 'always', 'yes' : 'always',
-@@ -715,22 +839,27 @@ class YumConf(StartupConf):
+@@ -715,22 +840,27 @@ class YumConf(StartupConf):
      color_list_installed_newer = Option('bold,yellow')
      color_list_installed_reinstall = Option('normal')
      color_list_installed_extra = Option('bold,red')
@@ -192651,7 +192716,7 @@ index d09511f..ecb8490 100644
  
      history_record = BoolOption(True)
      history_record_packages = ListOption(['yum', 'rpm'])
-@@ -744,18 +873,39 @@ class YumConf(StartupConf):
+@@ -744,18 +874,39 @@ class YumConf(StartupConf):
      
      loadts_ignoremissing = BoolOption(False)
      loadts_ignorerpm = BoolOption(False)
@@ -192691,7 +192756,7 @@ index d09511f..ecb8490 100644
          output = '[main]\n'
          # we exclude all vars which start with _ or are in this list:
          excluded_vars = ('cfg', 'uid', 'yumvar', 'progress_obj', 'failure_obj',
-@@ -778,14 +928,12 @@ class YumConf(StartupConf):
+@@ -778,14 +929,12 @@ class YumConf(StartupConf):
          return output
  
  class RepoConf(BaseConfig):
@@ -192709,7 +192774,7 @@ index d09511f..ecb8490 100644
          ck = self.__cached_keys
          if not isinstance(self, RepoConf):
              ck = set()
-@@ -797,6 +945,7 @@ class RepoConf(BaseConfig):
+@@ -797,6 +946,7 @@ class RepoConf(BaseConfig):
  
      name = Option()
      enabled = Inherit(YumConf.enabled)
@@ -192717,7 +192782,7 @@ index d09511f..ecb8490 100644
      baseurl = UrlListOption()
      mirrorlist = UrlOption()
      metalink   = UrlOption()
-@@ -820,42 +969,52 @@ class RepoConf(BaseConfig):
+@@ -820,42 +970,52 @@ class RepoConf(BaseConfig):
      keepalive = Inherit(YumConf.keepalive)
      enablegroups = Inherit(YumConf.enablegroups)
  
@@ -192781,7 +192846,7 @@ index d09511f..ecb8490 100644
  
      # ' xemacs syntax hack
  
-@@ -876,20 +1035,24 @@ def readStartupConfig(configfile, root):
+@@ -876,20 +1036,24 @@ def readStartupConfig(configfile, root):
              raise Errors.ConfigError("All plugin search paths must be absolute")
      # Stuff this here to avoid later re-parsing
      startupconf._parser = parser
@@ -192812,7 +192877,7 @@ index d09511f..ecb8490 100644
      
      # ' xemacs syntax hack
  
-@@ -956,6 +1119,12 @@ def readMainConfig(startupconf):
+@@ -956,6 +1120,12 @@ def readMainConfig(startupconf):
      return yumconf
  
  def readVersionGroupsConfig(configfile="/etc/yum/version-groups.conf"):
@@ -192825,7 +192890,7 @@ index d09511f..ecb8490 100644
      parser = ConfigParser()
      confpp_obj = ConfigPreProcessor(configfile)
      try:
-@@ -970,17 +1139,16 @@ def readVersionGroupsConfig(configfile="/etc/yum/version-groups.conf"):
+@@ -970,17 +1140,16 @@ def readVersionGroupsConfig(configfile="/etc/yum/version-groups.conf"):
  
  
  def getOption(conf, section, name, option):
@@ -192853,7 +192918,7 @@ index d09511f..ecb8490 100644
      try: 
          val = conf.get(section, name)
      except (NoSectionError, NoOptionError):
-@@ -1010,7 +1178,10 @@ def _getsysver(installroot, distroverpkg):
+@@ -1010,7 +1179,10 @@ def _getsysver(installroot, distroverpkg):
      ts = rpmUtils.transaction.initReadOnlyTransaction(root=installroot)
      ts.pushVSFlags(~(rpm._RPMVSF_NOSIGNATURES|rpm._RPMVSF_NODIGESTS))
      try:
@@ -192865,7 +192930,7 @@ index d09511f..ecb8490 100644
      except TypeError, e:
          # This is code for "cannot open rpmdb"
          # this is for pep 352 compliance on python 2.6 and above :(
-@@ -1028,25 +1199,40 @@ def _getsysver(installroot, distroverpkg):
+@@ -1028,25 +1200,40 @@ def _getsysver(installroot, distroverpkg):
      if idx.count() == 0:
          releasever = '$releasever'
      else:
@@ -192917,7 +192982,7 @@ index d09511f..ecb8490 100644
      # b/c repoids can have $values in them we need to map both ways to figure
      # out which one is which
      section_id = repo.id
-@@ -1054,6 +1240,22 @@ def writeRawRepoFile(repo,only=None):
+@@ -1054,6 +1241,22 @@ def writeRawRepoFile(repo,only=None):
          for sect in ini._sections.keys():
              if varReplace(sect, repo.yumvar) == repo.id:
                  section_id = sect
@@ -192940,7 +193005,7 @@ index d09511f..ecb8490 100644
      
      # Updated the ConfigParser with the changed values    
      cfgOptions = repo.cfg.options(repo.id)
-@@ -1069,7 +1271,7 @@ def writeRawRepoFile(repo,only=None):
+@@ -1069,7 +1272,7 @@ def writeRawRepoFile(repo,only=None):
          #  If the value is the same, but just interpreted ... when we don't want
          # to keep the interpreted values.
          if (name in ini[section_id] and
@@ -199941,7 +200006,7 @@ index e5e9ece..67bb7c9 100644
          fo = None
  
 diff --git a/yumcommands.py b/yumcommands.py
-index 4dcbea7..1530161 100644
+index 4dcbea7..2b1c9c0 100644
 --- a/yumcommands.py
 +++ b/yumcommands.py
 @@ -13,6 +13,7 @@
@@ -200435,12 +200500,13 @@ index 4dcbea7..1530161 100644
 +    """
 +
      def getNames(self):
+-        return ['distribution-synchronization', 'distro-sync']
 +        """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 ['distribution-synchronization', 'distro-sync']
++        return ['distribution-synchronization', 'distro-sync', 'distupgrade']
  
      def getUsage(self):
 +        """Return a usage string for this command.
@@ -201477,7 +201543,7 @@ index 4dcbea7..1530161 100644
              ypl = base.returnPkgLists(extcmds)
              if (base.conf.obsoletes or
                  base.verbose_logger.isEnabledFor(logginglevels.DEBUG_3)):
-@@ -675,162 +1607,471 @@ class CheckUpdateCommand(YumCommand):
+@@ -675,162 +1607,472 @@ class CheckUpdateCommand(YumCommand):
                      base.updatesObsoletesList(obtup, 'obsoletes',
                                                columns=columns)
                  result = 100
@@ -201487,7 +201553,8 @@ index 4dcbea7..1530161 100644
 -            return result, []
 +
 +            # Add check_running_kernel call, if updateinfo is available.
-+            if updateinfo._repos_downloaded(base.repos.listEnabled()):
++            if (base.conf.autocheck_running_kernel and
++                updateinfo._repos_downloaded(base.repos.listEnabled())):
 +                def _msg(x):
 +                    base.verbose_logger.info("%s", x)
 +                updateinfo._check_running_kernel(base, base.upinfo, _msg)
@@ -201979,7 +202046,7 @@ index 4dcbea7..1530161 100644
          def _repo_size(repo):
              ret = 0
              for pkg in repo.sack.returnPackages():
-@@ -838,12 +2079,9 @@ class RepoListCommand(YumCommand):
+@@ -838,12 +2080,9 @@ class RepoListCommand(YumCommand):
              return base.format_number(ret)
  
          def _repo_match(repo, patterns):
@@ -201994,7 +202061,7 @@ index 4dcbea7..1530161 100644
                      return True
              return False
  
-@@ -857,7 +2095,10 @@ class RepoListCommand(YumCommand):
+@@ -857,7 +2096,10 @@ class RepoListCommand(YumCommand):
              arg = 'enabled'
          extcmds = map(lambda x: x.lower(), extcmds)
  
@@ -202006,7 +202073,7 @@ index 4dcbea7..1530161 100644
          if arg != 'disabled' or extcmds:
              try:
                  # Setup so len(repo.sack) is correct
-@@ -866,6 +2107,13 @@ class RepoListCommand(YumCommand):
+@@ -866,6 +2108,13 @@ class RepoListCommand(YumCommand):
              except yum.Errors.RepoError:
                  if verbose:
                      raise
@@ -202020,7 +202087,7 @@ index 4dcbea7..1530161 100644
  
          repos = base.repos.repos.values()
          repos.sort()
-@@ -924,111 +2172,113 @@ class RepoListCommand(YumCommand):
+@@ -924,111 +2173,113 @@ class RepoListCommand(YumCommand):
                  ui_enabled = dhibeg + _('disabled') + hiend
                  ui_endis_wid = utf8_width(_('disabled'))
  
@@ -202230,7 +202297,7 @@ index 4dcbea7..1530161 100644
  
          if not verbose and cols:
              #  Work out the first (id) and last (enabled/disalbed/count),
-@@ -1088,21 +2338,64 @@ class RepoListCommand(YumCommand):
+@@ -1088,21 +2339,64 @@ class RepoListCommand(YumCommand):
          return 0, ['repolist: ' +to_unicode(locale.format("%d", tot_num, True))]
  
      def needTs(self, base, basecmd, extcmds):
@@ -202295,7 +202362,7 @@ index 4dcbea7..1530161 100644
          if len(extcmds) == 0:
              base.usage()
              raise cli.CliError
-@@ -1147,82 +2440,230 @@ class HelpCommand(YumCommand):
+@@ -1147,82 +2441,230 @@ class HelpCommand(YumCommand):
          return help_output
  
      def doCommand(self, base, basecmd, extcmds):
@@ -202535,7 +202602,7 @@ index 4dcbea7..1530161 100644
  
          def _append_repos(cols, repo_data):
              for repoid in sorted(repo_data):
-@@ -1264,7 +2705,7 @@ class VersionCommand(YumCommand):
+@@ -1264,7 +2706,7 @@ class VersionCommand(YumCommand):
  
          if vcmd == 'groupinfo':
              for group in groups:
@@ -202544,7 +202611,7 @@ index 4dcbea7..1530161 100644
                      continue
                  print _(" Group   :"), group
                  print _(" Packages:")
-@@ -1284,11 +2725,35 @@ class VersionCommand(YumCommand):
+@@ -1284,11 +2726,35 @@ class VersionCommand(YumCommand):
  
              return 0, ['version groupinfo']
  
@@ -202581,7 +202648,7 @@ index 4dcbea7..1530161 100644
                  data = base.rpmdb.simpleVersion(not verbose, groups=groups)
                  lastdbv = base.history.last()
                  if lastdbv is not None:
-@@ -1302,15 +2767,14 @@ class VersionCommand(YumCommand):
+@@ -1302,15 +2768,14 @@ class VersionCommand(YumCommand):
                  if groups:
                      for grp in sorted(data[2]):
                          if (vcmd.startswith("group-") and
@@ -202600,7 +202667,7 @@ index 4dcbea7..1530161 100644
                  data = base.pkgSack.simpleVersion(not verbose, groups=groups)
                  if vcmd not in ('group-available', 'group-all'):
                      cols.append(("%s %s/%s" % (_("Available:"), rel, ba),
-@@ -1320,14 +2784,12 @@ class VersionCommand(YumCommand):
+@@ -1320,14 +2785,12 @@ class VersionCommand(YumCommand):
                  if groups:
                      for grp in sorted(data[2]):
                          if (vcmd.startswith("group-") and
@@ -202616,7 +202683,7 @@ index 4dcbea7..1530161 100644
  
          data = {'rid' : {}, 'ver' : {}}
          for (rid, ver) in cols:
-@@ -1344,6 +2806,14 @@ class VersionCommand(YumCommand):
+@@ -1344,6 +2807,14 @@ class VersionCommand(YumCommand):
          return 0, ['version']
  
      def needTs(self, base, basecmd, extcmds):
@@ -202631,7 +202698,7 @@ index 4dcbea7..1530161 100644
          vcmd = 'installed'
          if extcmds:
              vcmd = extcmds[0]
-@@ -1352,25 +2822,74 @@ class VersionCommand(YumCommand):
+@@ -1352,25 +2823,74 @@ class VersionCommand(YumCommand):
              return True
          return vcmd in ('available', 'all', 'group-available', 'group-all')
  
@@ -202707,7 +202774,7 @@ index 4dcbea7..1530161 100644
              return 2, ["Repeating transaction %u" % (old.tid,)]
  
      def _hcmd_undo(self, base, extcmds):
-@@ -1426,12 +2945,57 @@ class HistoryCommand(YumCommand):
+@@ -1426,12 +2946,57 @@ class HistoryCommand(YumCommand):
      def _hcmd_new(self, base, extcmds):
          base.history._create_db_file()
  
@@ -202766,7 +202833,7 @@ index 4dcbea7..1530161 100644
          if extcmds and extcmds[0] not in cmds:
              base.logger.critical(_('Invalid history sub-command, use: %s.'),
                                   ", ".join(cmds))
-@@ -1444,6 +3008,19 @@ class HistoryCommand(YumCommand):
+@@ -1444,6 +3009,19 @@ class HistoryCommand(YumCommand):
              raise cli.CliError
  
      def doCommand(self, base, basecmd, extcmds):
@@ -202786,7 +202853,7 @@ index 4dcbea7..1530161 100644
          vcmd = 'list'
          if extcmds:
              vcmd = extcmds[0]
-@@ -1468,29 +3045,88 @@ class HistoryCommand(YumCommand):
+@@ -1468,29 +3046,88 @@ class HistoryCommand(YumCommand):
              ret = self._hcmd_rollback(base, extcmds)
          elif vcmd == 'new':
              ret = self._hcmd_new(base, extcmds)
@@ -202875,7 +202942,7 @@ index 4dcbea7..1530161 100644
          chkcmd = 'all'
          if extcmds:
              chkcmd = extcmds
-@@ -1505,33 +3141,1113 @@ class CheckRpmdbCommand(YumCommand):
+@@ -1505,33 +3142,1115 @@ class CheckRpmdbCommand(YumCommand):
          return rc, ['%s %s' % (basecmd, chkcmd)]
  
      def needTs(self, base, basecmd, extcmds):
@@ -203595,7 +203662,8 @@ index 4dcbea7..1530161 100644
 +            if maxsize < size:
 +                maxsize = size
 +        if not maxsize:
-+            _upi._check_running_kernel(base, md_info, _msg)
++            if base.conf.autocheck_running_kernel:
++                _upi._check_running_kernel(base, md_info, _msg)
 +            return
 +
 +        outT = {'newpackage' : 'New Package',
@@ -203625,7 +203693,8 @@ index 4dcbea7..1530161 100644
 +                for sn in sorted(sev_counts, key=_sev_sort_key):
 +                    args = (maxsize, sev_counts[sn],sn or '?', outT['security'])
 +                    print "        %*u %s %s notice(s)" % args
-+        _upi._check_running_kernel(base, md_info, _msg)
++        if base.conf.autocheck_running_kernel:
++            _upi._check_running_kernel(base, md_info, _msg)
 +        self.show_pkg_info_done = {}
 +
 +    def _get_new_pkgs(self, md_info):
diff --git a/yum.spec b/yum.spec
index 6e9faf7..b3c4ac1 100644
--- a/yum.spec
+++ b/yum.spec
@@ -60,7 +60,7 @@ BuildRequires: bash-completion
 Summary: RPM package installer/updater/manager
 Name: yum
 Version: 3.4.3
-Release: 115%{?dist}
+Release: 116%{?dist}
 License: GPLv2+
 Group: System Environment/Base
 Source0: http://yum.baseurl.org/download/3.4/%{name}-%{version}.tar.gz
@@ -444,6 +444,13 @@ exit 0
 %endif
 
 %changelog
+* Mon Nov 18 2013 James Antill <james at fedoraproject.org> - 3.4.3-116
+- Update to latest HEAD.
+- Add installed for groups pkg. lists on transaction output. BZ 1031374.
+- Add autocheck_running_kernel config. so people can turn it off.
+- Add upgrade_group_objects_upgrade config. so people can turn it off.
+- Add distupgrade command as alias for distro-sync, to be compat. with zypper.
+
 * Fri Nov 15 2013 James Antill <james at fedoraproject.org> - 3.4.3-115
 - Update to latest HEAD.
 - Use makecache systemd timer on f20, maybe use it on f19 too?


More information about the scm-commits mailing list