[yum] Update to latest HEAD.

James Antill james at fedoraproject.org
Wed Jun 19 20:20:33 UTC 2013


commit f9d0ecf64afb558e27370761d9d7db3f39866d02
Author: James Antill <james at and.org>
Date:   Wed Jun 19 16:20:21 2013 -0400

    Update to latest HEAD.
    
    - Add simple way to specify a group of pkgs. for version. BZ 913461.
    - Change group install => group upgrade for installed groups. BZ 833087.
    - Give more text when telling user about y-c-t, mention history. BZ 974576.
    - Fix the tolerant yum.conf text.
    - Skip installonly limit, if something has set check_future_rpmdbv. BZ 962757.

 yum-HEAD.patch |  429 ++++++++++++++++++++++++++++++++++----------------------
 yum.spec       |   10 ++-
 2 files changed, 270 insertions(+), 169 deletions(-)
---
diff --git a/yum-HEAD.patch b/yum-HEAD.patch
index c8920c1..37f986f 100644
--- a/yum-HEAD.patch
+++ b/yum-HEAD.patch
@@ -3318,7 +3318,7 @@ index 1a8202a..3ea88f7 100644
  List the packages installed on the system that are obsoleted by packages
  in any yum repository listed in the config file.
 diff --git a/docs/yum.conf.5 b/docs/yum.conf.5
-index 515aa73..0ae7f5c 100644
+index 515aa73..5b626b9 100644
 --- a/docs/yum.conf.5
 +++ b/docs/yum.conf.5
 @@ -64,7 +64,7 @@ options are: 'critical', 'emergency', 'error', 'warn' and 'debug'.
@@ -3330,7 +3330,7 @@ index 515aa73..0ae7f5c 100644
  
  The default is: yum glob:/etc/yum/protected.d/*.conf
  So any packages which should be protected can do so by including a file in 
-@@ -114,15 +114,27 @@ are causing problems from the transaction.
+@@ -114,32 +114,49 @@ are causing problems from the transaction.
  Either `1' or `0'. Determines whether or not yum prompts for confirmation of
  critical actions. Default is `0' (do prompt).
  .br
@@ -3362,11 +3362,14 @@ index 515aa73..0ae7f5c 100644
  .br
  
  .IP
-@@ -131,15 +143,22 @@ Either `1' or `0'. If enabled, then yum will be tolerant of errors on the
- command line with regard to packages. For example: if you request to install
- foo, bar and baz and baz is installed; yum won't error out complaining that baz
- is already installed. Default to `0' (not tolerant).
-+Note: This option currently does nothing.
+ \fBtolerant\fR
+-Either `1' or `0'. If enabled, then yum will be tolerant of errors on the
+-command line with regard to packages. For example: if you request to install
+-foo, bar and baz and baz is installed; yum won't error out complaining that baz
+-is already installed. Default to `0' (not tolerant).
++Either `1' or `0'. If enabled, yum will go slower, checking for things that
++shouldn't be possible making it more tolerant of external errors.
++Default to `0' (not tolerant).
  .br
  Command-line option: \fB\-t\fP
  
@@ -3386,7 +3389,7 @@ index 515aa73..0ae7f5c 100644
  .IP
  \fBexactarch\fR
  Either `1' or `0'. Set to `1' to make yum update only update the architectures
-@@ -161,7 +180,7 @@ will also apply to kernel-debug-devel, etc.
+@@ -161,7 +178,7 @@ will also apply to kernel-debug-devel, etc.
  Number of packages listed in installonlypkgs to keep installed at the same
  time. Setting to 0 disables this feature. Default is '0'. Note that this
  functionality used to be in the "installonlyn" plugin, where this option was
@@ -3395,7 +3398,7 @@ index 515aa73..0ae7f5c 100644
  Note that as of version 3.2.24, yum will now look in the yumdb for a installonly
  attribute on installed packages. If that attribute is "keep", then they will
  never be removed.
-@@ -188,12 +207,32 @@ Default is `true'.
+@@ -188,12 +205,32 @@ Default is `true'.
  Command-line option: \fB\-\-obsoletes\fP
  
  .IP
@@ -3428,7 +3431,7 @@ index 515aa73..0ae7f5c 100644
  
  .IP
  \fBgroupremove_leaf_only \fR
-@@ -215,6 +254,30 @@ of packages in groups will be installed when 'groupinstall' is called.
+@@ -215,6 +252,30 @@ of packages in groups will be installed when 'groupinstall' is called.
  Default is: default, mandatory
  
  .IP
@@ -3459,7 +3462,7 @@ index 515aa73..0ae7f5c 100644
  \fBinstallroot \fR
  Specifies an alternative installroot, relative to which all packages will be
  installed. 
-@@ -230,7 +293,8 @@ provides this manually by using: "yum whatprovides redhat-release".
+@@ -230,7 +291,8 @@ provides this manually by using: "yum whatprovides redhat-release".
  .IP
  \fBdiskspacecheck\fR
  Either `0' or `1'. Set this to `0' to disable the checking for sufficient
@@ -3469,7 +3472,7 @@ index 515aa73..0ae7f5c 100644
  
  .IP
  \fBtsflags\fR
-@@ -292,6 +356,12 @@ the maximum available bandwidth.
+@@ -292,6 +354,12 @@ the maximum available bandwidth.
  Set to `0' to disable bandwidth throttling. This is the default.
  
  .IP
@@ -3482,7 +3485,7 @@ index 515aa73..0ae7f5c 100644
  \fBbandwidth \fR
  Use to specify the maximum available network bandwidth in bytes/second.  Used
  with the \fBthrottle\fR option (above). If \fBthrottle\fR is a percentage and
-@@ -300,6 +370,40 @@ with the \fBthrottle\fR option (above). If \fBthrottle\fR is a percentage and
+@@ -300,6 +368,40 @@ with the \fBthrottle\fR option (above). If \fBthrottle\fR is a percentage and
  ignored. Default is `0' (no bandwidth throttling). 
  
  .IP
@@ -3523,7 +3526,7 @@ index 515aa73..0ae7f5c 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 +435,15 @@ Path to the SSL client key yum should use to connect to repos/remote sites
+@@ -331,6 +433,15 @@ Path to the SSL client key yum should use to connect to repos/remote sites
  Defaults to none.
  
  .IP
@@ -3539,7 +3542,7 @@ index 515aa73..0ae7f5c 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 +504,9 @@ syslog logging is disabled.  Default is `/dev/log'.
+@@ -391,7 +502,9 @@ syslog logging is disabled.  Default is `/dev/log'.
  
  .IP
  \fBproxy \fR
@@ -3550,7 +3553,7 @@ index 515aa73..0ae7f5c 100644
  
  .IP
  \fBproxy_username \fR
-@@ -438,6 +553,31 @@ It's also possible to use the word "never", meaning that the metadata will
+@@ -438,6 +551,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.
@@ -3582,7 +3585,7 @@ index 515aa73..0ae7f5c 100644
  
  .IP
  \fBmirrorlist_expire \fR
-@@ -480,6 +620,19 @@ not listed above is the other metadata, which contains the changelog information
+@@ -480,6 +618,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
@@ -3602,7 +3605,7 @@ index 515aa73..0ae7f5c 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 +676,13 @@ Default is `normal'.
+@@ -523,6 +674,13 @@ Default is `normal'.
  See color_list_installed_older for possible values.
  
  .IP
@@ -3616,7 +3619,7 @@ index 515aa73..0ae7f5c 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 +718,13 @@ Default is `bold,underline,green.
+@@ -558,6 +716,13 @@ Default is `bold,underline,green.
  See color_list_installed_older for possible values.
  
  .IP
@@ -3630,7 +3633,7 @@ index 515aa73..0ae7f5c 100644
  \fBcolor_search_match \fR
  The colorization/highlighting for text matches in search.
  Default is `bold'.
-@@ -587,14 +754,91 @@ be downloaded. The updates list is what is printed when you run "yum update",
+@@ -587,14 +752,91 @@ 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.
  
@@ -3722,7 +3725,7 @@ index 515aa73..0ae7f5c 100644
  
  
  .SH "[repository] OPTIONS"
-@@ -702,12 +946,18 @@ key will be automatically imported without user confirmation.
+@@ -702,12 +944,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.
  
@@ -3745,7 +3748,7 @@ index 515aa73..0ae7f5c 100644
  
  .IP
  \fBenablegroups\fR
-@@ -755,6 +1005,16 @@ repository.
+@@ -755,6 +1003,16 @@ repository.
  Overrides the \fBbandwidth\fR option from the [main] section for this
  repository.
  
@@ -3762,7 +3765,7 @@ index 515aa73..0ae7f5c 100644
  
  .IP
  \fBsslcacert \fR
-@@ -776,6 +1036,10 @@ repository.
+@@ -776,6 +1034,10 @@ repository.
  Overrides the \fBsslclientkey\fR option from the [main] section for this
  repository.
  
@@ -3773,7 +3776,7 @@ index 515aa73..0ae7f5c 100644
  
  .IP
  \fBmetadata_expire \fR
-@@ -783,6 +1047,11 @@ Overrides the \fBmetadata_expire\fR option from the [main] section for this
+@@ -783,6 +1045,11 @@ Overrides the \fBmetadata_expire\fR option from the [main] section for this
  repository.
  
  .IP
@@ -3785,7 +3788,7 @@ index 515aa73..0ae7f5c 100644
  \fBmirrorlist_expire \fR
  Overrides the \fBmirrorlist_expire\fR option from the [main] section for this
  repository.
-@@ -824,7 +1093,16 @@ as greater/less than any other. defaults to 1000
+@@ -824,7 +1091,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.
@@ -186369,7 +186372,7 @@ index c1af4ad..70de539 100644
      pass
      
 diff --git a/yum/__init__.py b/yum/__init__.py
-index 99039e0..4833a6e 100644
+index 99039e0..00db8ed 100644
 --- a/yum/__init__.py
 +++ b/yum/__init__.py
 @@ -21,6 +21,7 @@ The Yum RPM software updater.
@@ -187051,7 +187054,7 @@ index 99039e0..4833a6e 100644
          if self.rpmdb.contains(name="yum-utils"):
              return
  
-@@ -964,8 +1140,17 @@ class YumBase(depsolve.Depsolve):
+@@ -964,12 +1140,24 @@ class YumBase(depsolve.Depsolve):
               (hibeg, prog, hiend))
  
      def buildTransaction(self, unfinished_transactions_check=True):
@@ -187071,7 +187074,15 @@ index 99039e0..4833a6e 100644
          if (unfinished_transactions_check and
              misc.find_unfinished_transactions(yumlibpath=self.conf.persistdir)):
              msg = _('There are unfinished transactions remaining. You might ' \
-@@ -1004,7 +1189,7 @@ class YumBase(depsolve.Depsolve):
+-                    'consider running yum-complete-transaction first to finish them.' )
++                    'consider running yum-complete-transaction, or' \
++                    ' "yum history redo last", first to finish them. If that' \
++                    ' doesn\'t work you\'ll have to try removing/installing' \
++                    ' packages by hand (maybe package-cleanup can help).')
+             self.logger.critical(msg)
+             self.yumUtilsMsg(self.logger.critical, "yum-complete-transaction")
+             time.sleep(3)
+@@ -1004,7 +1192,7 @@ class YumBase(depsolve.Depsolve):
              # If transaction was changed by postresolve plugins then we should run skipbroken again
              (rescode, restring) = self._doSkipBroken(rescode, restring, clear_skipped=False )
  
@@ -187080,7 +187091,7 @@ index 99039e0..4833a6e 100644
              self.tsInfo.pkgSack.dropCachedData()
  
          # FIXME: This is horrible, see below and yummain. Maybe create a real
-@@ -1044,6 +1229,39 @@ class YumBase(depsolve.Depsolve):
+@@ -1044,6 +1232,39 @@ class YumBase(depsolve.Depsolve):
                  if first.verEQ(other):
                      continue
                  msg = _('Protected multilib versions: %s != %s')
@@ -187120,7 +187131,7 @@ index 99039e0..4833a6e 100644
                  xrestring.append(msg % (first, other))
          if xrestring:
              rescode = 1
-@@ -1227,7 +1445,7 @@ class YumBase(depsolve.Depsolve):
+@@ -1227,7 +1448,7 @@ class YumBase(depsolve.Depsolve):
                  self.verbose_logger.info(msg)
              self.skipped_packages.extend(skipped_list)   # make the skipped packages public
          else:
@@ -187129,7 +187140,7 @@ index 99039e0..4833a6e 100644
              self.verbose_logger.info("Skip-broken could not solve problems")
              return 1, orig_restring
          return rescode, restring
-@@ -1242,13 +1460,15 @@ class YumBase(depsolve.Depsolve):
+@@ -1242,13 +1463,15 @@ class YumBase(depsolve.Depsolve):
          if None in pkgtup:
              return None
          return pkgtup
@@ -187149,7 +187160,7 @@ index 99039e0..4833a6e 100644
          if pkgtup is None:
              return
          self._not_found_i[pkgtup] = YumNotFoundPackage(pkgtup)
-@@ -1267,7 +1487,7 @@ class YumBase(depsolve.Depsolve):
+@@ -1267,7 +1490,7 @@ class YumBase(depsolve.Depsolve):
              for pkg in txmbr.obsoleted_by:
                  # check if the obsoleting txmbr is in the transaction
                  # else remove the obsoleted txmbr
@@ -187158,7 +187169,7 @@ index 99039e0..4833a6e 100644
                  if not self.tsInfo.exists(pkg.pkgtup):
                      self.verbose_logger.debug('SKIPBROKEN: Remove extra obsoleted %s (%s)' % (txmbr.po,pkg) )
                      self.tsInfo.remove(txmbr.po.pkgtup)
-@@ -1282,7 +1502,7 @@ class YumBase(depsolve.Depsolve):
+@@ -1282,7 +1505,7 @@ class YumBase(depsolve.Depsolve):
              for pkg in txmbr.updated_by:
                  # check if the updating txmbr is in the transaction
                  # else remove the updated txmbr
@@ -187167,7 +187178,7 @@ index 99039e0..4833a6e 100644
                  if not self.tsInfo.exists(pkg.pkgtup):
                      self.verbose_logger.debug('SKIPBROKEN: Remove extra updated %s (%s)' % (txmbr.po,pkg) )
                      self.tsInfo.remove(txmbr.po.pkgtup)
-@@ -1379,9 +1599,19 @@ class YumBase(depsolve.Depsolve):
+@@ -1379,9 +1602,19 @@ class YumBase(depsolve.Depsolve):
  
      def _getDepsToRemove(self,po, deptree, toRemove):
          for dep in deptree.get(po, []): # Loop trough all deps of po
@@ -187187,7 +187198,7 @@ index 99039e0..4833a6e 100644
              toRemove.add(dep)
              self._getDepsToRemove(dep, deptree, toRemove)
  
-@@ -1454,7 +1684,46 @@ class YumBase(depsolve.Depsolve):
+@@ -1454,7 +1687,46 @@ class YumBase(depsolve.Depsolve):
          return probs
  
      def runTransaction(self, cb):
@@ -187235,7 +187246,7 @@ index 99039e0..4833a6e 100644
  
          self.plugins.run('pretrans')
  
-@@ -1516,10 +1785,23 @@ class YumBase(depsolve.Depsolve):
+@@ -1516,10 +1788,23 @@ class YumBase(depsolve.Depsolve):
                  pass
          self._ts_save_file = None
          
@@ -187259,7 +187270,7 @@ index 99039e0..4833a6e 100644
          
          # make resultobject - just a plain yumgenericholder object
          resultobject = misc.GenericHolder()
-@@ -1567,13 +1849,35 @@ class YumBase(depsolve.Depsolve):
+@@ -1567,13 +1852,35 @@ class YumBase(depsolve.Depsolve):
          self.plugins.run('posttrans')
          # sync up what just happened versus what is in the rpmdb
          if not self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST):
@@ -187300,7 +187311,7 @@ index 99039e0..4833a6e 100644
          # check to see that the rpmdb and the tsInfo roughly matches
          # push package object metadata outside of rpmdb into yumdb
          # delete old yumdb metadata entries
-@@ -1584,9 +1888,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1584,9 +1891,16 @@ class YumBase(depsolve.Depsolve):
          #    that there is not also an install of this pkg in the tsInfo (reinstall)
          # for any kind of install add from_repo to the yumdb, and the cmdline
          # and the install reason
@@ -187317,7 +187328,7 @@ index 99039e0..4833a6e 100644
          for txmbr in self.tsInfo:
              if txmbr.output_state in TS_INSTALL_STATES:
                  if not self.rpmdb.contains(po=txmbr.po):
-@@ -1596,12 +1907,21 @@ class YumBase(depsolve.Depsolve):
+@@ -1596,12 +1910,21 @@ class YumBase(depsolve.Depsolve):
                                             ' but is not!' % txmbr.po))
                      # Note: Get Panu to do te.Failed() so we don't have to
                      txmbr.output_state = TS_FAILED
@@ -187339,7 +187350,7 @@ index 99039e0..4833a6e 100644
                  if hasattr(self, 'args') and self.args:
                      po.yumdb_info.command_line = ' '.join(self.args)
                  elif hasattr(self, 'cmds') and self.cmds:
-@@ -1630,6 +1950,10 @@ class YumBase(depsolve.Depsolve):
+@@ -1630,6 +1953,10 @@ class YumBase(depsolve.Depsolve):
                      if md:
                          po.yumdb_info.from_repo_timestamp = str(md.timestamp)
  
@@ -187350,7 +187361,7 @@ index 99039e0..4833a6e 100644
                  loginuid = misc.getloginuid()
                  if txmbr.updates or txmbr.downgrades or txmbr.reinstall:
                      if txmbr.updates:
-@@ -1640,11 +1964,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1640,11 +1967,16 @@ class YumBase(depsolve.Depsolve):
                          opo = po
                      if 'installed_by' in opo.yumdb_info:
                          po.yumdb_info.installed_by = opo.yumdb_info.installed_by
@@ -187367,7 +187378,7 @@ index 99039e0..4833a6e 100644
          # Remove old ones after installing new ones, so we can copy values.
          for txmbr in self.tsInfo:
              if txmbr.output_state in TS_INSTALL_STATES:
-@@ -1662,10 +1991,13 @@ class YumBase(depsolve.Depsolve):
+@@ -1662,10 +1994,13 @@ class YumBase(depsolve.Depsolve):
                                                 ' but is not!' % txmbr.po))
                          # Note: Get Panu to do te.Failed() so we don't have to
                          txmbr.output_state = TS_FAILED
@@ -187381,7 +187392,7 @@ index 99039e0..4833a6e 100644
                  self.verbose_logger.log(logginglevels.DEBUG_2, 'What is this? %s' % txmbr.po)
  
          self.plugins.run('postverifytrans')
-@@ -1680,10 +2012,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1680,10 +2015,11 @@ class YumBase(depsolve.Depsolve):
          self.verbose_logger.debug('VerifyTransaction time: %0.3f' % (time.time() - vt_st))
  
      def costExcludePackages(self):
@@ -187397,7 +187408,7 @@ index 99039e0..4833a6e 100644
          # if all the repo.costs are equal then don't bother running things
          costs = {}
          for r in self.repos.listEnabled():
-@@ -1705,10 +2038,12 @@ class YumBase(depsolve.Depsolve):
+@@ -1705,10 +2041,12 @@ class YumBase(depsolve.Depsolve):
              done = True
  
      def excludePackages(self, repo=None):
@@ -187413,7 +187424,7 @@ index 99039e0..4833a6e 100644
          if "all" in self.conf.disable_excludes:
              return
          
-@@ -1735,9 +2070,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1735,9 +2073,11 @@ class YumBase(depsolve.Depsolve):
              self.pkgSack.addPackageExcluder(repoid, exid,'exclude.match', match)
  
      def includePackages(self, repo):
@@ -187428,7 +187439,7 @@ index 99039e0..4833a6e 100644
          includelist = repo.getIncludePkgList()
          
          if len(includelist) == 0:
-@@ -1757,8 +2094,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1757,8 +2097,11 @@ class YumBase(depsolve.Depsolve):
          self.pkgSack.addPackageExcluder(repo.id, exid, 'exclude.marked')
          
      def doLock(self, lockfile = YUM_PID_FILE):
@@ -187442,7 +187453,7 @@ index 99039e0..4833a6e 100644
          if self.conf.uid != 0:
              #  If we are a user, assume we are using the root cache ... so don't
              # bother locking.
-@@ -1774,38 +2114,26 @@ class YumBase(depsolve.Depsolve):
+@@ -1774,38 +2117,26 @@ class YumBase(depsolve.Depsolve):
          
          mypid=str(os.getpid())    
          while not self._lock(lockfile, mypid, 0644):
@@ -187496,7 +187507,7 @@ index 99039e0..4833a6e 100644
          # if we're not root then we don't lock - just return nicely
          #  Note that we can get here from __del__, so if we haven't created
          # YumBase.conf we don't want to do so here as creating stuff inside
-@@ -1830,31 +2158,69 @@ class YumBase(depsolve.Depsolve):
+@@ -1830,31 +2161,69 @@ class YumBase(depsolve.Depsolve):
          self._unlock(lockfile)
          self._lockfile = None
          
@@ -187577,7 +187588,7 @@ index 99039e0..4833a6e 100644
          failed = False
  
          if type(fo) is types.InstanceType:
-@@ -1894,9 +2260,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1894,9 +2263,16 @@ class YumBase(depsolve.Depsolve):
          
          
      def verifyChecksum(self, fo, checksumType, csum):
@@ -187597,7 +187608,7 @@ index 99039e0..4833a6e 100644
          try:
              filesum = misc.checksum(checksumType, fo)
          except Errors.MiscError, e:
-@@ -1908,13 +2281,26 @@ class YumBase(depsolve.Depsolve):
+@@ -1908,13 +2284,26 @@ class YumBase(depsolve.Depsolve):
          return 0
  
      def downloadPkgs(self, pkglist, callback=None, callback_total=None):
@@ -187625,7 +187636,7 @@ index 99039e0..4833a6e 100644
              if a is None:
                  return -1
              if b is None:
-@@ -1925,9 +2311,6 @@ class YumBase(depsolve.Depsolve):
+@@ -1925,9 +2314,6 @@ class YumBase(depsolve.Depsolve):
                  return 1
              return 0
          
@@ -187635,7 +187646,7 @@ index 99039e0..4833a6e 100644
          errors = {}
          def adderror(po, msg):
              errors.setdefault(po, []).append(msg)
-@@ -1943,116 +2326,200 @@ class YumBase(depsolve.Depsolve):
+@@ -1943,116 +2329,200 @@ class YumBase(depsolve.Depsolve):
          self.history.close()
  
          self.plugins.run('predownload', pkglist=pkglist)
@@ -187925,7 +187936,7 @@ index 99039e0..4833a6e 100644
          if type(fo) is types.InstanceType:
              fo = fo.filename
              
-@@ -2076,9 +2543,12 @@ class YumBase(depsolve.Depsolve):
+@@ -2076,9 +2546,12 @@ class YumBase(depsolve.Depsolve):
          return 1
          
      def downloadHeader(self, po):
@@ -187940,7 +187951,7 @@ index 99039e0..4833a6e 100644
          if hasattr(po, 'pkgtype') and po.pkgtype == 'local':
              return
                  
-@@ -2122,15 +2592,17 @@ class YumBase(depsolve.Depsolve):
+@@ -2122,15 +2595,17 @@ class YumBase(depsolve.Depsolve):
              return
  
      def sigCheckPkg(self, po):
@@ -187966,7 +187977,7 @@ index 99039e0..4833a6e 100644
          if self._override_sigchecks:
              check = False
              hasgpgkey = 0
-@@ -2181,6 +2653,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2181,6 +2656,9 @@ class YumBase(depsolve.Depsolve):
          return result, msg
  
      def cleanUsedHeadersPackages(self):
@@ -187976,7 +187987,7 @@ index 99039e0..4833a6e 100644
          filelist = []
          for txmbr in self.tsInfo:
              if txmbr.po.state not in TS_INSTALL_STATES:
-@@ -2218,27 +2693,42 @@ class YumBase(depsolve.Depsolve):
+@@ -2218,27 +2696,42 @@ class YumBase(depsolve.Depsolve):
                      _('%s removed'), fn)
          
      def cleanHeaders(self):
@@ -188021,7 +188032,7 @@ index 99039e0..4833a6e 100644
          cachedir = self.conf.persistdir + "/rpmdb-indexes/"
          if not os.path.exists(cachedir):
              filelist = []
-@@ -2271,9 +2761,31 @@ class YumBase(depsolve.Depsolve):
+@@ -2271,9 +2764,31 @@ class YumBase(depsolve.Depsolve):
          return 0, [msg]
  
      def doPackageLists(self, pkgnarrow='all', patterns=None, showdups=None,
@@ -188056,7 +188067,7 @@ index 99039e0..4833a6e 100644
          if showdups is None:
              showdups = self.conf.showdupesfromrepos
          ygh = misc.GenericHolder(iter=pkgnarrow)
-@@ -2295,6 +2807,8 @@ class YumBase(depsolve.Depsolve):
+@@ -2295,6 +2810,8 @@ class YumBase(depsolve.Depsolve):
              ndinst = {} # Newest versions by name.arch
              for po in self.rpmdb.returnPackages(patterns=patterns,
                                                  ignore_case=ic):
@@ -188065,7 +188076,7 @@ index 99039e0..4833a6e 100644
                  dinst[po.pkgtup] = po
                  if showdups:
                      continue
-@@ -2304,8 +2818,13 @@ class YumBase(depsolve.Depsolve):
+@@ -2304,8 +2821,13 @@ class YumBase(depsolve.Depsolve):
              installed = dinst.values()
                          
              if showdups:
@@ -188080,7 +188091,7 @@ index 99039e0..4833a6e 100644
              else:
                  try:
                      avail = self.pkgSack.returnNewestByNameArch(patterns=patterns,
-@@ -2323,16 +2842,30 @@ class YumBase(depsolve.Depsolve):
+@@ -2323,16 +2845,30 @@ class YumBase(depsolve.Depsolve):
                      key = (pkg.name, pkg.arch)
                      if pkg.pkgtup in dinst:
                          reinstall_available.append(pkg)
@@ -188114,7 +188125,7 @@ index 99039e0..4833a6e 100644
                  if len(matches) > 1:
                      updates.append(matches[0])
                      self.verbose_logger.log(logginglevels.DEBUG_1,
-@@ -2352,13 +2885,19 @@ class YumBase(depsolve.Depsolve):
+@@ -2352,13 +2888,19 @@ class YumBase(depsolve.Depsolve):
          elif pkgnarrow == 'installed':
              installed = self.rpmdb.returnPackages(patterns=patterns,
                                                    ignore_case=ic)
@@ -188135,7 +188146,7 @@ index 99039e0..4833a6e 100644
              else:
                  try:
                      avail = self.pkgSack.returnNewestByNameArch(patterns=patterns,
-@@ -2392,9 +2931,21 @@ class YumBase(depsolve.Depsolve):
+@@ -2392,9 +2934,21 @@ class YumBase(depsolve.Depsolve):
              avail = set(avail)
              for po in self.rpmdb.returnPackages(patterns=patterns,
                                                  ignore_case=ic):
@@ -188157,7 +188168,7 @@ index 99039e0..4833a6e 100644
          # obsoleting packages (and what they obsolete)
          elif pkgnarrow == 'obsoletes':
              self.conf.obsoletes = 1
-@@ -2402,6 +2953,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2402,6 +2956,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)
@@ -188165,7 +188176,7 @@ index 99039e0..4833a6e 100644
                  instpo = self.getInstalledPackageObject(instTup)
                  for po in pkgs:
                      obsoletes.append(po)
-@@ -2433,7 +2985,12 @@ class YumBase(depsolve.Depsolve):
+@@ -2433,7 +2988,12 @@ class YumBase(depsolve.Depsolve):
              recentlimit = now-(self.conf.recent*86400)
              if showdups:
                  avail = self.pkgSack.returnPackages(patterns=patterns,
@@ -188179,7 +188190,7 @@ index 99039e0..4833a6e 100644
              else:
                  try:
                      avail = self.pkgSack.returnNewestByNameArch(patterns=patterns,
-@@ -2461,14 +3018,13 @@ class YumBase(depsolve.Depsolve):
+@@ -2461,14 +3021,13 @@ class YumBase(depsolve.Depsolve):
  
          
      def findDeps(self, pkgs):
@@ -188199,7 +188210,7 @@ index 99039e0..4833a6e 100644
          results = {}
  
          for pkg in pkgs:
-@@ -2495,10 +3051,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2495,10 +3054,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):
@@ -188226,7 +188237,7 @@ index 99039e0..4833a6e 100644
          sql_fields = []
          for f in fields:
              sql_fields.append(RPM_TO_SQLITE.get(f, f))
-@@ -2614,7 +3182,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2614,7 +3185,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.
@@ -188235,7 +188246,7 @@ index 99039e0..4833a6e 100644
          # either, so it's pretty thankless. HTH. HAND.
          # By default just sort using package sorting
          sort_func = operator.itemgetter(0)
-@@ -2661,6 +3229,14 @@ class YumBase(depsolve.Depsolve):
+@@ -2661,6 +3232,14 @@ class YumBase(depsolve.Depsolve):
                      yield (po, vs)
  
      def searchPackageTags(self, criteria):
@@ -188250,7 +188261,7 @@ index 99039e0..4833a6e 100644
          results = {} # name = [(criteria, taglist)]
          for c in criteria:
              c = c.lower()
-@@ -2677,11 +3253,16 @@ class YumBase(depsolve.Depsolve):
+@@ -2677,11 +3256,16 @@ class YumBase(depsolve.Depsolve):
          return results
          
      def searchPackages(self, fields, criteria, callback=None):
@@ -188272,7 +188283,7 @@ index 99039e0..4833a6e 100644
          warnings.warn(_('searchPackages() will go away in a future version of Yum.\
                        Use searchGenerator() instead. \n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)           
-@@ -2700,13 +3281,23 @@ class YumBase(depsolve.Depsolve):
+@@ -2700,13 +3284,23 @@ class YumBase(depsolve.Depsolve):
      
      def searchPackageProvides(self, args, callback=None,
                                callback_has_matchfor=False):
@@ -188300,7 +188311,7 @@ index 99039e0..4833a6e 100644
              else:
                  isglob = True
                  canBeFile = misc.re_filename(arg)
-@@ -2723,7 +3314,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2723,7 +3317,7 @@ class YumBase(depsolve.Depsolve):
                  where = self.returnPackagesByDep(arg)
              else:
                  usedDepString = False
@@ -188309,7 +188320,7 @@ index 99039e0..4833a6e 100644
              self.verbose_logger.log(logginglevels.DEBUG_1,
                 P_('Searching %d package', 'Searching %d packages', len(where)), len(where))
              
-@@ -2817,25 +3408,168 @@ class YumBase(depsolve.Depsolve):
+@@ -2817,25 +3411,168 @@ class YumBase(depsolve.Depsolve):
              
          return matches
  
@@ -188490,7 +188501,7 @@ index 99039e0..4833a6e 100644
                  if uservisible:
                      if grp.user_visible:
                          installed.append(grp)
-@@ -2847,34 +3581,98 @@ class YumBase(depsolve.Depsolve):
+@@ -2847,34 +3584,98 @@ class YumBase(depsolve.Depsolve):
                          available.append(grp)
                  else:
                      available.append(grp)
@@ -188600,7 +188611,7 @@ index 99039e0..4833a6e 100644
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -2898,13 +3696,58 @@ class YumBase(depsolve.Depsolve):
+@@ -2898,13 +3699,58 @@ class YumBase(depsolve.Depsolve):
                              self.tsInfo.remove(txmbr.po.pkgtup)
          
          
@@ -188666,7 +188677,7 @@ index 99039e0..4833a6e 100644
          """
  
          if not self.comps.has_group(grpid):
-@@ -2920,6 +3763,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2920,12 +3766,18 @@ class YumBase(depsolve.Depsolve):
          if group_package_types:
              package_types = group_package_types
  
@@ -188676,7 +188687,16 @@ index 99039e0..4833a6e 100644
          for thisgroup in thesegroups:
              if thisgroup.selected:
                  continue
-@@ -2934,12 +3780,51 @@ class YumBase(depsolve.Depsolve):
+             
+             thisgroup.selected = True
+             
++            # Can move to upgrade, if installed and calling install
++            lupgrade = upgrade
++
+             pkgs = []
+             if 'mandatory' in package_types:
+                 pkgs.extend(thisgroup.mandatory_packages)
+@@ -2934,12 +3786,52 @@ class YumBase(depsolve.Depsolve):
              if 'optional' in package_types:
                  pkgs.extend(thisgroup.optional_packages)
  
@@ -188685,6 +188705,7 @@ index 99039e0..4833a6e 100644
 +            if igroup_data:
 +                if thisgroup.groupid in self.igroups.groups:
 +                    igrp = self.igroups.groups[thisgroup.groupid]
++                    lupgrade = True
 +                else:
 +                    self.igroups.add_group(thisgroup.groupid,
 +                                           thisgroup.packages, ievgrp)
@@ -188698,7 +188719,7 @@ index 99039e0..4833a6e 100644
 +                    assert pkg in igroup_data
 +                    if (pkg not in igroup_data or
 +                        igroup_data[pkg].startswith('blacklisted')):
-+                        # (upgrade and igroup_data[pkg] == 'available')):
++                        # (lupgrade and igroup_data[pkg] == 'available')):
 +                        msg = _('Skipping package %s from group %s')
 +                        self.verbose_logger.log(logginglevels.DEBUG_2,
 +                                                msg, pkg, thisgroup.groupid)
@@ -188714,7 +188735,7 @@ index 99039e0..4833a6e 100644
 +                txmbrs = []
                  try:
 -                    txmbrs = self.install(name = pkg)
-+                    if (upgrade and
++                    if (lupgrade and
 +                        (self.conf.group_command == 'simple' or
 +                         (igroup_data and igroup_data[pkg] == 'installed'))):
 +                        txmbrs = self.update(name = pkg,
@@ -188729,25 +188750,25 @@ index 99039e0..4833a6e 100644
                  except Errors.InstallError, e:
                      self.verbose_logger.debug(_('No package named %s available to be installed'),
                          pkg)
-@@ -2953,7 +3838,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2953,7 +3845,9 @@ class YumBase(depsolve.Depsolve):
                  group_conditionals = enable_group_conditionals
  
              count_cond_test = 0
 -            if group_conditionals:
 +            # FIXME: What do we do about group conditionals when group==objects
 +            #        or group upgrade for group_command=simple?
-+            if not upgrade and group_conditionals:
++            if not lupgrade and group_conditionals:
                  for condreq, cond in thisgroup.conditional_packages.iteritems():
                      if self.isPackageInstalled(cond):
                          try:
-@@ -2990,17 +3877,23 @@ class YumBase(depsolve.Depsolve):
+@@ -2990,17 +3884,23 @@ class YumBase(depsolve.Depsolve):
                          if cond not in self.tsInfo.conditionals:
                              self.tsInfo.conditionals[cond] = []
                          self.tsInfo.conditionals[cond].extend(pkgs)
 -            if len(txmbrs_used) == old_txmbrs:
 -                self.logger.critical(_('Warning: Group %s does not have any packages.'), thisgroup.groupid)
 +
-+            if not upgrade and len(txmbrs_used) == old_txmbrs:
++            if not lupgrade and len(txmbrs_used) == old_txmbrs:
 +                self.logger.critical(_('Warning: Group %s does not have any packages to install.'), thisgroup.groupid)
                  if count_cond_test:
 -                    self.logger.critical(_('Group %s does have %u conditional packages, which may get installed.'), count_cond_test)
@@ -188771,7 +188792,7 @@ index 99039e0..4833a6e 100644
          
          if not self.comps.has_group(grpid):
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -3008,7 +3901,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3008,7 +3908,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)
@@ -188781,7 +188802,7 @@ index 99039e0..4833a6e 100644
          for thisgroup in thesegroups:
              thisgroup.selected = False
              
-@@ -3034,13 +3928,102 @@ class YumBase(depsolve.Depsolve):
+@@ -3034,13 +3935,102 @@ class YumBase(depsolve.Depsolve):
                          for pkg in self.tsInfo.conditionals.get(txmbr.name, []):
                              self.tsInfo.remove(pkg.pkgtup)
          
@@ -188890,7 +188911,7 @@ index 99039e0..4833a6e 100644
          # look it up in the self.localPackages first:
          for po in self.localPackages:
              if po.pkgtup == pkgtup:
-@@ -3049,7 +4032,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3049,7 +4039,7 @@ class YumBase(depsolve.Depsolve):
          pkgs = self.pkgSack.searchPkgTuple(pkgtup)
  
          if len(pkgs) == 0:
@@ -188899,7 +188920,7 @@ index 99039e0..4833a6e 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 +4048,21 @@ class YumBase(depsolve.Depsolve):
+@@ -3065,13 +4055,21 @@ class YumBase(depsolve.Depsolve):
          return result
  
      def getInstalledPackageObject(self, pkgtup):
@@ -188926,7 +188947,7 @@ index 99039e0..4833a6e 100644
              raise Errors.RpmDBError, _('Package tuple %s could not be found in rpmdb') % str(pkgtup)
  
          # Dito. FIXME from getPackageObject() for len() > 1 ... :)
-@@ -3079,9 +4070,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3079,9 +4077,11 @@ class YumBase(depsolve.Depsolve):
          return po
          
      def gpgKeyCheck(self):
@@ -188940,7 +188961,7 @@ index 99039e0..4833a6e 100644
          gpgkeyschecked = self.conf.cachedir + '/.gpgkeyschecked.yum'
          if os.path.exists(gpgkeyschecked):
              return 1
-@@ -3106,9 +4099,13 @@ class YumBase(depsolve.Depsolve):
+@@ -3106,9 +4106,13 @@ class YumBase(depsolve.Depsolve):
              return 1
  
      def returnPackagesByDep(self, depstring):
@@ -188956,7 +188977,7 @@ index 99039e0..4833a6e 100644
          if not depstring:
              return []
  
-@@ -3132,12 +4129,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3132,12 +4136,23 @@ class YumBase(depsolve.Depsolve):
                          raise Errors.YumBaseError, _('Invalid version flag from: %s') % str(depstring)
                      depflags = SYMBOLFLAGS[flagsymbol]
  
@@ -188983,7 +189004,7 @@ index 99039e0..4833a6e 100644
          # we get all sorts of randomness here
          errstring = depstring
          if type(depstring) not in types.StringTypes:
-@@ -3149,16 +4157,22 @@ class YumBase(depsolve.Depsolve):
+@@ -3149,16 +4164,22 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _('No Package found for %s') % errstring
          
          ps = ListPackageSack(pkglist)
@@ -189010,7 +189031,7 @@ index 99039e0..4833a6e 100644
          if not depstring:
              return []
  
-@@ -3182,14 +4196,53 @@ class YumBase(depsolve.Depsolve):
+@@ -3182,14 +4203,53 @@ class YumBase(depsolve.Depsolve):
                          raise Errors.YumBaseError, _('Invalid version flag from: %s') % str(depstring)
                      depflags = SYMBOLFLAGS[flagsymbol]
  
@@ -189066,7 +189087,7 @@ index 99039e0..4833a6e 100644
          
          
          if len(pkglist) == 0:
-@@ -3198,14 +4251,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3198,14 +4258,23 @@ class YumBase(depsolve.Depsolve):
          if len(pkglist) == 1:
              return pkglist[0]
  
@@ -189096,7 +189117,7 @@ index 99039e0..4833a6e 100644
          returnlist = []
          compatArchList = self.arch.get_arch_list(arch)
          multiLib = []
-@@ -3222,9 +4284,9 @@ class YumBase(depsolve.Depsolve):
+@@ -3222,9 +4291,9 @@ class YumBase(depsolve.Depsolve):
                  singleLib.append(po)
                  
          # we now have three lists.  find the best package(s) of each
@@ -189109,7 +189130,7 @@ index 99039e0..4833a6e 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 +4300,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3238,7 +4307,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:
@@ -189118,7 +189139,7 @@ index 99039e0..4833a6e 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3246,7 +4308,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3246,7 +4315,7 @@ class YumBase(depsolve.Depsolve):
                  if single: returnlist.append(single)
          # similar for the non-multilib case
          elif single:
@@ -189127,7 +189148,7 @@ index 99039e0..4833a6e 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3350,28 +4412,58 @@ class YumBase(depsolve.Depsolve):
+@@ -3350,28 +4419,58 @@ class YumBase(depsolve.Depsolve):
              done = True
  
              slow = next_func(slow)
@@ -189191,7 +189212,7 @@ index 99039e0..4833a6e 100644
          try:
              txmbrs = self.groupRemove(group_string)
          except yum.Errors.GroupsError:
-@@ -3387,6 +4479,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3387,6 +4486,8 @@ class YumBase(depsolve.Depsolve):
          assert pattern[0] == '@'
          grpid = pattern[1:]
  
@@ -189200,7 +189221,7 @@ index 99039e0..4833a6e 100644
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -3398,7 +4492,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3398,7 +4499,11 @@ class YumBase(depsolve.Depsolve):
      def _minus_deselect(self, pattern):
          """ Remove things from the transaction, like kickstart. """
          assert pattern[0] == '-'
@@ -189213,7 +189234,7 @@ index 99039e0..4833a6e 100644
  
          if pat and pat[0] == '@':
              pat = pat[1:]
-@@ -3437,14 +4535,87 @@ class YumBase(depsolve.Depsolve):
+@@ -3437,14 +4542,87 @@ class YumBase(depsolve.Depsolve):
              if flag not in self.tsInfo.probFilterFlags:
                  self.tsInfo.probFilterFlags.append(flag)
  
@@ -189307,7 +189328,7 @@ index 99039e0..4833a6e 100644
          pkgs = []
          was_pattern = False
          if po:
-@@ -3464,9 +4635,14 @@ class YumBase(depsolve.Depsolve):
+@@ -3464,9 +4642,14 @@ class YumBase(depsolve.Depsolve):
                  if kwargs['pattern'] and kwargs['pattern'][0] == '@':
                      return self._at_groupinstall(kwargs['pattern'])
  
@@ -189322,7 +189343,7 @@ index 99039e0..4833a6e 100644
                                                        ignore_case=False)
                  pkgs.extend(mypkgs)
                  # if we have anything left unmatched, let's take a look for it
-@@ -3477,20 +4653,12 @@ class YumBase(depsolve.Depsolve):
+@@ -3477,20 +4660,12 @@ class YumBase(depsolve.Depsolve):
                      self.verbose_logger.debug(_('Checking for virtual provide or file-provide for %s'), 
                          arg)
  
@@ -189349,7 +189370,7 @@ index 99039e0..4833a6e 100644
              else:
                  nevra_dict = self._nevra_kwarg_parse(kwargs)
  
-@@ -3499,6 +4667,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3499,6 +4674,8 @@ class YumBase(depsolve.Depsolve):
                       ver=nevra_dict['version'], rel=nevra_dict['release'])
                  self._add_not_found_a(pkgs, nevra_dict)
                  
@@ -189358,7 +189379,7 @@ index 99039e0..4833a6e 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 +4747,21 @@ class YumBase(depsolve.Depsolve):
+@@ -3577,17 +4754,21 @@ class YumBase(depsolve.Depsolve):
                      continue
              
              # make sure this shouldn't be passed to update:
@@ -189384,7 +189405,7 @@ index 99039e0..4833a6e 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 +4774,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3600,23 +4781,23 @@ class YumBase(depsolve.Depsolve):
                      already_obs = pkgs[0]
  
                  if already_obs:
@@ -189415,7 +189436,7 @@ index 99039e0..4833a6e 100644
                      continue
  
              # make sure we don't have a name.arch of this already installed
-@@ -3630,8 +4804,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3630,8 +4811,8 @@ class YumBase(depsolve.Depsolve):
                          found = True
                          break
                  if not found:
@@ -189426,7 +189447,7 @@ index 99039e0..4833a6e 100644
                      tx_return.extend(txmbrs)
                      continue
  
-@@ -3719,19 +4893,47 @@ class YumBase(depsolve.Depsolve):
+@@ -3719,19 +4900,47 @@ class YumBase(depsolve.Depsolve):
          return txmbr
  
      def update(self, po=None, requiringPo=None, update_to=False, **kwargs):
@@ -189481,7 +189502,7 @@ index 99039e0..4833a6e 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 +4967,14 @@ class YumBase(depsolve.Depsolve):
+@@ -3765,7 +4974,14 @@ class YumBase(depsolve.Depsolve):
                      if new is None:
                          continue
                      tx_return.extend(self.update(po=new))
@@ -189497,7 +189518,7 @@ index 99039e0..4833a6e 100644
              return tx_return
  
          # complications
-@@ -3787,13 +4996,16 @@ class YumBase(depsolve.Depsolve):
+@@ -3787,13 +5003,16 @@ class YumBase(depsolve.Depsolve):
                  return self._minus_deselect(kwargs['pattern'])
  
              if kwargs['pattern'] and kwargs['pattern'][0] == '@':
@@ -189516,7 +189537,7 @@ index 99039e0..4833a6e 100644
  
              if not instpkgs and not availpkgs:
                  depmatches = []
-@@ -3805,6 +5017,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3805,6 +5024,8 @@ class YumBase(depsolve.Depsolve):
                  except yum.Errors.YumBaseError, e:
                      self.logger.critical(_('%s') % e)
  
@@ -189525,7 +189546,7 @@ index 99039e0..4833a6e 100644
                  if update_to:
                      availpkgs.extend(depmatches)
                  else:
-@@ -3816,9 +5030,12 @@ class YumBase(depsolve.Depsolve):
+@@ -3816,9 +5037,12 @@ class YumBase(depsolve.Depsolve):
              try:
                  if update_to:
                      m = []
@@ -189539,7 +189560,7 @@ index 99039e0..4833a6e 100644
                      m = self.pkgSack.returnNewestByNameArch(patterns=pats)
              except Errors.PackageSackError:
                  m = []
-@@ -3843,7 +5060,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3843,7 +5067,7 @@ class YumBase(depsolve.Depsolve):
                      availpkgs = self._compare_providers(availpkgs, requiringPo)
                      availpkgs = map(lambda x: x[0], availpkgs)
                  elif not availpkgs:
@@ -189548,7 +189569,7 @@ index 99039e0..4833a6e 100644
         
          # for any thing specified
          # get the list of available pkgs matching it (or take the po)
-@@ -3879,6 +5096,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3879,6 +5103,7 @@ class YumBase(depsolve.Depsolve):
                      if obsoleting_pkg is None:
                          continue
                      obs_pkgs.append(obsoleting_pkg)
@@ -189556,7 +189577,7 @@ index 99039e0..4833a6e 100644
                  for obsoleting_pkg in packagesNewestByName(obs_pkgs):
                      tx_return.extend(self.install(po=obsoleting_pkg))
              for available_pkg in availpkgs:
-@@ -3920,11 +5138,29 @@ class YumBase(depsolve.Depsolve):
+@@ -3920,11 +5145,29 @@ class YumBase(depsolve.Depsolve):
                      tx_return.append(txmbr)
                          
          for available_pkg in availpkgs:
@@ -189586,7 +189607,7 @@ index 99039e0..4833a6e 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 +5221,18 @@ class YumBase(depsolve.Depsolve):
+@@ -3985,11 +5228,18 @@ class YumBase(depsolve.Depsolve):
          return tx_return
          
      def remove(self, po=None, **kwargs):
@@ -189610,7 +189631,7 @@ index 99039e0..4833a6e 100644
          if not po and not kwargs:
              raise Errors.RemoveError, 'Nothing specified to remove'
          
-@@ -4008,6 +5251,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4008,6 +5258,10 @@ class YumBase(depsolve.Depsolve):
                      return self._at_groupremove(kwargs['pattern'])
  
                  (e,m,u) = self.rpmdb.matchPackageNames([kwargs['pattern']])
@@ -189621,7 +189642,7 @@ index 99039e0..4833a6e 100644
                  pkgs.extend(e)
                  pkgs.extend(m)
                  if u:
-@@ -4018,6 +5265,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4018,6 +5272,10 @@ class YumBase(depsolve.Depsolve):
                      except yum.Errors.YumBaseError, e:
                          self.logger.critical(_('%s') % e)
                      
@@ -189632,7 +189653,7 @@ index 99039e0..4833a6e 100644
                      if not depmatches:
                          arg = to_unicode(arg)
                          self.logger.critical(_('No Match for argument: %s') % to_unicode(arg))
-@@ -4055,17 +5306,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4055,17 +5313,19 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def installLocal(self, pkg, po=None, updateonly=False):
@@ -189662,7 +189683,7 @@ index 99039e0..4833a6e 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 +5436,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4183,16 +5443,15 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def reinstallLocal(self, pkg, po=None):
@@ -189687,7 +189708,7 @@ index 99039e0..4833a6e 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4215,13 +5467,29 @@ class YumBase(depsolve.Depsolve):
+@@ -4215,13 +5474,29 @@ class YumBase(depsolve.Depsolve):
          return self.reinstall(po=po)
  
      def reinstall(self, po=None, **kwargs):
@@ -189720,7 +189741,7 @@ index 99039e0..4833a6e 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 +5508,11 @@ class YumBase(depsolve.Depsolve):
+@@ -4240,10 +5515,11 @@ class YumBase(depsolve.Depsolve):
              # pkgs that are obsolete.
              old_conf_obs = self.conf.obsoletes
              self.conf.obsoletes = False
@@ -189734,7 +189755,7 @@ index 99039e0..4833a6e 100644
              self.conf.obsoletes = old_conf_obs
              if len(members) == 0:
                  self.tsInfo.remove(item.pkgtup)
-@@ -4259,16 +5528,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4259,16 +5535,15 @@ class YumBase(depsolve.Depsolve):
          return tx_mbrs
          
      def downgradeLocal(self, pkg, po=None):
@@ -189759,7 +189780,7 @@ index 99039e0..4833a6e 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4309,13 +5577,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4309,13 +5584,19 @@ class YumBase(depsolve.Depsolve):
          return False
          
      def downgrade(self, po=None, **kwargs):
@@ -189786,7 +189807,7 @@ index 99039e0..4833a6e 100644
          if not po and not kwargs:
              raise Errors.DowngradeError, 'Nothing specified to downgrade'
  
-@@ -4397,6 +5671,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4397,6 +5678,10 @@ class YumBase(depsolve.Depsolve):
          # installed version. Indexed fromn the latest installed pkgtup.
          downgrade_apkgs = {}
          for pkg in sorted(apkgs):
@@ -189797,7 +189818,7 @@ index 99039e0..4833a6e 100644
              na  = (pkg.name, pkg.arch)
  
              # Here we allow downgrades from .i386 => .noarch, or .i586 => .i386
-@@ -4421,6 +5699,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4421,6 +5706,9 @@ class YumBase(depsolve.Depsolve):
                  warned_nas.add(na)
                  continue
  
@@ -189807,7 +189828,7 @@ index 99039e0..4833a6e 100644
              if pkg.verGE(lipkg):
                  if na not in warned_nas:
                      msg = _('Only Upgrade available on package: %s') % pkg
-@@ -4457,7 +5738,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4457,7 +5745,7 @@ class YumBase(depsolve.Depsolve):
          if e and v and r:
              evr = '%s:%s-%s' % (e, v, r)
          elif v and r:
@@ -189816,7 +189837,7 @@ index 99039e0..4833a6e 100644
          elif e and v:
              evr = '%s:%s' % (e, v)
          elif v: # e and r etc. is just too weird to print
-@@ -4500,12 +5781,24 @@ class YumBase(depsolve.Depsolve):
+@@ -4500,12 +5788,24 @@ class YumBase(depsolve.Depsolve):
  
          return returndict
  
@@ -189844,7 +189865,7 @@ index 99039e0..4833a6e 100644
          old_conf_obs = self.conf.obsoletes
          self.conf.obsoletes = False
          done = False
-@@ -4515,19 +5808,46 @@ class YumBase(depsolve.Depsolve):
+@@ -4515,19 +5815,46 @@ class YumBase(depsolve.Depsolve):
                      done = True
          for pkg in transaction.trans_data:
              if pkg.state == 'Downgrade':
@@ -189891,7 +189912,7 @@ index 99039e0..4833a6e 100644
                  if self.install(pkgtup=pkg.pkgtup):
                      done = True
          for pkg in transaction.trans_data:
-@@ -4538,8 +5858,14 @@ class YumBase(depsolve.Depsolve):
+@@ -4538,8 +5865,14 @@ class YumBase(depsolve.Depsolve):
          return done
  
      def history_undo(self, transaction):
@@ -189908,7 +189929,7 @@ index 99039e0..4833a6e 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 +5942,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4616,7 +5949,7 @@ class YumBase(depsolve.Depsolve):
  
          except urlgrabber.grabber.URLGrabError, e:
              raise Errors.YumBaseError(_('GPG key retrieval failed: ') +
@@ -189917,7 +189938,7 @@ index 99039e0..4833a6e 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 +5975,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4649,7 +5982,7 @@ class YumBase(depsolve.Depsolve):
              keys_info = misc.getgpgkeyinfo(rawkey, multiple=True)
          except ValueError, e:
              raise Errors.YumBaseError(_('Invalid GPG Key from %s: %s') % 
@@ -189926,7 +189947,7 @@ index 99039e0..4833a6e 100644
          keys = []
          for keyinfo in keys_info:
              thiskey = {}
-@@ -4674,39 +6000,49 @@ class YumBase(depsolve.Depsolve):
+@@ -4674,39 +6007,49 @@ class YumBase(depsolve.Depsolve):
              if pkgs:
                  pkgs = sorted(pkgs)[-1]
                  msg = (_('Importing %s key 0x%s:\n'
@@ -189994,7 +190015,7 @@ index 99039e0..4833a6e 100644
          user_cb_fail = False
          for keyurl in keyurls:
              keys = self._retrievePublicKey(keyurl, repo)
-@@ -4725,7 +6061,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4725,7 +6068,9 @@ class YumBase(depsolve.Depsolve):
                      # Try installing/updating GPG key
                      self._getKeyImportMessage(info, keyurl)
                      rc = False
@@ -190005,7 +190026,7 @@ index 99039e0..4833a6e 100644
                          rc = True
                          
                      # grab the .sig/.asc for the keyurl, if it exists
-@@ -4751,8 +6089,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4751,8 +6096,8 @@ class YumBase(depsolve.Depsolve):
                  ts = self.rpmdb.readOnlyTS()
                  result = ts.pgpImportPubkey(misc.procgpgkey(info['raw_key']))
                  if result != 0:
@@ -190016,7 +190037,7 @@ index 99039e0..4833a6e 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
  
-@@ -4760,18 +6098,20 @@ class YumBase(depsolve.Depsolve):
+@@ -4760,18 +6105,20 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _("Didn't install any keys")
  
          if not key_installed:
@@ -190042,7 +190063,7 @@ index 99039e0..4833a6e 100644
      
      def _getAnyKeyForRepo(self, repo, destdir, keyurl_list, is_cakey=False, callback=None):
          """
-@@ -4788,6 +6128,18 @@ class YumBase(depsolve.Depsolve):
+@@ -4788,6 +6135,18 @@ class YumBase(depsolve.Depsolve):
          """
  
          key_installed = False
@@ -190061,7 +190082,7 @@ index 99039e0..4833a6e 100644
          user_cb_fail = False
          for keyurl in keyurl_list:
              keys = self._retrievePublicKey(keyurl, repo, getSig=not is_cakey)
-@@ -4819,8 +6171,11 @@ class YumBase(depsolve.Depsolve):
+@@ -4819,8 +6178,11 @@ class YumBase(depsolve.Depsolve):
                  if not key_installed:
                      self._getKeyImportMessage(info, keyurl, keytype)
                      rc = False
@@ -190074,7 +190095,7 @@ index 99039e0..4833a6e 100644
                      elif callback:
                          rc = callback({"repo": repo, "userid": info['userid'],
                                          "hexkeyid": info['hexkeyid'], "keyurl": keyurl,
-@@ -4835,7 +6190,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4835,7 +6197,8 @@ class YumBase(depsolve.Depsolve):
                  # Import the key
                  result = misc.import_key_to_pubring(info['raw_key'], info['hexkeyid'], gpgdir=destdir)
                  if not result:
@@ -190084,7 +190105,7 @@ index 99039e0..4833a6e 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
                  # write out the key id to imported_cakeys in the repos basedir
-@@ -4851,36 +6207,35 @@ class YumBase(depsolve.Depsolve):
+@@ -4851,36 +6214,35 @@ class YumBase(depsolve.Depsolve):
                              pass
  
          if not key_installed and user_cb_fail:
@@ -190137,7 +190158,7 @@ index 99039e0..4833a6e 100644
          self._getAnyKeyForRepo(repo, repo.gpgcadir, repo.gpgcakey, is_cakey=True, callback=callback)
  
      def _limit_installonly_pkgs(self):
-@@ -4889,7 +6244,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4889,7 +6251,7 @@ class YumBase(depsolve.Depsolve):
              New in 3.2.24: Obey yumdb_info.installonly data. """
  
          def _sort_and_filter_installonly(pkgs):
@@ -190146,7 +190167,18 @@ index 99039e0..4833a6e 100644
                  using the yumdb. """
              ret_beg = []
              ret_mid = []
-@@ -4926,23 +6281,30 @@ class YumBase(depsolve.Depsolve):
+@@ -4917,6 +6279,10 @@ class YumBase(depsolve.Depsolve):
+ 
+         if self.conf.installonly_limit < 1 :
+             return 
++
++        # We shouldn't alter the transaction if this is set...
++        if self.tsInfo._check_future_rpmdbv:
++            return
+             
+         toremove = []
+         #  We "probably" want to use either self.ts or self.rpmdb.ts if either
+@@ -4926,23 +6292,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)
@@ -190185,7 +190217,7 @@ index 99039e0..4833a6e 100644
              for po in installed:
                  if (po.version, po.release) == (cur_kernel_v, cur_kernel_r): 
                      # don't remove running
-@@ -4959,19 +6321,22 @@ class YumBase(depsolve.Depsolve):
+@@ -4959,19 +6332,22 @@ class YumBase(depsolve.Depsolve):
              txmbr.depends_on.append(rel)
  
      def processTransaction(self, callback=None,rpmTestDisplay=None, rpmDisplay=None):
@@ -190221,7 +190253,7 @@ index 99039e0..4833a6e 100644
          
          if not callback:
              callback = callbacks.ProcessTransNoOutputCallback()
-@@ -5062,8 +6427,8 @@ class YumBase(depsolve.Depsolve):
+@@ -5062,8 +6438,8 @@ class YumBase(depsolve.Depsolve):
                  raise Errors.YumRPMCheckError, retmsgs
              retmsgs = [_('ERROR with transaction check vs depsolve:')]
              retmsgs.extend(msgs) 
@@ -190232,7 +190264,7 @@ index 99039e0..4833a6e 100644
              raise Errors.YumRPMCheckError,retmsgs
          
          tsConf = {}
-@@ -5114,13 +6479,19 @@ class YumBase(depsolve.Depsolve):
+@@ -5114,13 +6490,19 @@ class YumBase(depsolve.Depsolve):
          return results
  
      def add_enable_repo(self, repoid, baseurls=[], mirrorlist=None, **kwargs):
@@ -190259,7 +190291,7 @@ index 99039e0..4833a6e 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 +6538,15 @@ class YumBase(depsolve.Depsolve):
+@@ -5167,9 +6549,15 @@ class YumBase(depsolve.Depsolve):
  
      def setCacheDir(self, force=False, tmpdir=None, reuse=True,
                      suffix='/$basearch/$releasever'):
@@ -190278,7 +190310,7 @@ index 99039e0..4833a6e 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 +6556,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5179,7 +6567,7 @@ class YumBase(depsolve.Depsolve):
          try:
              cachedir = misc.getCacheDir(tmpdir, reuse)
          except (IOError, OSError), e:
@@ -190287,7 +190319,7 @@ index 99039e0..4833a6e 100644
              cachedir = None
              
          if cachedir is None:
-@@ -5190,6 +6567,8 @@ class YumBase(depsolve.Depsolve):
+@@ -5190,6 +6578,8 @@ class YumBase(depsolve.Depsolve):
              self.prerepoconf.cachedir = cachedir
          else:
              self.repos.setCacheDir(cachedir)
@@ -190296,7 +190328,7 @@ index 99039e0..4833a6e 100644
          self.conf.cachedir = cachedir
          return True # We got a new cache dir
  
-@@ -5220,13 +6599,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5220,13 +6610,24 @@ class YumBase(depsolve.Depsolve):
          self.history.write_addon_data('config-repos', myrepos)
          
      def verify_plugins_cb(self, verify_package):
@@ -190324,7 +190356,7 @@ index 99039e0..4833a6e 100644
          if self.tsInfo._unresolvedMembers:
              if auto:
                  self.logger.critical(_("Dependencies not solved. Will not save unresolved transaction."))
-@@ -5234,7 +6624,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5234,7 +6635,7 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError(_("Dependencies not solved. Will not save unresolved transaction."))
          
          if not filename:
@@ -190333,7 +190365,7 @@ index 99039e0..4833a6e 100644
              fd,filename = tempfile.mkstemp(suffix='.yumtx', prefix=prefix)
              f = os.fdopen(fd, 'w')
          else:
-@@ -5244,13 +6634,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5244,13 +6645,17 @@ class YumBase(depsolve.Depsolve):
          
          msg = "%s\n" % self.rpmdb.simpleVersion(main_only=True)[0]
          msg += "%s\n" % self.ts.getTsFlags()
@@ -190354,7 +190386,7 @@ index 99039e0..4833a6e 100644
          msg += "%s\n" % len(self.tsInfo.getMembers())
          for txmbr in self.tsInfo.getMembers():
              msg += txmbr._dump()
-@@ -5260,42 +6654,84 @@ class YumBase(depsolve.Depsolve):
+@@ -5260,42 +6665,84 @@ class YumBase(depsolve.Depsolve):
          except (IOError, OSError), e:
              self._ts_save_file = None
              if auto:
@@ -190451,7 +190483,7 @@ index 99039e0..4833a6e 100644
              if ignorerpm:
                  msg += _(" ignoring, as requested.")
                  self.logger.critical(_(msg))
-@@ -5318,8 +6754,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5318,8 +6765,17 @@ class YumBase(depsolve.Depsolve):
          numrepos = int(data[2].strip())
          repos = []
          rindex=3+numrepos
@@ -190470,7 +190502,7 @@ index 99039e0..4833a6e 100644
  
          # pkgs/txmbrs
          numpkgs = int(data[rindex].strip())
-@@ -5329,6 +6774,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5329,6 +6785,7 @@ class YumBase(depsolve.Depsolve):
          pkgcount = 0
          pkgprob = False
          curpkg = None
@@ -190478,7 +190510,7 @@ index 99039e0..4833a6e 100644
          for l in data[pkgstart:]:
              l = l.rstrip()
              # our main txmbrs
-@@ -5356,6 +6802,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5356,6 +6813,7 @@ class YumBase(depsolve.Depsolve):
                      if not ignoremissing:
                          raise Errors.YumBaseError(msg)
                      else:
@@ -190486,7 +190518,7 @@ index 99039e0..4833a6e 100644
                          self.logger.critical(msg)
                  else:
                      pkgcount += 1
-@@ -5432,12 +6879,18 @@ class YumBase(depsolve.Depsolve):
+@@ -5432,12 +6890,18 @@ class YumBase(depsolve.Depsolve):
          if pkgprob:
              msg = _("Transaction members, relations are missing or ts has been modified,")
              if ignoremissing:
@@ -190505,7 +190537,7 @@ index 99039e0..4833a6e 100644
          return self.tsInfo.getMembers()
  
      def _remove_old_deps(self):
-@@ -5470,18 +6923,6 @@ class YumBase(depsolve.Depsolve):
+@@ -5470,18 +6934,6 @@ class YumBase(depsolve.Depsolve):
                      if requiring == required: # if they are self-requiring skip them
                          continue
                          
@@ -190524,7 +190556,7 @@ index 99039e0..4833a6e 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 +6974,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5533,7 +6985,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
@@ -190549,7 +190581,7 @@ index 99039e0..4833a6e 100644
                  visited[curpkg] = True
              all_leaves_visited = True
              leaves = curpkg.requiring_packages()
-@@ -5547,4 +7005,3 @@ class YumBase(depsolve.Depsolve):
+@@ -5547,4 +7016,3 @@ class YumBase(depsolve.Depsolve):
          # Debugging output
          self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has no user-installed revdeps."), pkg)
          return False
@@ -198830,7 +198862,7 @@ index e5e9ece..cfe7b05 100644
          fo = None
  
 diff --git a/yumcommands.py b/yumcommands.py
-index 4dcbea7..d02beb6 100644
+index 4dcbea7..1341f23 100644
 --- a/yumcommands.py
 +++ b/yumcommands.py
 @@ -13,6 +13,7 @@
@@ -201173,7 +201205,7 @@ index 4dcbea7..d02beb6 100644
          if len(extcmds) == 0:
              base.usage()
              raise cli.CliError
-@@ -1147,79 +2428,219 @@ class HelpCommand(YumCommand):
+@@ -1147,82 +2428,230 @@ class HelpCommand(YumCommand):
          return help_output
  
      def doCommand(self, base, basecmd, extcmds):
@@ -201403,7 +201435,55 @@ index 4dcbea7..d02beb6 100644
          vcmd = 'installed'
          if extcmds:
              vcmd = extcmds[0]
-@@ -1288,7 +2709,7 @@ class VersionCommand(YumCommand):
++        if vcmd in ('grouplist', 'groupinfo',
++                    'nogroups', 'nogroups-installed', 'nogroups-available',
++                    'nogroups-all',
++                    'installed', 'all', 'group-installed', 'group-all',
++                    'available', 'all', 'group-available', 'group-all'):
++            extcmds = extcmds[1:]
++        else:
++            vcmd = 'installed'
+ 
+         def _append_repos(cols, repo_data):
+             for repoid in sorted(repo_data):
+@@ -1264,7 +2693,7 @@ class VersionCommand(YumCommand):
+ 
+         if vcmd == 'groupinfo':
+             for group in groups:
+-                if group not in extcmds[1:]:
++                if group not in extcmds:
+                     continue
+                 print _(" Group   :"), group
+                 print _(" Packages:")
+@@ -1284,11 +2713,35 @@ class VersionCommand(YumCommand):
+ 
+             return 0, ['version groupinfo']
+ 
++        # Have a way to manually specify a dynamic group of packages, whee.
++        if not vcmd.startswith("group-") and extcmds:
++            for dgrp in extcmds:
++                if '/' not in dgrp:
++                    # It's a package name, add it to the cmd line group...
++                    if '<cmd line>' not in groups:
++                        groups['<cmd line>'] = set()
++                    groups['<cmd line>'].add(dgrp)
++                else: # It's a file containing a list of packages...
++                    if not os.path.exists(dgrp):
++                        base.logger.warn(_(" File doesn't exist: %s"), dgrp)
++                    else:
++                        pkg_names = open(dgrp).readlines()
++                        pkg_names = set(n.strip() for n in pkg_names)
++                        dgrp = os.path.basename(dgrp)
++                        if dgrp in groups:
++                            for num in range(1, 100):
++                                ndgrp = dgrp + str(num)
++                                if ndgrp in groups:
++                                    continue
++                                dgrp = ndgrp
++                                break
++                        groups[dgrp] = pkg_names
++
+         rel = base.conf.yumvar['releasever']
          ba  = base.conf.yumvar['basearch']
          cols = []
          if vcmd in ('installed', 'all', 'group-installed', 'group-all'):
@@ -201412,7 +201492,13 @@ index 4dcbea7..d02beb6 100644
                  data = base.rpmdb.simpleVersion(not verbose, groups=groups)
                  lastdbv = base.history.last()
                  if lastdbv is not None:
-@@ -1307,10 +2728,9 @@ class VersionCommand(YumCommand):
+@@ -1302,15 +2755,14 @@ class VersionCommand(YumCommand):
+                 if groups:
+                     for grp in sorted(data[2]):
+                         if (vcmd.startswith("group-") and
+-                            len(extcmds) > 1 and grp not in extcmds[1:]):
++                            extcmds and grp not in extcmds):
+                             continue
                          cols.append(("%s %s" % (_("Group-Installed:"), grp),
                                       str(data[2][grp])))
                          _append_repos(cols, data[3][grp])
@@ -201425,7 +201511,14 @@ index 4dcbea7..d02beb6 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),
-@@ -1326,8 +2746,6 @@ class VersionCommand(YumCommand):
+@@ -1320,14 +2772,12 @@ class VersionCommand(YumCommand):
+                 if groups:
+                     for grp in sorted(data[2]):
+                         if (vcmd.startswith("group-") and
+-                            len(extcmds) > 1 and grp not in extcmds[1:]):
++                            extcmds and grp not in extcmds):
+                             continue
+                         cols.append(("%s %s" % (_("Group-Available:"), grp),
                                       str(data[2][grp])))
                          if verbose:
                              _append_repos(cols, data[3][grp])
@@ -201434,7 +201527,7 @@ index 4dcbea7..d02beb6 100644
  
          data = {'rid' : {}, 'ver' : {}}
          for (rid, ver) in cols:
-@@ -1344,6 +2762,14 @@ class VersionCommand(YumCommand):
+@@ -1344,6 +2794,14 @@ class VersionCommand(YumCommand):
          return 0, ['version']
  
      def needTs(self, base, basecmd, extcmds):
@@ -201449,7 +201542,7 @@ index 4dcbea7..d02beb6 100644
          vcmd = 'installed'
          if extcmds:
              vcmd = extcmds[0]
-@@ -1352,25 +2778,74 @@ class VersionCommand(YumCommand):
+@@ -1352,25 +2810,74 @@ class VersionCommand(YumCommand):
              return True
          return vcmd in ('available', 'all', 'group-available', 'group-all')
  
@@ -201525,7 +201618,7 @@ index 4dcbea7..d02beb6 100644
              return 2, ["Repeating transaction %u" % (old.tid,)]
  
      def _hcmd_undo(self, base, extcmds):
-@@ -1426,12 +2901,57 @@ class HistoryCommand(YumCommand):
+@@ -1426,12 +2933,57 @@ class HistoryCommand(YumCommand):
      def _hcmd_new(self, base, extcmds):
          base.history._create_db_file()
  
@@ -201584,7 +201677,7 @@ index 4dcbea7..d02beb6 100644
          if extcmds and extcmds[0] not in cmds:
              base.logger.critical(_('Invalid history sub-command, use: %s.'),
                                   ", ".join(cmds))
-@@ -1444,6 +2964,19 @@ class HistoryCommand(YumCommand):
+@@ -1444,6 +2996,19 @@ class HistoryCommand(YumCommand):
              raise cli.CliError
  
      def doCommand(self, base, basecmd, extcmds):
@@ -201604,7 +201697,7 @@ index 4dcbea7..d02beb6 100644
          vcmd = 'list'
          if extcmds:
              vcmd = extcmds[0]
-@@ -1468,29 +3001,88 @@ class HistoryCommand(YumCommand):
+@@ -1468,29 +3033,88 @@ class HistoryCommand(YumCommand):
              ret = self._hcmd_rollback(base, extcmds)
          elif vcmd == 'new':
              ret = self._hcmd_new(base, extcmds)
@@ -201693,7 +201786,7 @@ index 4dcbea7..d02beb6 100644
          chkcmd = 'all'
          if extcmds:
              chkcmd = extcmds
-@@ -1505,33 +3097,1113 @@ class CheckRpmdbCommand(YumCommand):
+@@ -1505,33 +3129,1113 @@ class CheckRpmdbCommand(YumCommand):
          return rc, ['%s %s' % (basecmd, chkcmd)]
  
      def needTs(self, base, basecmd, extcmds):
diff --git a/yum.spec b/yum.spec
index 7e207f1..d5c6f57 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: 97%{?dist}
+Release: 98%{?dist}
 License: GPLv2+
 Group: System Environment/Base
 Source0: http://yum.baseurl.org/download/3.4/%{name}-%{version}.tar.gz
@@ -403,6 +403,14 @@ exit 0
 %endif
 
 %changelog
+* Wed Jun 19 2013 James Antill <james at fedoraproject.org> - 3.4.3-98
+- Update to latest HEAD.
+- Add simple way to specify a group of pkgs. for version. BZ 913461.
+- Change group install => group upgrade for installed groups. BZ 833087.
+- Give more text when telling user about y-c-t, mention history. BZ 974576.
+- Fix the tolerant yum.conf text.
+- Skip installonly limit, if something has set check_future_rpmdbv. BZ 962757.
+
 * Mon Jun 17 2013 James Antill <james at fedoraproject.org> - 3.4.3-97
 - Update to latest HEAD.
 - Minor updates to fssnapshot command.


More information about the scm-commits mailing list