[yum] update to latest HEAD

James Antill james at fedoraproject.org
Fri Feb 21 21:26:31 UTC 2014


commit a4c7ebfe1b2e5ab87be2cfce3fb480cd011a7d15
Author: James Antill <james at and.org>
Date:   Fri Feb 21 16:27:15 2014 -0500

    update to latest HEAD
    
    - Copy packages in/out of an installroot, for no downloads creating containers.
    - A few cleanups for the fs sub-command UI.
    - Add spec requires for fs sub-command.

 yum-HEAD.patch |  603 ++++++++++++++++++++++++++++++++------------------------
 yum.spec       |   12 +-
 2 files changed, 360 insertions(+), 255 deletions(-)
---
diff --git a/yum-HEAD.patch b/yum-HEAD.patch
index d3fa4ed..8ca4525 100644
--- a/yum-HEAD.patch
+++ b/yum-HEAD.patch
@@ -186404,10 +186404,10 @@ index 1ce4720..2f3f7a3
      gobject.threads_init()
      dbus.glib.threads_init()
 diff --git a/yum.spec b/yum.spec
-index abd203f..93cfa14 100644
+index abd203f..854baf3 100644
 --- a/yum.spec
 +++ b/yum.spec
-@@ -1,24 +1,104 @@
+@@ -1,24 +1,107 @@
 -Summary: RPM installer/updater
 +%define move_yum_conf_back 1
 +%define auto_sitelib 1
@@ -186514,11 +186514,14 @@ index abd203f..93cfa14 100644
 +Requires: pyliblzma
 +# Not really a suggests anymore, due to metadata using it.
 +Requires: pyxattr
++# Suggests, needed for yum fs diff
++Requires: diffutils
++Requires: cpio
 +
  Conflicts: rpm >= 5-0
  # Zif is a re-implementation of yum in C, however:
  #
-@@ -34,18 +114,32 @@ Conflicts: rpm >= 5-0
+@@ -34,18 +117,32 @@ Conflicts: rpm >= 5-0
  # zif experts).
  #
  # ...so we have two sane choices: i) Conflict with it. 2) Stop developing yum.
@@ -186558,7 +186561,7 @@ index abd203f..93cfa14 100644
  
  %description
  Yum is a utility that can check for and automatically download and
-@@ -58,9 +152,11 @@ Group: Applications/System
+@@ -58,9 +155,11 @@ Group: Applications/System
  Requires: yum = %{version}-%{release}
  Requires: dbus-python
  Requires: pygobject2
@@ -186572,7 +186575,7 @@ index abd203f..93cfa14 100644
  Requires(postun): /sbin/service
  
  
-@@ -68,20 +164,69 @@ Requires(postun): /sbin/service
+@@ -68,20 +167,69 @@ Requires(postun): /sbin/service
  yum-updatesd provides a daemon which checks for available updates and 
  can notify you when they are available via email, syslog or dbus. 
  
@@ -186647,7 +186650,7 @@ index abd203f..93cfa14 100644
  
  %prep
  %setup -q
-@@ -89,12 +234,46 @@ Install this package if you want auto yum updates nightly via cron.
+@@ -89,12 +237,46 @@ Install this package if you want auto yum updates nightly via cron.
  %build
  make
  
@@ -186697,7 +186700,7 @@ index abd203f..93cfa14 100644
  
  # Ghost files:
  mkdir -p $RPM_BUILD_ROOT/var/lib/yum/history
-@@ -102,12 +281,31 @@ mkdir -p $RPM_BUILD_ROOT/var/lib/yum/plugins
+@@ -102,12 +284,31 @@ mkdir -p $RPM_BUILD_ROOT/var/lib/yum/plugins
  mkdir -p $RPM_BUILD_ROOT/var/lib/yum/yumdb
  touch $RPM_BUILD_ROOT/var/lib/yum/uuid
  
@@ -186729,7 +186732,7 @@ index abd203f..93cfa14 100644
  %post updatesd
  /sbin/chkconfig --add yum-updatesd
  /sbin/service yum-updatesd condrestart >/dev/null 2>&1
-@@ -119,9 +317,29 @@ if [ $1 = 0 ]; then
+@@ -119,9 +320,29 @@ if [ $1 = 0 ]; then
   /sbin/service yum-updatesd stop >/dev/null 2>&1
  fi
  exit 0
@@ -186760,7 +186763,7 @@ index abd203f..93cfa14 100644
  # Make sure chkconfig knows about the service
  /sbin/chkconfig --add yum-cron
  # if an upgrade:
-@@ -144,8 +362,13 @@ if [ "$1" -ge "1" ]; then
+@@ -144,8 +365,13 @@ if [ "$1" -ge "1" ]; then
   fi
  fi 
  exit 0
@@ -186774,7 +186777,7 @@ index abd203f..93cfa14 100644
  # if this will be a complete removeal of yum-cron rather than an upgrade,
  # remove the service from chkconfig control
  if [ $1 = 0 ]; then
-@@ -153,33 +376,59 @@ if [ $1 = 0 ]; then
+@@ -153,33 +379,59 @@ if [ $1 = 0 ]; then
   /sbin/service yum-cron stop 1> /dev/null 2>&1
  fi
  exit 0
@@ -186841,7 +186844,7 @@ index abd203f..93cfa14 100644
  %dir /var/cache/yum
  %dir /var/lib/yum
  %ghost /var/lib/yum/uuid
-@@ -188,20 +437,46 @@ exit 0
+@@ -188,20 +440,46 @@ exit 0
  %ghost /var/lib/yum/yumdb
  %{_mandir}/man*/yum.*
  %{_mandir}/man*/yum-shell*
@@ -186893,7 +186896,7 @@ index abd203f..93cfa14 100644
  %files updatesd
  %defattr(-, root, root)
  %config(noreplace) %{_sysconfdir}/yum/yum-updatesd.conf
-@@ -210,8 +485,12 @@ exit 0
+@@ -210,8 +488,12 @@ exit 0
  %{_datadir}/yum-cli/yumupd.py*
  %{_sbindir}/yum-updatesd
  %{_mandir}/man*/yum-updatesd*
@@ -186962,7 +186965,7 @@ index c1af4ad..2c2f022 100644
      pass
      
 diff --git a/yum/__init__.py b/yum/__init__.py
-index 99039e0..37ab468 100644
+index 99039e0..dc468cb 100644
 --- a/yum/__init__.py
 +++ b/yum/__init__.py
 @@ -21,6 +21,7 @@ The Yum RPM software updater.
@@ -186973,8 +186976,11 @@ index 99039e0..37ab468 100644
  
  def _rpm_ver_atleast(vertup):
      """ Check if rpm is at least the current vertup. Can return False/True/None
-@@ -46,8 +47,13 @@ import operator
+@@ -44,10 +45,16 @@ import logging
+ import logging.config
+ import operator
  import tempfile
++import shutil
  
  import yum.i18n
 -_ = yum.i18n._
@@ -186989,7 +186995,7 @@ index 99039e0..37ab468 100644
  
  import config
  from config import ParsingError, ConfigParser
-@@ -73,6 +79,9 @@ import logginglevels
+@@ -73,6 +80,9 @@ import logginglevels
  import yumRepo
  import callbacks
  import yum.history
@@ -186999,7 +187005,7 @@ index 99039e0..37ab468 100644
  
  import warnings
  warnings.simplefilter("ignore", Errors.YumFutureDeprecationWarning)
-@@ -82,7 +91,8 @@ from packages import YumAvailablePackage, YumLocalPackage, YumInstalledPackage
+@@ -82,7 +92,8 @@ from packages import YumAvailablePackage, YumLocalPackage, YumInstalledPackage
  from packages import YumUrlPackage, YumNotFoundPackage
  from constants import *
  from yum.rpmtrans import RPMTransaction,SimpleCliCallBack
@@ -187009,7 +187015,7 @@ index 99039e0..37ab468 100644
  
  import string
  import StringIO
-@@ -102,10 +112,12 @@ default_grabber.opts.user_agent += " yum/" + __version__
+@@ -102,10 +113,12 @@ default_grabber.opts.user_agent += " yum/" + __version__
  
  
  class _YumPreBaseConf:
@@ -187026,7 +187032,7 @@ index 99039e0..37ab468 100644
      def __init__(self):
          self.fn = '/etc/yum/yum.conf'
          self.root = '/'
-@@ -125,12 +137,15 @@ class _YumPreBaseConf:
+@@ -125,12 +138,15 @@ class _YumPreBaseConf:
  
  
  class _YumPreRepoConf:
@@ -187046,7 +187052,7 @@ index 99039e0..37ab468 100644
          self.callback = None
          self.failure_callback = None
          self.interrupt_callback = None
-@@ -164,11 +179,11 @@ class _YumCostExclude:
+@@ -164,11 +180,11 @@ class _YumCostExclude:
          return False
  
  class YumBase(depsolve.Depsolve):
@@ -187063,7 +187069,7 @@ index 99039e0..37ab468 100644
      def __init__(self):
          depsolve.Depsolve.__init__(self)
          self._conf = None
-@@ -177,9 +192,12 @@ class YumBase(depsolve.Depsolve):
+@@ -177,9 +193,12 @@ class YumBase(depsolve.Depsolve):
          self._up = None
          self._comps = None
          self._history = None
@@ -187076,7 +187082,7 @@ index 99039e0..37ab468 100644
          self._ts_save_file = None
          self.skipped_packages = []   # packages skip by the skip-broken code
          self._not_found_a = {}
-@@ -204,6 +222,9 @@ class YumBase(depsolve.Depsolve):
+@@ -204,6 +223,9 @@ class YumBase(depsolve.Depsolve):
  
          self.run_with_package_names = set()
          self._cleanup = []
@@ -187086,7 +187092,7 @@ index 99039e0..37ab468 100644
  
      def __del__(self):
          self.close()
-@@ -213,10 +234,15 @@ class YumBase(depsolve.Depsolve):
+@@ -213,10 +235,15 @@ class YumBase(depsolve.Depsolve):
          for cb in self._cleanup: cb()
  
      def close(self):
@@ -187102,7 +187108,7 @@ index 99039e0..37ab468 100644
          if self._repos:
              self._repos.close()
  
-@@ -225,15 +251,33 @@ class YumBase(depsolve.Depsolve):
+@@ -225,15 +252,33 @@ class YumBase(depsolve.Depsolve):
          return transactioninfo.TransactionData()
  
      def doGenericSetup(self, cache=0):
@@ -187138,7 +187144,7 @@ index 99039e0..37ab468 100644
          warnings.warn(_('doConfigSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -297,15 +341,17 @@ class YumBase(depsolve.Depsolve):
+@@ -297,15 +342,17 @@ class YumBase(depsolve.Depsolve):
              # Try the old default
              fn = '/etc/yum.conf'
  
@@ -187159,7 +187165,7 @@ index 99039e0..37ab468 100644
  
          if debuglevel != None:
              startupconf.debuglevel = debuglevel
-@@ -336,6 +382,12 @@ class YumBase(depsolve.Depsolve):
+@@ -336,6 +383,12 @@ class YumBase(depsolve.Depsolve):
  
          self._conf = config.readMainConfig(startupconf)
  
@@ -187172,7 +187178,7 @@ index 99039e0..37ab468 100644
          #  We don't want people accessing/altering preconf after it becomes
          # worthless. So we delete it, and thus. it'll raise AttributeError
          del self.preconf
-@@ -367,22 +419,36 @@ class YumBase(depsolve.Depsolve):
+@@ -367,22 +420,36 @@ class YumBase(depsolve.Depsolve):
      def doLoggingSetup(self, debuglevel, errorlevel,
                         syslog_ident=None, syslog_facility=None,
                         syslog_device='/dev/log'):
@@ -187216,7 +187222,7 @@ index 99039e0..37ab468 100644
          if repo_age is None:
              repo_age = os.stat(repofn)[8]
          
-@@ -391,8 +457,7 @@ class YumBase(depsolve.Depsolve):
+@@ -391,8 +458,7 @@ class YumBase(depsolve.Depsolve):
          try:
              parser.readfp(confpp_obj)
          except ParsingError, e:
@@ -187226,7 +187232,7 @@ index 99039e0..37ab468 100644
  
          # Check sections in the .repo file that was just slurped up
          for section in parser.sections():
-@@ -429,7 +494,21 @@ class YumBase(depsolve.Depsolve):
+@@ -429,7 +495,21 @@ class YumBase(depsolve.Depsolve):
  
                  thisrepo.base_persistdir = self.conf._repos_persistdir
  
@@ -187248,7 +187254,7 @@ index 99039e0..37ab468 100644
              if thisrepo.id in self.repo_setopts:
                  for opt in self.repo_setopts[thisrepo.id].items:
                      if not hasattr(thisrepo, opt):
-@@ -440,6 +519,20 @@ class YumBase(depsolve.Depsolve):
+@@ -440,6 +520,20 @@ class YumBase(depsolve.Depsolve):
              if validate and not validate(thisrepo):
                  continue
                      
@@ -187269,7 +187275,7 @@ index 99039e0..37ab468 100644
              # Got our list of repo objects, add them to the repos
              # collection
              try:
-@@ -448,8 +541,11 @@ class YumBase(depsolve.Depsolve):
+@@ -448,8 +542,11 @@ class YumBase(depsolve.Depsolve):
                  self.logger.warning(e)
          
      def getReposFromConfig(self):
@@ -187283,7 +187289,7 @@ index 99039e0..37ab468 100644
          # Read .repo files from directories specified by the reposdir option
          # (typically /etc/yum/repos.d)
          repo_config_age = self.conf.config_file_age
-@@ -466,18 +562,22 @@ class YumBase(depsolve.Depsolve):
+@@ -466,18 +563,22 @@ class YumBase(depsolve.Depsolve):
  
              if os.path.isdir(reposdir):
                  for repofn in sorted(glob.glob('%s/*.repo' % reposdir)):
@@ -187311,7 +187317,7 @@ index 99039e0..37ab468 100644
          repo = yumRepo.YumRepository(section)
          try:
              repo.populate(parser, section, self.conf)
-@@ -493,38 +593,40 @@ class YumBase(depsolve.Depsolve):
+@@ -493,38 +594,40 @@ class YumBase(depsolve.Depsolve):
          repo.name = to_unicode(repo.name)
  
          # Set attributes not from the config file
@@ -187374,7 +187380,7 @@ index 99039e0..37ab468 100644
          if isinstance(self.plugins, plugins.YumPlugins):
              raise RuntimeError(_("plugins already initialised"))
  
-@@ -533,6 +635,8 @@ class YumBase(depsolve.Depsolve):
+@@ -533,6 +636,8 @@ class YumBase(depsolve.Depsolve):
  
      
      def doRpmDBSetup(self):
@@ -187383,7 +187389,7 @@ index 99039e0..37ab468 100644
          warnings.warn(_('doRpmDBSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -552,7 +656,8 @@ class YumBase(depsolve.Depsolve):
+@@ -552,7 +657,8 @@ class YumBase(depsolve.Depsolve):
          return self._rpmdb
  
      def closeRpmDB(self):
@@ -187393,7 +187399,7 @@ index 99039e0..37ab468 100644
          if self._rpmdb is not None:
              self._rpmdb.ts = None
              self._rpmdb.dropCachedData()
-@@ -561,12 +666,19 @@ class YumBase(depsolve.Depsolve):
+@@ -561,12 +667,19 @@ class YumBase(depsolve.Depsolve):
          self._tsInfo = None
          self._up = None
          self.comps = None
@@ -187413,7 +187419,20 @@ index 99039e0..37ab468 100644
          warnings.warn(_('doRepoSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -588,7 +700,8 @@ class YumBase(depsolve.Depsolve):
+@@ -577,6 +690,12 @@ class YumBase(depsolve.Depsolve):
+         if hasattr(self, 'prerepoconf'):
+             self.conf # touch the config class first
+ 
++            if (self.conf.installroot != '/' and
++                not hasattr(self, '_old_cachedir')):
++                # Try loading cache from outside...
++                ir = len(self.conf.installroot)
++                self._old_cachedir = self.conf.cachedir[ir:]
++
+             self.getReposFromConfig()
+ 
+         #  For rhnplugin, and in theory other stuff, calling
+@@ -588,7 +707,8 @@ class YumBase(depsolve.Depsolve):
              prerepoconf = self.prerepoconf
              del self.prerepoconf
  
@@ -187423,7 +187442,7 @@ index 99039e0..37ab468 100644
              self.repos.callback = prerepoconf.callback
              self.repos.setFailureCallback(prerepoconf.failure_callback)
              self.repos.setInterruptCallback(prerepoconf.interrupt_callback)
-@@ -602,24 +715,6 @@ class YumBase(depsolve.Depsolve):
+@@ -602,24 +722,6 @@ class YumBase(depsolve.Depsolve):
  
  
          if doSetup:
@@ -187448,7 +187467,7 @@ index 99039e0..37ab468 100644
              repo_st = time.time()        
              self._repos.doSetup(thisrepo)
              self.verbose_logger.debug('repo time: %0.3f' % (time.time() - repo_st))        
-@@ -630,6 +725,14 @@ class YumBase(depsolve.Depsolve):
+@@ -630,6 +732,14 @@ class YumBase(depsolve.Depsolve):
          self._repos = RepoStorage(self)
      
      def doSackSetup(self, archlist=None, thisrepo=None):
@@ -187463,7 +187482,7 @@ index 99039e0..37ab468 100644
          warnings.warn(_('doSackSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -711,6 +814,9 @@ class YumBase(depsolve.Depsolve):
+@@ -711,6 +821,9 @@ class YumBase(depsolve.Depsolve):
              
             
      def doUpdateSetup(self):
@@ -187473,7 +187492,7 @@ index 99039e0..37ab468 100644
          warnings.warn(_('doUpdateSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -765,6 +871,8 @@ class YumBase(depsolve.Depsolve):
+@@ -765,6 +878,8 @@ class YumBase(depsolve.Depsolve):
          return self._up
      
      def doGroupSetup(self):
@@ -187482,7 +187501,7 @@ index 99039e0..37ab468 100644
          warnings.warn(_('doGroupSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -776,7 +884,12 @@ class YumBase(depsolve.Depsolve):
+@@ -776,7 +891,12 @@ class YumBase(depsolve.Depsolve):
              # if we unset the comps object, we need to undo which repos have
              # been added to the group file as well
              if self._repos:
@@ -187496,7 +187515,7 @@ index 99039e0..37ab468 100644
                      repo.groups_added = False
          self._comps = val
      
-@@ -813,6 +926,21 @@ class YumBase(depsolve.Depsolve):
+@@ -813,6 +933,21 @@ class YumBase(depsolve.Depsolve):
          overwrite = self.conf.overwrite_groups
          self._comps = comps.Comps(overwrite_groups = overwrite)
  
@@ -187518,7 +187537,7 @@ index 99039e0..37ab468 100644
          for repo in reposWithGroups:
              if repo.groups_added: # already added the groups from this repo
                  continue
-@@ -820,16 +948,14 @@ class YumBase(depsolve.Depsolve):
+@@ -820,16 +955,14 @@ class YumBase(depsolve.Depsolve):
              self.verbose_logger.log(logginglevels.DEBUG_4,
                  _('Adding group file from repository: %s'), repo)
              groupfile = repo.getGroups()
@@ -187540,7 +187559,7 @@ index 99039e0..37ab468 100644
                  self.logger.critical(msg)
              else:
                  repo.groups_added = True
-@@ -837,7 +963,10 @@ class YumBase(depsolve.Depsolve):
+@@ -837,7 +970,10 @@ class YumBase(depsolve.Depsolve):
          if self._comps.compscount == 0:
              raise Errors.GroupsError, _('No Groups Available in any repository')
  
@@ -187552,7 +187571,7 @@ index 99039e0..37ab468 100644
          self.verbose_logger.debug('group time: %0.3f' % (time.time() - group_st))                
          return self._comps
  
-@@ -868,22 +997,72 @@ class YumBase(depsolve.Depsolve):
+@@ -868,22 +1004,72 @@ class YumBase(depsolve.Depsolve):
                      # feed it into _tags.add()
                      self._tags.add(repo.id, tag_sqlite)
                  except (Errors.RepoError, Errors.PkgTagsError), e:
@@ -187627,7 +187646,7 @@ index 99039e0..37ab468 100644
      # properties so they auto-create themselves with defaults
      repos = property(fget=lambda self: self._getRepos(),
                       fset=lambda self, value: setattr(self, "_repos", value),
-@@ -921,16 +1100,31 @@ class YumBase(depsolve.Depsolve):
+@@ -921,16 +1107,31 @@ class YumBase(depsolve.Depsolve):
                         fdel=lambda self: setattr(self, "_history", None),
                         doc="Yum History Object")
  
@@ -187663,7 +187682,7 @@ index 99039e0..37ab468 100644
          necessary = False
          
          # I can't think of a nice way of doing this, we have to have the sack here
-@@ -951,25 +1145,37 @@ class YumBase(depsolve.Depsolve):
+@@ -951,25 +1152,37 @@ class YumBase(depsolve.Depsolve):
              self.repos.populateSack(mdtype='filelists')
             
      def yumUtilsMsg(self, func, prog):
@@ -187712,7 +187731,7 @@ index 99039e0..37ab468 100644
              self.logger.critical(msg)
              self.yumUtilsMsg(self.logger.critical, "yum-complete-transaction")
              time.sleep(3)
-@@ -1004,7 +1210,7 @@ class YumBase(depsolve.Depsolve):
+@@ -1004,7 +1217,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 )
  
@@ -187721,7 +187740,7 @@ index 99039e0..37ab468 100644
              self.tsInfo.pkgSack.dropCachedData()
  
          # FIXME: This is horrible, see below and yummain. Maybe create a real
-@@ -1044,6 +1250,39 @@ class YumBase(depsolve.Depsolve):
+@@ -1044,6 +1257,39 @@ class YumBase(depsolve.Depsolve):
                  if first.verEQ(other):
                      continue
                  msg = _('Protected multilib versions: %s != %s')
@@ -187761,7 +187780,7 @@ index 99039e0..37ab468 100644
                  xrestring.append(msg % (first, other))
          if xrestring:
              rescode = 1
-@@ -1227,7 +1466,7 @@ class YumBase(depsolve.Depsolve):
+@@ -1227,7 +1473,7 @@ class YumBase(depsolve.Depsolve):
                  self.verbose_logger.info(msg)
              self.skipped_packages.extend(skipped_list)   # make the skipped packages public
          else:
@@ -187770,7 +187789,7 @@ index 99039e0..37ab468 100644
              self.verbose_logger.info("Skip-broken could not solve problems")
              return 1, orig_restring
          return rescode, restring
-@@ -1242,13 +1481,15 @@ class YumBase(depsolve.Depsolve):
+@@ -1242,13 +1488,15 @@ class YumBase(depsolve.Depsolve):
          if None in pkgtup:
              return None
          return pkgtup
@@ -187790,7 +187809,7 @@ index 99039e0..37ab468 100644
          if pkgtup is None:
              return
          self._not_found_i[pkgtup] = YumNotFoundPackage(pkgtup)
-@@ -1267,7 +1508,7 @@ class YumBase(depsolve.Depsolve):
+@@ -1267,7 +1515,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
@@ -187799,7 +187818,7 @@ index 99039e0..37ab468 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)
-@@ -1275,14 +1516,14 @@ class YumBase(depsolve.Depsolve):
+@@ -1275,14 +1523,14 @@ class YumBase(depsolve.Depsolve):
      def _checkUpdatedLeftovers(self):
          """ 
          If multiple packages is updated the same package
@@ -187816,7 +187835,7 @@ index 99039e0..37ab468 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 +1620,19 @@ class YumBase(depsolve.Depsolve):
+@@ -1379,9 +1627,19 @@ class YumBase(depsolve.Depsolve):
  
      def _getDepsToRemove(self,po, deptree, toRemove):
          for dep in deptree.get(po, []): # Loop trough all deps of po
@@ -187836,7 +187855,7 @@ index 99039e0..37ab468 100644
              toRemove.add(dep)
              self._getDepsToRemove(dep, deptree, toRemove)
  
-@@ -1454,7 +1705,46 @@ class YumBase(depsolve.Depsolve):
+@@ -1454,7 +1712,46 @@ class YumBase(depsolve.Depsolve):
          return probs
  
      def runTransaction(self, cb):
@@ -187884,7 +187903,7 @@ index 99039e0..37ab468 100644
  
          self.plugins.run('pretrans')
  
-@@ -1516,10 +1806,23 @@ class YumBase(depsolve.Depsolve):
+@@ -1516,10 +1813,23 @@ class YumBase(depsolve.Depsolve):
                  pass
          self._ts_save_file = None
          
@@ -187908,7 +187927,7 @@ index 99039e0..37ab468 100644
          
          # make resultobject - just a plain yumgenericholder object
          resultobject = misc.GenericHolder()
-@@ -1544,8 +1847,7 @@ class YumBase(depsolve.Depsolve):
+@@ -1544,8 +1854,7 @@ class YumBase(depsolve.Depsolve):
                                            errors=errors)
  
                            
@@ -187918,7 +187937,7 @@ index 99039e0..37ab468 100644
              self.cleanUsedHeadersPackages()
          
          for i in ('ts_all_fn', 'ts_done_fn'):
-@@ -1567,13 +1869,35 @@ class YumBase(depsolve.Depsolve):
+@@ -1567,13 +1876,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):
@@ -187959,7 +187978,7 @@ index 99039e0..37ab468 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,24 +1908,58 @@ class YumBase(depsolve.Depsolve):
+@@ -1584,24 +1915,58 @@ 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
@@ -188020,7 +188039,7 @@ index 99039e0..37ab468 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 +1988,10 @@ class YumBase(depsolve.Depsolve):
+@@ -1630,6 +1995,10 @@ class YumBase(depsolve.Depsolve):
                      if md:
                          po.yumdb_info.from_repo_timestamp = str(md.timestamp)
  
@@ -188031,7 +188050,7 @@ index 99039e0..37ab468 100644
                  loginuid = misc.getloginuid()
                  if txmbr.updates or txmbr.downgrades or txmbr.reinstall:
                      if txmbr.updates:
-@@ -1640,11 +2002,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1640,11 +2009,16 @@ class YumBase(depsolve.Depsolve):
                          opo = po
                      if 'installed_by' in opo.yumdb_info:
                          po.yumdb_info.installed_by = opo.yumdb_info.installed_by
@@ -188048,7 +188067,7 @@ index 99039e0..37ab468 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 +2029,13 @@ class YumBase(depsolve.Depsolve):
+@@ -1662,10 +2036,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
@@ -188062,7 +188081,7 @@ index 99039e0..37ab468 100644
                  self.verbose_logger.log(logginglevels.DEBUG_2, 'What is this? %s' % txmbr.po)
  
          self.plugins.run('postverifytrans')
-@@ -1680,10 +2050,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1680,10 +2057,11 @@ class YumBase(depsolve.Depsolve):
          self.verbose_logger.debug('VerifyTransaction time: %0.3f' % (time.time() - vt_st))
  
      def costExcludePackages(self):
@@ -188078,7 +188097,7 @@ index 99039e0..37ab468 100644
          # if all the repo.costs are equal then don't bother running things
          costs = {}
          for r in self.repos.listEnabled():
-@@ -1705,10 +2076,12 @@ class YumBase(depsolve.Depsolve):
+@@ -1705,10 +2083,12 @@ class YumBase(depsolve.Depsolve):
              done = True
  
      def excludePackages(self, repo=None):
@@ -188094,7 +188113,7 @@ index 99039e0..37ab468 100644
          if "all" in self.conf.disable_excludes:
              return
          
-@@ -1735,9 +2108,14 @@ class YumBase(depsolve.Depsolve):
+@@ -1735,9 +2115,14 @@ class YumBase(depsolve.Depsolve):
              self.pkgSack.addPackageExcluder(repoid, exid,'exclude.match', match)
  
      def includePackages(self, repo):
@@ -188112,7 +188131,7 @@ index 99039e0..37ab468 100644
          includelist = repo.getIncludePkgList()
          
          if len(includelist) == 0:
-@@ -1757,8 +2135,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1757,8 +2142,11 @@ class YumBase(depsolve.Depsolve):
          self.pkgSack.addPackageExcluder(repo.id, exid, 'exclude.marked')
          
      def doLock(self, lockfile = YUM_PID_FILE):
@@ -188126,7 +188145,7 @@ index 99039e0..37ab468 100644
          if self.conf.uid != 0:
              #  If we are a user, assume we are using the root cache ... so don't
              # bother locking.
-@@ -1773,39 +2154,39 @@ class YumBase(depsolve.Depsolve):
+@@ -1773,39 +2161,39 @@ class YumBase(depsolve.Depsolve):
          lockfile = os.path.normpath(lockfile) # get rid of silly preceding extra /
          
          mypid=str(os.getpid())    
@@ -188194,7 +188213,7 @@ index 99039e0..37ab468 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 +2211,74 @@ class YumBase(depsolve.Depsolve):
+@@ -1830,31 +2218,74 @@ class YumBase(depsolve.Depsolve):
          self._unlock(lockfile)
          self._lockfile = None
          
@@ -188281,7 +188300,7 @@ index 99039e0..37ab468 100644
          failed = False
  
          if type(fo) is types.InstanceType:
-@@ -1877,10 +2301,10 @@ class YumBase(depsolve.Depsolve):
+@@ -1877,10 +2308,10 @@ class YumBase(depsolve.Depsolve):
              cursize = os.stat(fo)[6]
              totsize = long(po.size)
              if cursize >= totsize and not po.repo.cache:
@@ -188295,7 +188314,7 @@ index 99039e0..37ab468 100644
                      os.unlink(fo)
  
              if raiseError:
-@@ -1894,9 +2318,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1894,9 +2325,16 @@ class YumBase(depsolve.Depsolve):
          
          
      def verifyChecksum(self, fo, checksumType, csum):
@@ -188315,7 +188334,7 @@ index 99039e0..37ab468 100644
          try:
              filesum = misc.checksum(checksumType, fo)
          except Errors.MiscError, e:
-@@ -1908,13 +2339,26 @@ class YumBase(depsolve.Depsolve):
+@@ -1908,13 +2346,26 @@ class YumBase(depsolve.Depsolve):
          return 0
  
      def downloadPkgs(self, pkglist, callback=None, callback_total=None):
@@ -188343,7 +188362,7 @@ index 99039e0..37ab468 100644
              if a is None:
                  return -1
              if b is None:
-@@ -1925,12 +2369,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1925,12 +2376,11 @@ class YumBase(depsolve.Depsolve):
                  return 1
              return 0
          
@@ -188358,7 +188377,7 @@ index 99039e0..37ab468 100644
  
          #  We close the history DB here because some plugins (presto) use
          # threads. And sqlite really doesn't like threads. And while I don't
-@@ -1943,116 +2386,196 @@ class YumBase(depsolve.Depsolve):
+@@ -1943,116 +2393,215 @@ class YumBase(depsolve.Depsolve):
          self.history.close()
  
          self.plugins.run('predownload', pkglist=pkglist)
@@ -188375,6 +188394,9 @@ index 99039e0..37ab468 100644
 +                self.verbose_logger.warn(_("ignoring a dupe of %s") % po)
 +                return True
 +            beenthere.add(local)
++            if downloadonly and not os.path.exists(local):
++              # Check before we munge the name...
++              po.repo._preload_pkg_from_system_cache(po)
 +            if os.path.exists(local):
 +                if self.verifyPkg(local, po, False):
 +                    self.verbose_logger.debug(_("using local copy of %s") % po)
@@ -188437,6 +188459,22 @@ index 99039e0..37ab468 100644
 +                format_number(rpmsize), format_number(deltasize), 100 - deltasize*100.0/rpmsize)
 +
 +        if downloadonly:
++            if hasattr(self, '_old_cachedir'):
++              # Try to link/copy them out, if we have somewhere to put them.
++
++              for po in pkglist:
++                if not po.localpath.startswith(self.conf.cachedir):
++                  continue
++
++                end = po.localpath[len(self.conf.cachedir):]
++                try:
++                  os.link(po.localpath, self._old_cachedir + end)
++                except:
++                  try:
++                    shutil.copy2(po.localpath, self._old_cachedir + end)
++                  except:
++                    pass
++
 +            # close DBs, unlock
 +            self.repos.close()
 +            self.closeRpmDB()
@@ -188644,7 +188682,7 @@ index 99039e0..37ab468 100644
          if type(fo) is types.InstanceType:
              fo = fo.filename
              
-@@ -2076,9 +2599,12 @@ class YumBase(depsolve.Depsolve):
+@@ -2076,9 +2625,12 @@ class YumBase(depsolve.Depsolve):
          return 1
          
      def downloadHeader(self, po):
@@ -188659,7 +188697,7 @@ index 99039e0..37ab468 100644
          if hasattr(po, 'pkgtype') and po.pkgtype == 'local':
              return
                  
-@@ -2122,15 +2648,17 @@ class YumBase(depsolve.Depsolve):
+@@ -2122,15 +2674,17 @@ class YumBase(depsolve.Depsolve):
              return
  
      def sigCheckPkg(self, po):
@@ -188685,7 +188723,7 @@ index 99039e0..37ab468 100644
          if self._override_sigchecks:
              check = False
              hasgpgkey = 0
-@@ -2181,6 +2709,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2181,6 +2735,9 @@ class YumBase(depsolve.Depsolve):
          return result, msg
  
      def cleanUsedHeadersPackages(self):
@@ -188695,7 +188733,7 @@ index 99039e0..37ab468 100644
          filelist = []
          for txmbr in self.tsInfo:
              if txmbr.po.state not in TS_INSTALL_STATES:
-@@ -2189,6 +2720,8 @@ class YumBase(depsolve.Depsolve):
+@@ -2189,6 +2746,8 @@ class YumBase(depsolve.Depsolve):
                  continue
              if txmbr.po.repoid not in self.repos.repos:
                  continue
@@ -188704,7 +188742,7 @@ index 99039e0..37ab468 100644
              
              # make sure it's not a local file
              repo = self.repos.repos[txmbr.po.repoid]
-@@ -2218,27 +2751,42 @@ class YumBase(depsolve.Depsolve):
+@@ -2218,27 +2777,42 @@ class YumBase(depsolve.Depsolve):
                      _('%s removed'), fn)
          
      def cleanHeaders(self):
@@ -188749,7 +188787,7 @@ index 99039e0..37ab468 100644
          cachedir = self.conf.persistdir + "/rpmdb-indexes/"
          if not os.path.exists(cachedir):
              filelist = []
-@@ -2271,9 +2819,31 @@ class YumBase(depsolve.Depsolve):
+@@ -2271,9 +2845,31 @@ class YumBase(depsolve.Depsolve):
          return 0, [msg]
  
      def doPackageLists(self, pkgnarrow='all', patterns=None, showdups=None,
@@ -188784,7 +188822,7 @@ index 99039e0..37ab468 100644
          if showdups is None:
              showdups = self.conf.showdupesfromrepos
          ygh = misc.GenericHolder(iter=pkgnarrow)
-@@ -2295,6 +2865,8 @@ class YumBase(depsolve.Depsolve):
+@@ -2295,6 +2891,8 @@ class YumBase(depsolve.Depsolve):
              ndinst = {} # Newest versions by name.arch
              for po in self.rpmdb.returnPackages(patterns=patterns,
                                                  ignore_case=ic):
@@ -188793,7 +188831,7 @@ index 99039e0..37ab468 100644
                  dinst[po.pkgtup] = po
                  if showdups:
                      continue
-@@ -2304,8 +2876,13 @@ class YumBase(depsolve.Depsolve):
+@@ -2304,8 +2902,13 @@ class YumBase(depsolve.Depsolve):
              installed = dinst.values()
                          
              if showdups:
@@ -188808,7 +188846,7 @@ index 99039e0..37ab468 100644
              else:
                  try:
                      avail = self.pkgSack.returnNewestByNameArch(patterns=patterns,
-@@ -2323,16 +2900,31 @@ class YumBase(depsolve.Depsolve):
+@@ -2323,16 +2926,31 @@ class YumBase(depsolve.Depsolve):
                      key = (pkg.name, pkg.arch)
                      if pkg.pkgtup in dinst:
                          reinstall_available.append(pkg)
@@ -188843,7 +188881,7 @@ index 99039e0..37ab468 100644
                  if len(matches) > 1:
                      updates.append(matches[0])
                      self.verbose_logger.log(logginglevels.DEBUG_1,
-@@ -2352,13 +2944,19 @@ class YumBase(depsolve.Depsolve):
+@@ -2352,13 +2970,19 @@ class YumBase(depsolve.Depsolve):
          elif pkgnarrow == 'installed':
              installed = self.rpmdb.returnPackages(patterns=patterns,
                                                    ignore_case=ic)
@@ -188864,7 +188902,7 @@ index 99039e0..37ab468 100644
              else:
                  try:
                      avail = self.pkgSack.returnNewestByNameArch(patterns=patterns,
-@@ -2392,9 +2990,21 @@ class YumBase(depsolve.Depsolve):
+@@ -2392,9 +3016,21 @@ class YumBase(depsolve.Depsolve):
              avail = set(avail)
              for po in self.rpmdb.returnPackages(patterns=patterns,
                                                  ignore_case=ic):
@@ -188886,7 +188924,7 @@ index 99039e0..37ab468 100644
          # obsoleting packages (and what they obsolete)
          elif pkgnarrow == 'obsoletes':
              self.conf.obsoletes = 1
-@@ -2402,6 +3012,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2402,6 +3038,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)
@@ -188894,7 +188932,7 @@ index 99039e0..37ab468 100644
                  instpo = self.getInstalledPackageObject(instTup)
                  for po in pkgs:
                      obsoletes.append(po)
-@@ -2433,7 +3044,12 @@ class YumBase(depsolve.Depsolve):
+@@ -2433,7 +3070,12 @@ class YumBase(depsolve.Depsolve):
              recentlimit = now-(self.conf.recent*86400)
              if showdups:
                  avail = self.pkgSack.returnPackages(patterns=patterns,
@@ -188908,7 +188946,7 @@ index 99039e0..37ab468 100644
              else:
                  try:
                      avail = self.pkgSack.returnNewestByNameArch(patterns=patterns,
-@@ -2461,14 +3077,13 @@ class YumBase(depsolve.Depsolve):
+@@ -2461,14 +3103,13 @@ class YumBase(depsolve.Depsolve):
  
          
      def findDeps(self, pkgs):
@@ -188928,7 +188966,7 @@ index 99039e0..37ab468 100644
          results = {}
  
          for pkg in pkgs:
-@@ -2495,10 +3110,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2495,10 +3136,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):
@@ -188955,7 +188993,7 @@ index 99039e0..37ab468 100644
          sql_fields = []
          for f in fields:
              sql_fields.append(RPM_TO_SQLITE.get(f, f))
-@@ -2614,7 +3241,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2614,7 +3267,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.
@@ -188964,7 +189002,7 @@ index 99039e0..37ab468 100644
          # either, so it's pretty thankless. HTH. HAND.
          # By default just sort using package sorting
          sort_func = operator.itemgetter(0)
-@@ -2661,6 +3288,14 @@ class YumBase(depsolve.Depsolve):
+@@ -2661,6 +3314,14 @@ class YumBase(depsolve.Depsolve):
                      yield (po, vs)
  
      def searchPackageTags(self, criteria):
@@ -188979,7 +189017,7 @@ index 99039e0..37ab468 100644
          results = {} # name = [(criteria, taglist)]
          for c in criteria:
              c = c.lower()
-@@ -2677,11 +3312,16 @@ class YumBase(depsolve.Depsolve):
+@@ -2677,11 +3338,16 @@ class YumBase(depsolve.Depsolve):
          return results
          
      def searchPackages(self, fields, criteria, callback=None):
@@ -189001,7 +189039,7 @@ index 99039e0..37ab468 100644
          warnings.warn(_('searchPackages() will go away in a future version of Yum.\
                        Use searchGenerator() instead. \n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)           
-@@ -2700,13 +3340,23 @@ class YumBase(depsolve.Depsolve):
+@@ -2700,13 +3366,23 @@ class YumBase(depsolve.Depsolve):
      
      def searchPackageProvides(self, args, callback=None,
                                callback_has_matchfor=False):
@@ -189029,7 +189067,7 @@ index 99039e0..37ab468 100644
              else:
                  isglob = True
                  canBeFile = misc.re_filename(arg)
-@@ -2723,7 +3373,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2723,7 +3399,7 @@ class YumBase(depsolve.Depsolve):
                  where = self.returnPackagesByDep(arg)
              else:
                  usedDepString = False
@@ -189038,7 +189076,7 @@ index 99039e0..37ab468 100644
              self.verbose_logger.log(logginglevels.DEBUG_1,
                 P_('Searching %d package', 'Searching %d packages', len(where)), len(where))
              
-@@ -2817,25 +3467,166 @@ class YumBase(depsolve.Depsolve):
+@@ -2817,64 +3493,268 @@ class YumBase(depsolve.Depsolve):
              
          return matches
  
@@ -189048,6 +189086,8 @@ index 99039e0..37ab468 100644
 -           only groups marked as uservisible"""
 -        
 -        
+-        installed = []
+-        available = []
 +    def _groupInstalledData(self, group):
 +        """ Return a dict of
 +             pkg_name =>
@@ -189070,7 +189110,22 @@ index 99039e0..37ab468 100644
 +            if pkg_name not in pkg_names and not ipkgs:
 +                ret[pkg_name] = 'available'
 +                continue
-+
+ 
+-        if self.comps.compscount == 0:
+-            raise Errors.GroupsError, _('No group data available for configured repositories')
+-        
+-        if patterns is None:
+-            grps = self.comps.groups
+-        else:
+-            grps = self.comps.return_groups(",".join(patterns),
+-                                            case_sensitive=not ignore_case)
+-        for grp in grps:
+-            if grp.installed:
+-                if uservisible:
+-                    if grp.user_visible:
+-                        installed.append(grp)
+-                else:
+-                    installed.append(grp)
 +            if not ipkgs:
 +                ret[pkg_name] = 'blacklisted-available'
 +                continue
@@ -189176,19 +189231,14 @@ index 99039e0..37ab468 100644
 +        :param return_evgrps: whether to return environment groups as well as
 +           package groups
 +        """
-         installed = []
-         available = []
++        installed = []
++        available = []
 +        einstalled = []
 +        eavailable = []
- 
-         if self.comps.compscount == 0:
-             raise Errors.GroupsError, _('No group data available for configured repositories')
-         
--        if patterns is None:
--            grps = self.comps.groups
--        else:
--            grps = self.comps.return_groups(",".join(patterns),
--                                            case_sensitive=not ignore_case)
++
++        if self.comps.compscount == 0:
++            raise Errors.GroupsError, _('No group data available for configured repositories')
++        
 +        igrps, grps, ievgrps, evgrps = self._groupReturnGroups(patterns,
 +                                                               ignore_case)
 +
@@ -189204,8 +189254,7 @@ index 99039e0..37ab468 100644
 +                digrps[ievgrp.evgid] = ievgrp
 +            ievgrps = digrps
 +
-         for grp in grps:
--            if grp.installed:
++        for grp in grps:
 +            if igrps is None:
 +                grp_installed = grp.installed
 +            else:
@@ -189214,10 +189263,14 @@ index 99039e0..37ab468 100644
 +                    del igrps[grp.groupid]
 +
 +            if grp_installed:
++                if uservisible:
++                    if grp.user_visible:
++                        installed.append(grp)
++                else:
++                    installed.append(grp)
+             else:
                  if uservisible:
                      if grp.user_visible:
-                         installed.append(grp)
-@@ -2847,34 +3638,97 @@ class YumBase(depsolve.Depsolve):
                          available.append(grp)
                  else:
                      available.append(grp)
@@ -189323,7 +189376,7 @@ index 99039e0..37ab468 100644
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -2898,18 +3752,53 @@ class YumBase(depsolve.Depsolve):
+@@ -2898,18 +3778,53 @@ class YumBase(depsolve.Depsolve):
                              self.tsInfo.remove(txmbr.po.pkgtup)
          
          
@@ -189387,7 +189440,7 @@ index 99039e0..37ab468 100644
          txmbrs_used = []
          thesegroups = self.comps.return_groups(grpid)
       
-@@ -2920,12 +3809,18 @@ class YumBase(depsolve.Depsolve):
+@@ -2920,12 +3835,18 @@ class YumBase(depsolve.Depsolve):
          if group_package_types:
              package_types = group_package_types
  
@@ -189406,7 +189459,7 @@ index 99039e0..37ab468 100644
              pkgs = []
              if 'mandatory' in package_types:
                  pkgs.extend(thisgroup.mandatory_packages)
-@@ -2934,12 +3829,56 @@ class YumBase(depsolve.Depsolve):
+@@ -2934,12 +3855,56 @@ class YumBase(depsolve.Depsolve):
              if 'optional' in package_types:
                  pkgs.extend(thisgroup.optional_packages)
  
@@ -189464,7 +189517,7 @@ index 99039e0..37ab468 100644
                  except Errors.InstallError, e:
                      self.verbose_logger.debug(_('No package named %s available to be installed'),
                          pkg)
-@@ -2953,7 +3892,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2953,7 +3918,9 @@ class YumBase(depsolve.Depsolve):
                  group_conditionals = enable_group_conditionals
  
              count_cond_test = 0
@@ -189475,7 +189528,7 @@ index 99039e0..37ab468 100644
                  for condreq, cond in thisgroup.conditional_packages.iteritems():
                      if self.isPackageInstalled(cond):
                          try:
-@@ -2990,17 +3931,23 @@ class YumBase(depsolve.Depsolve):
+@@ -2990,17 +3957,23 @@ class YumBase(depsolve.Depsolve):
                          if cond not in self.tsInfo.conditionals:
                              self.tsInfo.conditionals[cond] = []
                          self.tsInfo.conditionals[cond].extend(pkgs)
@@ -189506,7 +189559,7 @@ index 99039e0..37ab468 100644
          
          if not self.comps.has_group(grpid):
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -3008,7 +3955,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3008,7 +3981,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)
@@ -189516,7 +189569,7 @@ index 99039e0..37ab468 100644
          for thisgroup in thesegroups:
              thisgroup.selected = False
              
-@@ -3034,13 +3982,114 @@ class YumBase(depsolve.Depsolve):
+@@ -3034,13 +4008,114 @@ class YumBase(depsolve.Depsolve):
                          for pkg in self.tsInfo.conditionals.get(txmbr.name, []):
                              self.tsInfo.remove(pkg.pkgtup)
          
@@ -189637,7 +189690,7 @@ index 99039e0..37ab468 100644
          # look it up in the self.localPackages first:
          for po in self.localPackages:
              if po.pkgtup == pkgtup:
-@@ -3049,7 +4098,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3049,7 +4124,7 @@ class YumBase(depsolve.Depsolve):
          pkgs = self.pkgSack.searchPkgTuple(pkgtup)
  
          if len(pkgs) == 0:
@@ -189646,7 +189699,7 @@ index 99039e0..37ab468 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 +4114,21 @@ class YumBase(depsolve.Depsolve):
+@@ -3065,13 +4140,21 @@ class YumBase(depsolve.Depsolve):
          return result
  
      def getInstalledPackageObject(self, pkgtup):
@@ -189673,7 +189726,7 @@ index 99039e0..37ab468 100644
              raise Errors.RpmDBError, _('Package tuple %s could not be found in rpmdb') % str(pkgtup)
  
          # Dito. FIXME from getPackageObject() for len() > 1 ... :)
-@@ -3079,9 +4136,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3079,9 +4162,11 @@ class YumBase(depsolve.Depsolve):
          return po
          
      def gpgKeyCheck(self):
@@ -189687,7 +189740,7 @@ index 99039e0..37ab468 100644
          gpgkeyschecked = self.conf.cachedir + '/.gpgkeyschecked.yum'
          if os.path.exists(gpgkeyschecked):
              return 1
-@@ -3106,9 +4165,13 @@ class YumBase(depsolve.Depsolve):
+@@ -3106,9 +4191,13 @@ class YumBase(depsolve.Depsolve):
              return 1
  
      def returnPackagesByDep(self, depstring):
@@ -189703,7 +189756,7 @@ index 99039e0..37ab468 100644
          if not depstring:
              return []
  
-@@ -3132,12 +4195,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3132,12 +4221,23 @@ class YumBase(depsolve.Depsolve):
                          raise Errors.YumBaseError, _('Invalid version flag from: %s') % str(depstring)
                      depflags = SYMBOLFLAGS[flagsymbol]
  
@@ -189730,7 +189783,7 @@ index 99039e0..37ab468 100644
          # we get all sorts of randomness here
          errstring = depstring
          if type(depstring) not in types.StringTypes:
-@@ -3149,16 +4223,22 @@ class YumBase(depsolve.Depsolve):
+@@ -3149,16 +4249,22 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _('No Package found for %s') % errstring
          
          ps = ListPackageSack(pkglist)
@@ -189757,7 +189810,7 @@ index 99039e0..37ab468 100644
          if not depstring:
              return []
  
-@@ -3182,14 +4262,53 @@ class YumBase(depsolve.Depsolve):
+@@ -3182,14 +4288,53 @@ class YumBase(depsolve.Depsolve):
                          raise Errors.YumBaseError, _('Invalid version flag from: %s') % str(depstring)
                      depflags = SYMBOLFLAGS[flagsymbol]
  
@@ -189813,7 +189866,7 @@ index 99039e0..37ab468 100644
          
          
          if len(pkglist) == 0:
-@@ -3198,14 +4317,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3198,14 +4343,23 @@ class YumBase(depsolve.Depsolve):
          if len(pkglist) == 1:
              return pkglist[0]
  
@@ -189843,7 +189896,7 @@ index 99039e0..37ab468 100644
          returnlist = []
          compatArchList = self.arch.get_arch_list(arch)
          multiLib = []
-@@ -3222,9 +4350,9 @@ class YumBase(depsolve.Depsolve):
+@@ -3222,9 +4376,9 @@ class YumBase(depsolve.Depsolve):
                  singleLib.append(po)
                  
          # we now have three lists.  find the best package(s) of each
@@ -189856,7 +189909,7 @@ index 99039e0..37ab468 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 +4366,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3238,7 +4392,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:
@@ -189865,7 +189918,7 @@ index 99039e0..37ab468 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3246,7 +4374,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3246,7 +4400,7 @@ class YumBase(depsolve.Depsolve):
                  if single: returnlist.append(single)
          # similar for the non-multilib case
          elif single:
@@ -189874,7 +189927,7 @@ index 99039e0..37ab468 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3350,28 +4478,71 @@ class YumBase(depsolve.Depsolve):
+@@ -3350,28 +4504,71 @@ class YumBase(depsolve.Depsolve):
              done = True
  
              slow = next_func(slow)
@@ -189956,7 +190009,7 @@ index 99039e0..37ab468 100644
          try:
              txmbrs = self.groupRemove(group_string)
          except yum.Errors.GroupsError:
-@@ -3387,6 +4558,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3387,6 +4584,8 @@ class YumBase(depsolve.Depsolve):
          assert pattern[0] == '@'
          grpid = pattern[1:]
  
@@ -189965,7 +190018,7 @@ index 99039e0..37ab468 100644
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -3398,7 +4571,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3398,7 +4597,11 @@ class YumBase(depsolve.Depsolve):
      def _minus_deselect(self, pattern):
          """ Remove things from the transaction, like kickstart. """
          assert pattern[0] == '-'
@@ -189978,7 +190031,7 @@ index 99039e0..37ab468 100644
  
          if pat and pat[0] == '@':
              pat = pat[1:]
-@@ -3437,14 +4614,87 @@ class YumBase(depsolve.Depsolve):
+@@ -3437,14 +4640,87 @@ class YumBase(depsolve.Depsolve):
              if flag not in self.tsInfo.probFilterFlags:
                  self.tsInfo.probFilterFlags.append(flag)
  
@@ -190072,7 +190125,7 @@ index 99039e0..37ab468 100644
          pkgs = []
          was_pattern = False
          if po:
-@@ -3464,9 +4714,14 @@ class YumBase(depsolve.Depsolve):
+@@ -3464,9 +4740,14 @@ class YumBase(depsolve.Depsolve):
                  if kwargs['pattern'] and kwargs['pattern'][0] == '@':
                      return self._at_groupinstall(kwargs['pattern'])
  
@@ -190087,7 +190140,7 @@ index 99039e0..37ab468 100644
                                                        ignore_case=False)
                  pkgs.extend(mypkgs)
                  # if we have anything left unmatched, let's take a look for it
-@@ -3477,20 +4732,14 @@ class YumBase(depsolve.Depsolve):
+@@ -3477,20 +4758,14 @@ class YumBase(depsolve.Depsolve):
                      self.verbose_logger.debug(_('Checking for virtual provide or file-provide for %s'), 
                          arg)
  
@@ -190116,7 +190169,7 @@ index 99039e0..37ab468 100644
              else:
                  nevra_dict = self._nevra_kwarg_parse(kwargs)
  
-@@ -3499,6 +4748,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3499,6 +4774,8 @@ class YumBase(depsolve.Depsolve):
                       ver=nevra_dict['version'], rel=nevra_dict['release'])
                  self._add_not_found_a(pkgs, nevra_dict)
                  
@@ -190125,7 +190178,7 @@ index 99039e0..37ab468 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 +4828,21 @@ class YumBase(depsolve.Depsolve):
+@@ -3577,17 +4854,21 @@ class YumBase(depsolve.Depsolve):
                      continue
              
              # make sure this shouldn't be passed to update:
@@ -190151,7 +190204,7 @@ index 99039e0..37ab468 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 +4855,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3600,23 +4881,23 @@ class YumBase(depsolve.Depsolve):
                      already_obs = pkgs[0]
  
                  if already_obs:
@@ -190182,7 +190235,7 @@ index 99039e0..37ab468 100644
                      continue
  
              # make sure we don't have a name.arch of this already installed
-@@ -3630,8 +4885,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3630,8 +4911,8 @@ class YumBase(depsolve.Depsolve):
                          found = True
                          break
                  if not found:
@@ -190193,7 +190246,7 @@ index 99039e0..37ab468 100644
                      tx_return.extend(txmbrs)
                      continue
  
-@@ -3719,19 +4974,47 @@ class YumBase(depsolve.Depsolve):
+@@ -3719,19 +5000,47 @@ class YumBase(depsolve.Depsolve):
          return txmbr
  
      def update(self, po=None, requiringPo=None, update_to=False, **kwargs):
@@ -190248,7 +190301,7 @@ index 99039e0..37ab468 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 +5048,15 @@ class YumBase(depsolve.Depsolve):
+@@ -3765,7 +5074,15 @@ class YumBase(depsolve.Depsolve):
                      if new is None:
                          continue
                      tx_return.extend(self.update(po=new))
@@ -190265,7 +190318,7 @@ index 99039e0..37ab468 100644
              return tx_return
  
          # complications
-@@ -3787,13 +5078,16 @@ class YumBase(depsolve.Depsolve):
+@@ -3787,13 +5104,16 @@ class YumBase(depsolve.Depsolve):
                  return self._minus_deselect(kwargs['pattern'])
  
              if kwargs['pattern'] and kwargs['pattern'][0] == '@':
@@ -190284,7 +190337,7 @@ index 99039e0..37ab468 100644
  
              if not instpkgs and not availpkgs:
                  depmatches = []
-@@ -3805,6 +5099,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3805,6 +5125,8 @@ class YumBase(depsolve.Depsolve):
                  except yum.Errors.YumBaseError, e:
                      self.logger.critical(_('%s') % e)
  
@@ -190293,7 +190346,7 @@ index 99039e0..37ab468 100644
                  if update_to:
                      availpkgs.extend(depmatches)
                  else:
-@@ -3816,9 +5112,12 @@ class YumBase(depsolve.Depsolve):
+@@ -3816,9 +5138,12 @@ class YumBase(depsolve.Depsolve):
              try:
                  if update_to:
                      m = []
@@ -190307,7 +190360,7 @@ index 99039e0..37ab468 100644
                      m = self.pkgSack.returnNewestByNameArch(patterns=pats)
              except Errors.PackageSackError:
                  m = []
-@@ -3843,7 +5142,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3843,7 +5168,7 @@ class YumBase(depsolve.Depsolve):
                      availpkgs = self._compare_providers(availpkgs, requiringPo)
                      availpkgs = map(lambda x: x[0], availpkgs)
                  elif not availpkgs:
@@ -190316,7 +190369,7 @@ index 99039e0..37ab468 100644
         
          # for any thing specified
          # get the list of available pkgs matching it (or take the po)
-@@ -3879,6 +5178,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3879,6 +5204,7 @@ class YumBase(depsolve.Depsolve):
                      if obsoleting_pkg is None:
                          continue
                      obs_pkgs.append(obsoleting_pkg)
@@ -190324,7 +190377,7 @@ index 99039e0..37ab468 100644
                  for obsoleting_pkg in packagesNewestByName(obs_pkgs):
                      tx_return.extend(self.install(po=obsoleting_pkg))
              for available_pkg in availpkgs:
-@@ -3920,11 +5220,29 @@ class YumBase(depsolve.Depsolve):
+@@ -3920,11 +5246,29 @@ class YumBase(depsolve.Depsolve):
                      tx_return.append(txmbr)
                          
          for available_pkg in availpkgs:
@@ -190354,7 +190407,7 @@ index 99039e0..37ab468 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 +5303,18 @@ class YumBase(depsolve.Depsolve):
+@@ -3985,11 +5329,18 @@ class YumBase(depsolve.Depsolve):
          return tx_return
          
      def remove(self, po=None, **kwargs):
@@ -190378,7 +190431,7 @@ index 99039e0..37ab468 100644
          if not po and not kwargs:
              raise Errors.RemoveError, 'Nothing specified to remove'
          
-@@ -4008,6 +5333,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4008,6 +5359,10 @@ class YumBase(depsolve.Depsolve):
                      return self._at_groupremove(kwargs['pattern'])
  
                  (e,m,u) = self.rpmdb.matchPackageNames([kwargs['pattern']])
@@ -190389,7 +190442,7 @@ index 99039e0..37ab468 100644
                  pkgs.extend(e)
                  pkgs.extend(m)
                  if u:
-@@ -4018,6 +5347,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4018,6 +5373,10 @@ class YumBase(depsolve.Depsolve):
                      except yum.Errors.YumBaseError, e:
                          self.logger.critical(_('%s') % e)
                      
@@ -190400,7 +190453,7 @@ index 99039e0..37ab468 100644
                      if not depmatches:
                          arg = to_unicode(arg)
                          self.logger.critical(_('No Match for argument: %s') % to_unicode(arg))
-@@ -4055,17 +5388,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4055,17 +5414,19 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def installLocal(self, pkg, po=None, updateonly=False):
@@ -190430,7 +190483,7 @@ index 99039e0..37ab468 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 +5518,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4183,16 +5544,15 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def reinstallLocal(self, pkg, po=None):
@@ -190455,7 +190508,7 @@ index 99039e0..37ab468 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4215,13 +5549,29 @@ class YumBase(depsolve.Depsolve):
+@@ -4215,13 +5575,29 @@ class YumBase(depsolve.Depsolve):
          return self.reinstall(po=po)
  
      def reinstall(self, po=None, **kwargs):
@@ -190488,7 +190541,7 @@ index 99039e0..37ab468 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 +5590,11 @@ class YumBase(depsolve.Depsolve):
+@@ -4240,10 +5616,11 @@ class YumBase(depsolve.Depsolve):
              # pkgs that are obsolete.
              old_conf_obs = self.conf.obsoletes
              self.conf.obsoletes = False
@@ -190502,7 +190555,7 @@ index 99039e0..37ab468 100644
              self.conf.obsoletes = old_conf_obs
              if len(members) == 0:
                  self.tsInfo.remove(item.pkgtup)
-@@ -4259,16 +5610,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4259,16 +5636,15 @@ class YumBase(depsolve.Depsolve):
          return tx_mbrs
          
      def downgradeLocal(self, pkg, po=None):
@@ -190527,7 +190580,7 @@ index 99039e0..37ab468 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4309,13 +5659,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4309,13 +5685,19 @@ class YumBase(depsolve.Depsolve):
          return False
          
      def downgrade(self, po=None, **kwargs):
@@ -190554,7 +190607,7 @@ index 99039e0..37ab468 100644
          if not po and not kwargs:
              raise Errors.DowngradeError, 'Nothing specified to downgrade'
  
-@@ -4397,6 +5753,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4397,6 +5779,10 @@ class YumBase(depsolve.Depsolve):
          # installed version. Indexed fromn the latest installed pkgtup.
          downgrade_apkgs = {}
          for pkg in sorted(apkgs):
@@ -190565,7 +190618,7 @@ index 99039e0..37ab468 100644
              na  = (pkg.name, pkg.arch)
  
              # Here we allow downgrades from .i386 => .noarch, or .i586 => .i386
-@@ -4421,6 +5781,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4421,6 +5807,9 @@ class YumBase(depsolve.Depsolve):
                  warned_nas.add(na)
                  continue
  
@@ -190575,7 +190628,7 @@ index 99039e0..37ab468 100644
              if pkg.verGE(lipkg):
                  if na not in warned_nas:
                      msg = _('Only Upgrade available on package: %s') % pkg
-@@ -4457,7 +5820,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4457,7 +5846,7 @@ class YumBase(depsolve.Depsolve):
          if e and v and r:
              evr = '%s:%s-%s' % (e, v, r)
          elif v and r:
@@ -190584,7 +190637,7 @@ index 99039e0..37ab468 100644
          elif e and v:
              evr = '%s:%s' % (e, v)
          elif v: # e and r etc. is just too weird to print
-@@ -4500,12 +5863,24 @@ class YumBase(depsolve.Depsolve):
+@@ -4500,12 +5889,24 @@ class YumBase(depsolve.Depsolve):
  
          return returndict
  
@@ -190612,7 +190665,7 @@ index 99039e0..37ab468 100644
          old_conf_obs = self.conf.obsoletes
          self.conf.obsoletes = False
          done = False
-@@ -4515,19 +5890,46 @@ class YumBase(depsolve.Depsolve):
+@@ -4515,19 +5916,46 @@ class YumBase(depsolve.Depsolve):
                      done = True
          for pkg in transaction.trans_data:
              if pkg.state == 'Downgrade':
@@ -190659,7 +190712,7 @@ index 99039e0..37ab468 100644
                  if self.install(pkgtup=pkg.pkgtup):
                      done = True
          for pkg in transaction.trans_data:
-@@ -4538,8 +5940,14 @@ class YumBase(depsolve.Depsolve):
+@@ -4538,8 +5966,14 @@ class YumBase(depsolve.Depsolve):
          return done
  
      def history_undo(self, transaction):
@@ -190676,7 +190729,7 @@ index 99039e0..37ab468 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 +6024,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4616,7 +6050,7 @@ class YumBase(depsolve.Depsolve):
  
          except urlgrabber.grabber.URLGrabError, e:
              raise Errors.YumBaseError(_('GPG key retrieval failed: ') +
@@ -190685,7 +190738,7 @@ index 99039e0..37ab468 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 +6057,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4649,7 +6083,7 @@ class YumBase(depsolve.Depsolve):
              keys_info = misc.getgpgkeyinfo(rawkey, multiple=True)
          except ValueError, e:
              raise Errors.YumBaseError(_('Invalid GPG Key from %s: %s') % 
@@ -190694,7 +190747,7 @@ index 99039e0..37ab468 100644
          keys = []
          for keyinfo in keys_info:
              thiskey = {}
-@@ -4674,39 +6082,49 @@ class YumBase(depsolve.Depsolve):
+@@ -4674,39 +6108,49 @@ class YumBase(depsolve.Depsolve):
              if pkgs:
                  pkgs = sorted(pkgs)[-1]
                  msg = (_('Importing %s key 0x%s:\n'
@@ -190762,7 +190815,7 @@ index 99039e0..37ab468 100644
          user_cb_fail = False
          for keyurl in keyurls:
              keys = self._retrievePublicKey(keyurl, repo)
-@@ -4725,7 +6143,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4725,7 +6169,9 @@ class YumBase(depsolve.Depsolve):
                      # Try installing/updating GPG key
                      self._getKeyImportMessage(info, keyurl)
                      rc = False
@@ -190773,7 +190826,7 @@ index 99039e0..37ab468 100644
                          rc = True
                          
                      # grab the .sig/.asc for the keyurl, if it exists
-@@ -4751,8 +6171,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4751,8 +6197,8 @@ class YumBase(depsolve.Depsolve):
                  ts = self.rpmdb.readOnlyTS()
                  result = ts.pgpImportPubkey(misc.procgpgkey(info['raw_key']))
                  if result != 0:
@@ -190784,7 +190837,7 @@ index 99039e0..37ab468 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
  
-@@ -4760,18 +6180,20 @@ class YumBase(depsolve.Depsolve):
+@@ -4760,18 +6206,20 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _("Didn't install any keys")
  
          if not key_installed:
@@ -190810,7 +190863,7 @@ index 99039e0..37ab468 100644
      
      def _getAnyKeyForRepo(self, repo, destdir, keyurl_list, is_cakey=False, callback=None):
          """
-@@ -4788,6 +6210,18 @@ class YumBase(depsolve.Depsolve):
+@@ -4788,6 +6236,18 @@ class YumBase(depsolve.Depsolve):
          """
  
          key_installed = False
@@ -190829,7 +190882,7 @@ index 99039e0..37ab468 100644
          user_cb_fail = False
          for keyurl in keyurl_list:
              keys = self._retrievePublicKey(keyurl, repo, getSig=not is_cakey)
-@@ -4819,8 +6253,11 @@ class YumBase(depsolve.Depsolve):
+@@ -4819,8 +6279,11 @@ class YumBase(depsolve.Depsolve):
                  if not key_installed:
                      self._getKeyImportMessage(info, keyurl, keytype)
                      rc = False
@@ -190842,7 +190895,7 @@ index 99039e0..37ab468 100644
                      elif callback:
                          rc = callback({"repo": repo, "userid": info['userid'],
                                          "hexkeyid": info['hexkeyid'], "keyurl": keyurl,
-@@ -4835,7 +6272,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4835,7 +6298,8 @@ class YumBase(depsolve.Depsolve):
                  # Import the key
                  result = misc.import_key_to_pubring(info['raw_key'], info['hexkeyid'], gpgdir=destdir)
                  if not result:
@@ -190852,7 +190905,7 @@ index 99039e0..37ab468 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
                  # write out the key id to imported_cakeys in the repos basedir
-@@ -4851,36 +6289,35 @@ class YumBase(depsolve.Depsolve):
+@@ -4851,36 +6315,35 @@ class YumBase(depsolve.Depsolve):
                              pass
  
          if not key_installed and user_cb_fail:
@@ -190905,7 +190958,7 @@ index 99039e0..37ab468 100644
          self._getAnyKeyForRepo(repo, repo.gpgcadir, repo.gpgcakey, is_cakey=True, callback=callback)
  
      def _limit_installonly_pkgs(self):
-@@ -4889,7 +6326,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4889,7 +6352,7 @@ class YumBase(depsolve.Depsolve):
              New in 3.2.24: Obey yumdb_info.installonly data. """
  
          def _sort_and_filter_installonly(pkgs):
@@ -190914,7 +190967,7 @@ index 99039e0..37ab468 100644
                  using the yumdb. """
              ret_beg = []
              ret_mid = []
-@@ -4917,6 +6354,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4917,6 +6380,10 @@ class YumBase(depsolve.Depsolve):
  
          if self.conf.installonly_limit < 1 :
              return 
@@ -190925,7 +190978,7 @@ index 99039e0..37ab468 100644
              
          toremove = []
          #  We "probably" want to use either self.ts or self.rpmdb.ts if either
-@@ -4926,23 +6367,30 @@ class YumBase(depsolve.Depsolve):
+@@ -4926,23 +6393,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)
@@ -190964,7 +191017,7 @@ index 99039e0..37ab468 100644
              for po in installed:
                  if (po.version, po.release) == (cur_kernel_v, cur_kernel_r): 
                      # don't remove running
-@@ -4959,19 +6407,22 @@ class YumBase(depsolve.Depsolve):
+@@ -4959,19 +6433,22 @@ class YumBase(depsolve.Depsolve):
              txmbr.depends_on.append(rel)
  
      def processTransaction(self, callback=None,rpmTestDisplay=None, rpmDisplay=None):
@@ -191000,7 +191053,7 @@ index 99039e0..37ab468 100644
          
          if not callback:
              callback = callbacks.ProcessTransNoOutputCallback()
-@@ -5062,8 +6513,8 @@ class YumBase(depsolve.Depsolve):
+@@ -5062,8 +6539,8 @@ class YumBase(depsolve.Depsolve):
                  raise Errors.YumRPMCheckError, retmsgs
              retmsgs = [_('ERROR with transaction check vs depsolve:')]
              retmsgs.extend(msgs) 
@@ -191011,7 +191064,7 @@ index 99039e0..37ab468 100644
              raise Errors.YumRPMCheckError,retmsgs
          
          tsConf = {}
-@@ -5114,13 +6565,19 @@ class YumBase(depsolve.Depsolve):
+@@ -5114,13 +6591,19 @@ class YumBase(depsolve.Depsolve):
          return results
  
      def add_enable_repo(self, repoid, baseurls=[], mirrorlist=None, **kwargs):
@@ -191038,7 +191091,7 @@ index 99039e0..37ab468 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 +6624,15 @@ class YumBase(depsolve.Depsolve):
+@@ -5167,9 +6650,15 @@ class YumBase(depsolve.Depsolve):
  
      def setCacheDir(self, force=False, tmpdir=None, reuse=True,
                      suffix='/$basearch/$releasever'):
@@ -191057,7 +191110,7 @@ index 99039e0..37ab468 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 +6642,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5179,7 +6668,7 @@ class YumBase(depsolve.Depsolve):
          try:
              cachedir = misc.getCacheDir(tmpdir, reuse)
          except (IOError, OSError), e:
@@ -191066,7 +191119,7 @@ index 99039e0..37ab468 100644
              cachedir = None
              
          if cachedir is None:
-@@ -5190,6 +6653,8 @@ class YumBase(depsolve.Depsolve):
+@@ -5190,6 +6679,8 @@ class YumBase(depsolve.Depsolve):
              self.prerepoconf.cachedir = cachedir
          else:
              self.repos.setCacheDir(cachedir)
@@ -191075,7 +191128,7 @@ index 99039e0..37ab468 100644
          self.conf.cachedir = cachedir
          return True # We got a new cache dir
  
-@@ -5220,13 +6685,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5220,13 +6711,24 @@ class YumBase(depsolve.Depsolve):
          self.history.write_addon_data('config-repos', myrepos)
          
      def verify_plugins_cb(self, verify_package):
@@ -191103,7 +191156,7 @@ index 99039e0..37ab468 100644
          if self.tsInfo._unresolvedMembers:
              if auto:
                  self.logger.critical(_("Dependencies not solved. Will not save unresolved transaction."))
-@@ -5234,7 +6710,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5234,7 +6736,7 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError(_("Dependencies not solved. Will not save unresolved transaction."))
          
          if not filename:
@@ -191112,7 +191165,7 @@ index 99039e0..37ab468 100644
              fd,filename = tempfile.mkstemp(suffix='.yumtx', prefix=prefix)
              f = os.fdopen(fd, 'w')
          else:
-@@ -5244,13 +6720,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5244,13 +6746,17 @@ class YumBase(depsolve.Depsolve):
          
          msg = "%s\n" % self.rpmdb.simpleVersion(main_only=True)[0]
          msg += "%s\n" % self.ts.getTsFlags()
@@ -191133,7 +191186,7 @@ index 99039e0..37ab468 100644
          msg += "%s\n" % len(self.tsInfo.getMembers())
          for txmbr in self.tsInfo.getMembers():
              msg += txmbr._dump()
-@@ -5260,42 +6740,84 @@ class YumBase(depsolve.Depsolve):
+@@ -5260,42 +6766,84 @@ class YumBase(depsolve.Depsolve):
          except (IOError, OSError), e:
              self._ts_save_file = None
              if auto:
@@ -191230,7 +191283,7 @@ index 99039e0..37ab468 100644
              if ignorerpm:
                  msg += _(" ignoring, as requested.")
                  self.logger.critical(_(msg))
-@@ -5318,8 +6840,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5318,8 +6866,17 @@ class YumBase(depsolve.Depsolve):
          numrepos = int(data[2].strip())
          repos = []
          rindex=3+numrepos
@@ -191249,7 +191302,7 @@ index 99039e0..37ab468 100644
  
          # pkgs/txmbrs
          numpkgs = int(data[rindex].strip())
-@@ -5329,6 +6860,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5329,6 +6886,7 @@ class YumBase(depsolve.Depsolve):
          pkgcount = 0
          pkgprob = False
          curpkg = None
@@ -191257,7 +191310,7 @@ index 99039e0..37ab468 100644
          for l in data[pkgstart:]:
              l = l.rstrip()
              # our main txmbrs
-@@ -5356,6 +6888,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5356,6 +6914,7 @@ class YumBase(depsolve.Depsolve):
                      if not ignoremissing:
                          raise Errors.YumBaseError(msg)
                      else:
@@ -191265,7 +191318,7 @@ index 99039e0..37ab468 100644
                          self.logger.critical(msg)
                  else:
                      pkgcount += 1
-@@ -5432,12 +6965,18 @@ class YumBase(depsolve.Depsolve):
+@@ -5432,12 +6991,18 @@ class YumBase(depsolve.Depsolve):
          if pkgprob:
              msg = _("Transaction members, relations are missing or ts has been modified,")
              if ignoremissing:
@@ -191284,7 +191337,7 @@ index 99039e0..37ab468 100644
          return self.tsInfo.getMembers()
  
      def _remove_old_deps(self):
-@@ -5470,18 +7009,6 @@ class YumBase(depsolve.Depsolve):
+@@ -5470,18 +7035,6 @@ class YumBase(depsolve.Depsolve):
                      if requiring == required: # if they are self-requiring skip them
                          continue
                          
@@ -191303,7 +191356,7 @@ index 99039e0..37ab468 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 +7060,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5533,7 +7086,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
@@ -191328,7 +191381,7 @@ index 99039e0..37ab468 100644
                  visited[curpkg] = True
              all_leaves_visited = True
              leaves = curpkg.requiring_packages()
-@@ -5547,4 +7091,3 @@ class YumBase(depsolve.Depsolve):
+@@ -5547,4 +7117,3 @@ class YumBase(depsolve.Depsolve):
          # Debugging output
          self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has no user-installed revdeps."), pkg)
          return False
@@ -200350,7 +200403,7 @@ index e5e9ece..35359e2 100644
          fo = None
  
 diff --git a/yumcommands.py b/yumcommands.py
-index 4dcbea7..52b8c90 100644
+index 4dcbea7..4385a34 100644
 --- a/yumcommands.py
 +++ b/yumcommands.py
 @@ -13,6 +13,7 @@
@@ -200361,12 +200414,13 @@ index 4dcbea7..52b8c90 100644
  # Written by Seth Vidal
  
  """
-@@ -20,18 +21,23 @@ Classes for subcommands of the yum command line interface.
+@@ -20,18 +21,25 @@ Classes for subcommands of the yum command line interface.
  """
  
  import os
 +import sys
  import cli
++import rpm
  from yum import logginglevels
 -from yum import _
 +from yum import _, P_
@@ -200380,6 +200434,7 @@ index 4dcbea7..52b8c90 100644
 +from yum.i18n import utf8_width, utf8_width_fill, to_unicode, exception2msg
 +import tempfile
 +import shutil
++import distutils.spawn
 +import glob
  
  import yum.config
@@ -200387,7 +200442,7 @@ index 4dcbea7..52b8c90 100644
  
  def _err_mini_usage(base, basecmd):
      if basecmd not in base.yum_cli_commands:
-@@ -43,16 +49,24 @@ def _err_mini_usage(base, basecmd):
+@@ -43,16 +51,24 @@ def _err_mini_usage(base, basecmd):
      base.logger.critical(txt)
  
  def checkRootUID(base):
@@ -200415,7 +200470,7 @@ index 4dcbea7..52b8c90 100644
      if not base.gpgKeyCheck():
          for repo in base.repos.listEnabled():
              if (repo.gpgcheck or repo.repo_gpgcheck) and not repo.gpgkey:
-@@ -75,31 +89,117 @@ For more information contact your distribution or package provider.
+@@ -75,31 +91,117 @@ For more information contact your distribution or package provider.
                  raise cli.CliError
  
  def checkPackageArg(base, basecmd, extcmds):
@@ -200533,7 +200588,7 @@ index 4dcbea7..52b8c90 100644
  
      for cmd in extcmds:
          if cmd not in VALID_ARGS:
-@@ -108,12 +208,14 @@ def checkCleanArg(base, basecmd, extcmds):
+@@ -108,12 +210,14 @@ def checkCleanArg(base, basecmd, extcmds):
              raise cli.CliError
  
  def checkShellArg(base, basecmd, extcmds):
@@ -200554,7 +200609,7 @@ index 4dcbea7..52b8c90 100644
      """
      if len(extcmds) == 0:
          base.verbose_logger.debug(_("No argument to shell"))
-@@ -133,10 +235,12 @@ def checkShellArg(base, basecmd, extcmds):
+@@ -133,10 +237,12 @@ def checkShellArg(base, basecmd, extcmds):
          raise cli.CliError
  
  def checkEnabledRepo(base, possible_local_files=[]):
@@ -200570,7 +200625,7 @@ index 4dcbea7..52b8c90 100644
      """
      if base.repos.listEnabled():
          return
-@@ -145,6 +249,11 @@ def checkEnabledRepo(base, possible_local_files=[]):
+@@ -145,6 +251,11 @@ def checkEnabledRepo(base, possible_local_files=[]):
          if lfile.endswith(".rpm") and os.path.exists(lfile):
              return
  
@@ -200582,7 +200637,7 @@ index 4dcbea7..52b8c90 100644
      msg = _('There are no enabled repos.\n'
              ' Run "yum repolist all" to see the repos you have.\n'
              ' You can enable repos with yum-config-manager --enable <repo>')
-@@ -152,113 +261,296 @@ def checkEnabledRepo(base, possible_local_files=[]):
+@@ -152,113 +263,296 @@ def checkEnabledRepo(base, possible_local_files=[]):
      raise cli.CliError
  
  class YumCommand:
@@ -200905,7 +200960,7 @@ index 4dcbea7..52b8c90 100644
  
  def _add_pkg_simple_list_lens(data, pkg, indent=''):
      """ Get the length of each pkg's column. Add that to data.
-@@ -289,22 +581,62 @@ def _list_cmd_calc_columns(base, ypl):
+@@ -289,22 +583,62 @@ def _list_cmd_calc_columns(base, ypl):
      return (-columns[0], -columns[1], -columns[2])
  
  class InfoCommand(YumCommand):
@@ -200975,7 +201030,7 @@ index 4dcbea7..52b8c90 100644
              update_pkgs = {}
              inst_pkgs   = {}
              local_pkgs  = {}
-@@ -341,6 +673,7 @@ class InfoCommand(YumCommand):
+@@ -341,6 +675,7 @@ class InfoCommand(YumCommand):
                          local_pkgs[(po.name, po.arch)] = po
  
              # Output the packages:
@@ -200983,7 +201038,7 @@ index 4dcbea7..52b8c90 100644
              clio = base.conf.color_list_installed_older
              clin = base.conf.color_list_installed_newer
              clir = base.conf.color_list_installed_reinstall
-@@ -348,7 +681,9 @@ class InfoCommand(YumCommand):
+@@ -348,7 +683,9 @@ class InfoCommand(YumCommand):
              rip = base.listPkgs(ypl.installed, _('Installed Packages'), basecmd,
                                  highlight_na=update_pkgs, columns=columns,
                                  highlight_modes={'>' : clio, '<' : clin,
@@ -200993,7 +201048,7 @@ index 4dcbea7..52b8c90 100644
              clau = base.conf.color_list_available_upgrade
              clad = base.conf.color_list_available_downgrade
              clar = base.conf.color_list_available_reinstall
-@@ -356,6 +691,7 @@ class InfoCommand(YumCommand):
+@@ -356,6 +693,7 @@ class InfoCommand(YumCommand):
              rap = base.listPkgs(ypl.available, _('Available Packages'), basecmd,
                                  highlight_na=inst_pkgs, columns=columns,
                                  highlight_modes={'<' : clau, '>' : clad,
@@ -201001,7 +201056,7 @@ index 4dcbea7..52b8c90 100644
                                                   '=' : clar, 'not in' : clai})
              rep = base.listPkgs(ypl.extras, _('Extra Packages'), basecmd,
                                  columns=columns)
-@@ -374,7 +710,7 @@ class InfoCommand(YumCommand):
+@@ -374,7 +712,7 @@ class InfoCommand(YumCommand):
                  for obtup in sorted(ypl.obsoletesTuples,
                                      key=operator.itemgetter(0)):
                      base.updatesObsoletesList(obtup, 'obsoletes',
@@ -201010,7 +201065,7 @@ index 4dcbea7..52b8c90 100644
              else:
                  rop = base.listPkgs(ypl.obsoletes, _('Obsoleting Packages'),
                                      basecmd, columns=columns)
-@@ -389,65 +725,212 @@ class InfoCommand(YumCommand):
+@@ -389,65 +727,212 @@ class InfoCommand(YumCommand):
              return 0, []
  
      def needTs(self, base, basecmd, extcmds):
@@ -201229,7 +201284,7 @@ index 4dcbea7..52b8c90 100644
          return _("Display, or use, the groups information")
      
      def _grp_setup_doCommand(self, base):
-@@ -459,7 +942,7 @@ class GroupsCommand(YumCommand):
+@@ -459,7 +944,7 @@ class GroupsCommand(YumCommand):
          except yum.Errors.GroupsError:
              return 1, [_('No Groups on which to run command')]
          except yum.Errors.YumBaseError, e:
@@ -201238,7 +201293,7 @@ index 4dcbea7..52b8c90 100644
  
      def _grp_cmd(self, basecmd, extcmds):
          if basecmd in self.direct_commands:
-@@ -470,6 +953,10 @@ class GroupsCommand(YumCommand):
+@@ -470,6 +955,10 @@ class GroupsCommand(YumCommand):
          else:
              cmd = 'summary'
  
@@ -201249,7 +201304,7 @@ index 4dcbea7..52b8c90 100644
          remap = {'update' : 'upgrade',
                   'erase' : 'remove',
                   'mark-erase' : 'mark-remove',
-@@ -479,32 +966,86 @@ class GroupsCommand(YumCommand):
+@@ -479,32 +968,86 @@ class GroupsCommand(YumCommand):
          return cmd, extcmds
  
      def doCheck(self, base, basecmd, extcmds):
@@ -201346,7 +201401,7 @@ index 4dcbea7..52b8c90 100644
          cmd, extcmds = self._grp_cmd(basecmd, extcmds)
  
          self._grp_setup_doCommand(base)
-@@ -514,140 +1055,573 @@ class GroupsCommand(YumCommand):
+@@ -514,140 +1057,573 @@ class GroupsCommand(YumCommand):
          if cmd == 'list':
              return base.returnGroupLists(extcmds)
  
@@ -201945,7 +202000,7 @@ index 4dcbea7..52b8c90 100644
                  ypl.obsoletes = typl.obsoletes
                  ypl.obsoletesTuples = typl.obsoletesTuples
  
-@@ -673,164 +1647,474 @@ class CheckUpdateCommand(YumCommand):
+@@ -673,164 +1649,474 @@ class CheckUpdateCommand(YumCommand):
                  for obtup in sorted(ypl.obsoletesTuples,
                                      key=operator.itemgetter(0)):
                      base.updatesObsoletesList(obtup, 'obsoletes',
@@ -202451,7 +202506,7 @@ index 4dcbea7..52b8c90 100644
          def _repo_size(repo):
              ret = 0
              for pkg in repo.sack.returnPackages():
-@@ -838,12 +2122,9 @@ class RepoListCommand(YumCommand):
+@@ -838,12 +2124,9 @@ class RepoListCommand(YumCommand):
              return base.format_number(ret)
  
          def _repo_match(repo, patterns):
@@ -202466,7 +202521,7 @@ index 4dcbea7..52b8c90 100644
                      return True
              return False
  
-@@ -857,7 +2138,10 @@ class RepoListCommand(YumCommand):
+@@ -857,7 +2140,10 @@ class RepoListCommand(YumCommand):
              arg = 'enabled'
          extcmds = map(lambda x: x.lower(), extcmds)
  
@@ -202478,7 +202533,7 @@ index 4dcbea7..52b8c90 100644
          if arg != 'disabled' or extcmds:
              try:
                  # Setup so len(repo.sack) is correct
-@@ -866,6 +2150,13 @@ class RepoListCommand(YumCommand):
+@@ -866,6 +2152,13 @@ class RepoListCommand(YumCommand):
              except yum.Errors.RepoError:
                  if verbose:
                      raise
@@ -202492,7 +202547,7 @@ index 4dcbea7..52b8c90 100644
  
          repos = base.repos.repos.values()
          repos.sort()
-@@ -924,111 +2215,113 @@ class RepoListCommand(YumCommand):
+@@ -924,111 +2217,113 @@ class RepoListCommand(YumCommand):
                  ui_enabled = dhibeg + _('disabled') + hiend
                  ui_endis_wid = utf8_width(_('disabled'))
  
@@ -202702,7 +202757,7 @@ index 4dcbea7..52b8c90 100644
  
          if not verbose and cols:
              #  Work out the first (id) and last (enabled/disalbed/count),
-@@ -1088,21 +2381,64 @@ class RepoListCommand(YumCommand):
+@@ -1088,21 +2383,64 @@ class RepoListCommand(YumCommand):
          return 0, ['repolist: ' +to_unicode(locale.format("%d", tot_num, True))]
  
      def needTs(self, base, basecmd, extcmds):
@@ -202767,7 +202822,7 @@ index 4dcbea7..52b8c90 100644
          if len(extcmds) == 0:
              base.usage()
              raise cli.CliError
-@@ -1147,82 +2483,230 @@ class HelpCommand(YumCommand):
+@@ -1147,82 +2485,230 @@ class HelpCommand(YumCommand):
          return help_output
  
      def doCommand(self, base, basecmd, extcmds):
@@ -203008,7 +203063,7 @@ index 4dcbea7..52b8c90 100644
  
          def _append_repos(cols, repo_data):
              for repoid in sorted(repo_data):
-@@ -1264,7 +2748,7 @@ class VersionCommand(YumCommand):
+@@ -1264,7 +2750,7 @@ class VersionCommand(YumCommand):
  
          if vcmd == 'groupinfo':
              for group in groups:
@@ -203017,7 +203072,7 @@ index 4dcbea7..52b8c90 100644
                      continue
                  print _(" Group   :"), group
                  print _(" Packages:")
-@@ -1284,11 +2768,35 @@ class VersionCommand(YumCommand):
+@@ -1284,11 +2770,35 @@ class VersionCommand(YumCommand):
  
              return 0, ['version groupinfo']
  
@@ -203054,7 +203109,7 @@ index 4dcbea7..52b8c90 100644
                  data = base.rpmdb.simpleVersion(not verbose, groups=groups)
                  lastdbv = base.history.last()
                  if lastdbv is not None:
-@@ -1302,15 +2810,14 @@ class VersionCommand(YumCommand):
+@@ -1302,15 +2812,14 @@ class VersionCommand(YumCommand):
                  if groups:
                      for grp in sorted(data[2]):
                          if (vcmd.startswith("group-") and
@@ -203073,7 +203128,7 @@ index 4dcbea7..52b8c90 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 +2827,12 @@ class VersionCommand(YumCommand):
+@@ -1320,14 +2829,12 @@ class VersionCommand(YumCommand):
                  if groups:
                      for grp in sorted(data[2]):
                          if (vcmd.startswith("group-") and
@@ -203089,7 +203144,7 @@ index 4dcbea7..52b8c90 100644
  
          data = {'rid' : {}, 'ver' : {}}
          for (rid, ver) in cols:
-@@ -1344,6 +2849,14 @@ class VersionCommand(YumCommand):
+@@ -1344,6 +2851,14 @@ class VersionCommand(YumCommand):
          return 0, ['version']
  
      def needTs(self, base, basecmd, extcmds):
@@ -203104,7 +203159,7 @@ index 4dcbea7..52b8c90 100644
          vcmd = 'installed'
          if extcmds:
              vcmd = extcmds[0]
-@@ -1352,25 +2865,74 @@ class VersionCommand(YumCommand):
+@@ -1352,25 +2867,74 @@ class VersionCommand(YumCommand):
              return True
          return vcmd in ('available', 'all', 'group-available', 'group-all')
  
@@ -203180,7 +203235,7 @@ index 4dcbea7..52b8c90 100644
              return 2, ["Repeating transaction %u" % (old.tid,)]
  
      def _hcmd_undo(self, base, extcmds):
-@@ -1426,12 +2988,60 @@ class HistoryCommand(YumCommand):
+@@ -1426,12 +2990,60 @@ class HistoryCommand(YumCommand):
      def _hcmd_new(self, base, extcmds):
          base.history._create_db_file()
  
@@ -203242,7 +203297,7 @@ index 4dcbea7..52b8c90 100644
          if extcmds and extcmds[0] not in cmds:
              base.logger.critical(_('Invalid history sub-command, use: %s.'),
                                   ", ".join(cmds))
-@@ -1444,6 +3054,19 @@ class HistoryCommand(YumCommand):
+@@ -1444,6 +3056,19 @@ class HistoryCommand(YumCommand):
              raise cli.CliError
  
      def doCommand(self, base, basecmd, extcmds):
@@ -203262,7 +203317,7 @@ index 4dcbea7..52b8c90 100644
          vcmd = 'list'
          if extcmds:
              vcmd = extcmds[0]
-@@ -1468,29 +3091,88 @@ class HistoryCommand(YumCommand):
+@@ -1468,29 +3093,88 @@ class HistoryCommand(YumCommand):
              ret = self._hcmd_rollback(base, extcmds)
          elif vcmd == 'new':
              ret = self._hcmd_new(base, extcmds)
@@ -203351,7 +203406,7 @@ index 4dcbea7..52b8c90 100644
          chkcmd = 'all'
          if extcmds:
              chkcmd = extcmds
-@@ -1505,33 +3187,1694 @@ class CheckRpmdbCommand(YumCommand):
+@@ -1505,33 +3189,1734 @@ class CheckRpmdbCommand(YumCommand):
          return rc, ['%s %s' % (basecmd, chkcmd)]
  
      def needTs(self, base, basecmd, extcmds):
@@ -203545,8 +203600,8 @@ index 4dcbea7..52b8c90 100644
 +        if not extcmds or os.path.isdir(extcmds[0]):
 +            return False
 +
-         return True
- 
++        return True
++
 +    def cacheRequirement(self, base, basecmd, extcmds):
 +        """Return the cache requirements for the remote repos.
 +
@@ -203944,8 +203999,8 @@ index 4dcbea7..52b8c90 100644
 +        if cmd in ('info', 'list'):
 +            return InfoCommand().needTs(base, cmd, extcmds[2:])
 +
-+        return True
-+
+         return True
+ 
 +    def cacheRequirement(self, base, basecmd, extcmds):
 +        """Return the cache requirements for the remote repos.
 +
@@ -204509,6 +204564,14 @@ index 4dcbea7..52b8c90 100644
 +        :param basecmd: the name of the command
 +        :param extcmds: the command line arguments passed to *basecmd*
 +        """
++        if extcmds and extcmds[0] in ('du', 'status', 'diff'):
++            # Anyone can go for it...
++            return
++
++        if len(extcmds) == 1 and extcmds[0] in ('filters', 'filter'):
++            # Can look, but not touch.
++            return
++
 +        checkRootUID(base)
 +
 +    def _fs_pkg_walk(self, pkgs, prefix, modified=False, verbose=False):
@@ -204786,22 +204849,48 @@ index 4dcbea7..52b8c90 100644
 +                break
 +
 +    def _fs_filters(self, base, extcmds):
-+        writeRawConfigFile = yum.config._writeRawConfigFile
++        def _save(confkey):
++            writeRawConfigFile = yum.config._writeRawConfigFile
++
++            # Always create installroot, so we can change it.
++            if not os.path.exists(base.conf.installroot + '/etc/yum'):
++                os.makedirs(base.conf.installroot + '/etc/yum')
++
++            fn = base.conf.installroot+'/etc/yum/yum.conf'
++            if not os.path.exists(fn):
++                # Try the old default
++                nfn = base.conf.installroot+'/etc/yum.conf'
++                if not os.path.exists(nfn):
++                    shutil.copy2(base.conf.config_file_path, fn)
++            ybc = base.conf
++            writeRawConfigFile(fn, 'main', ybc.yumvar,
++                               ybc.cfg.options, ybc.iteritems,
++                               ybc.optionobj,
++                               only=[confkey])
 +
 +        if not extcmds:
 +            oil = base.conf.override_install_langs
 +            if not oil:
 +                oil = "rpm: " + rpm.expandMacro("%_install_langs")
-+            print "File system filters:"
-+            print "  Nodocs:", 'nodocs' in base.conf.tsflags
-+            print "  Languages:", oil
++            print _("File system filters:")
++            print _("  Nodocs:"), 'nodocs' in base.conf.tsflags
++            print _("  Languages:"), oil
 +        elif extcmds[0] in ('docs', 'nodocs',
 +                            'documentation', 'nodocumentation'):
 +            c_f = 'nodocs' in base.conf.tsflags
-+            n_f = extcmds[0].startswith('no')
++            n_f = not extcmds[0].startswith('no')
 +            if n_f == c_f:
++                if n_f:
++                    print _("Already enabled documentation filter.")
++                else:
++                    print _("Already disabled documentation filter.")
 +                return
 +
++            if n_f:
++                print _("Enabling documentation filter.")
++            else:
++                print _("Disabling documentation filter.")
++
 +            nts = base.conf.tsflags
 +            if n_f:
 +                nts = nts + ['nodocs']
@@ -204809,15 +204898,8 @@ index 4dcbea7..52b8c90 100644
 +                nts = [x for x in nts if x != 'nodocs']
 +            base.conf.tsflags = " ".join(nts)
 +
-+            fn = '/etc/yum/yum.conf'
-+            if not os.path.exists(fn):
-+                # Try the old default
-+                fn = '/etc/yum.conf'
-+            ybc = base.conf
-+            writeRawConfigFile(fn, 'main', ybc.yumvar,
-+                               ybc.cfg.options, ybc.iteritems,
-+                               ybc.optionobj,
-+                               only=['tsflags'])
++            _save('tsflags')
++
 +        elif extcmds[0] in ('langs', 'nolangs', 'lang', 'nolang',
 +                            'languages', 'nolanguages',
 +                            'language', 'nolanguage'):
@@ -204827,19 +204909,21 @@ index 4dcbea7..52b8c90 100644
 +                val = ":".join(extcmds[1:])
 +
 +            if val == base.conf.override_install_langs:
++                if val:
++                    print _("Already filtering languages to: %s") % val
++                else:
++                    print _("Already disabled language filter.")
 +                return
 +
++            if val:
++                print _("Setting language filter to: %s") % val
++            else:
++                print _("Disabling language filter.")
++
 +            base.conf.override_install_langs = val
 +
-+            fn = '/etc/yum/yum.conf'
-+            if not os.path.exists(fn):
-+                # Try the old default
-+                fn = '/etc/yum.conf'
-+            ybc = base.conf
-+            writeRawConfigFile(fn, 'main', ybc.yumvar,
-+                               ybc.cfg.options, ybc.iteritems,
-+                               ybc.optionobj,
-+                               only=['override_install_langs'])
++            _save('override_install_langs')
++
 +        else:
 +            return 1, [_('Not a valid sub-command of fs filter')]
 +
@@ -204911,6 +204995,14 @@ index 4dcbea7..52b8c90 100644
 +            else:
 +                print >>sys.stderr, _('Not packaged?:'), fpath
 +
++        if not distutils.spawn.find_executable("diff"):
++            raise yum.Errors.YumBaseError, _("Can't find diff command")
++        # These just shouldn't happen...
++        if not distutils.spawn.find_executable("cpio"):
++            raise yum.Errors.YumBaseError, _("Can't find cpio command")
++        if not distutils.spawn.find_executable("rpm2cpio"):
++            raise yum.Errors.YumBaseError, _("Can't find rpm2cpio command")
++
 +        prefix = "."
 +        if extcmds:
 +            prefix = extcmds[0]
@@ -205020,7 +205112,7 @@ index 4dcbea7..52b8c90 100644
 +        """
 +        if extcmds and extcmds[0] in ('filters', 'filter',
 +                                      'refilter', 'refilter-cleanup',
-+                                      'du', 'status', 'diff'):
++                                      'du', 'status', 'diff', 'snap'):
 +            subcommand = extcmds[0]
 +            extcmds = extcmds[1:]
 +        else:
@@ -205046,6 +205138,9 @@ index 4dcbea7..52b8c90 100644
 +        elif subcommand == 'status':
 +            ret = self._fs_status(base, extcmds)
 +
++        elif subcommand == 'snap':
++            ret = FSSnapshotCommand().doCommand(base, 'fs snap', args)
++
 +        else:
 +            return 1, [_('Not a valid sub-command of %s') % basecmd]
 +
diff --git a/yum.spec b/yum.spec
index 0a6ae3f..7266f62 100644
--- a/yum.spec
+++ b/yum.spec
@@ -64,7 +64,7 @@ BuildRequires: bash-completion
 Summary: RPM package installer/updater/manager
 Name: yum
 Version: 3.4.3
-Release: 138%{?dist}
+Release: 139%{?dist}
 License: GPLv2+
 Group: System Environment/Base
 Source0: http://yum.baseurl.org/download/3.4/%{name}-%{version}.tar.gz
@@ -107,6 +107,10 @@ Requires: pygpgme
 Requires: pyliblzma
 # Not really a suggests anymore, due to metadata using it.
 Requires: pyxattr
+# Suggests, needed for yum fs diff
+Requires: diffutils
+Requires: cpio
+
 
 Conflicts: rpm >= 5-0
 # Zif is a re-implementation of yum in C, however:
@@ -503,6 +507,12 @@ exit 0
 %endif
 
 %changelog
+* Fri Feb 21 2014 James Antill <james at fedoraproject.org> - 3.4.3-139
+- update to latest HEAD
+- Copy packages in/out of an installroot, for no downloads creating containers.
+- A few cleanups for the fs sub-command UI.
+- Add spec requires for fs sub-command.
+
 * Tue Feb 18 2014 James Antill <james at fedoraproject.org> - 3.4.3-138
 - update to latest HEAD
 - Workaround for weird mash issue, probably.


More information about the scm-commits mailing list