[yum/f17] update to latest HEAD.

James Antill james at fedoraproject.org
Fri Mar 9 22:33:50 UTC 2012


commit 388894b0528aa29dab4446a34a09458084c422b1
Author: James Antill <james at and.org>
Date:   Fri Mar 9 17:33:38 2012 -0500

    update to latest HEAD.
    
    - Fail on bad reinstall/downgrade arguments. bug 800285.
    - Fix weird multiple obsoletion bug. BZ 800016
    - Check for a compat. arch. as well, when hand testing for upgradability.
    - Allow changing the exit code on non-fatal errors.

 yum-HEAD.patch |  385 ++++++++++++++++++++++++++++++++++----------------------
 yum.spec       |    9 ++-
 2 files changed, 240 insertions(+), 154 deletions(-)
---
diff --git a/yum-HEAD.patch b/yum-HEAD.patch
index 1921e79..e6e7837 100644
--- a/yum-HEAD.patch
+++ b/yum-HEAD.patch
@@ -96,7 +96,7 @@ index 2f6154e..2e5a052 100644
 diff --git a/cli.py b/cli.py
 old mode 100644
 new mode 100755
-index 6056d38..ffc1741
+index 6056d38..afa7447
 --- a/cli.py
 +++ b/cli.py
 @@ -25,7 +25,7 @@ import sys
@@ -639,7 +639,7 @@ index 6056d38..ffc1741
  
          all_rms = []
          for arg in userlist:
-@@ -884,9 +1040,20 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -884,12 +1040,24 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
              return 0, [_('No Packages marked for removal')]
      
      def downgradePkgs(self, userlist):
@@ -663,7 +663,22 @@ index 6056d38..ffc1741
  
          oldcount = len(self.tsInfo)
          
-@@ -911,20 +1078,32 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
++        done = False
+         for arg in userlist:
+             if (arg.endswith('.rpm') and (yum.misc.re_remote_url(arg) or
+                                           os.path.exists(arg))):
+@@ -905,26 +1073,44 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+                                         self.term.MODE['bold'], arg,
+                                         self.term.MODE['normal'])
+                 self._maybeYouMeant(arg)
++            else:
++                done = True
+         if len(self.tsInfo) > oldcount:
+             change = len(self.tsInfo) - oldcount
+             return 2, [P_('%d package to downgrade', '%d packages to downgrade', change) % change]
++
++        if not done:
++            return 1, [_('Nothing to do')]
          return 0, [_('Nothing to do')]
          
      def reinstallPkgs(self, userlist):
@@ -685,6 +700,7 @@ index 6056d38..ffc1741
  
          oldcount = len(self.tsInfo)
  
++        done = False
          for arg in userlist:
              if (arg.endswith('.rpm') and (yum.misc.re_remote_url(arg) or
                                            os.path.exists(arg))):
@@ -700,16 +716,20 @@ index 6056d38..ffc1741
              except yum.Errors.ReinstallRemoveError:
                  self._checkMaybeYouMeant(arg, always_output=False)
              except yum.Errors.ReinstallInstallError, e:
-@@ -940,15 +1119,27 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -940,15 +1126,31 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
              except yum.Errors.ReinstallError, e:
                  assert False, "Shouldn't happen, but just in case"
                  self.verbose_logger.log(yum.logginglevels.INFO_2, e)
 +            else:
++                done = True
 +                self._install_upgraded_requires(txmbrs)
 +
          if len(self.tsInfo) > oldcount:
              change = len(self.tsInfo) - oldcount
              return 2, [P_('%d package to reinstall', '%d packages to reinstall', change) % change]
++
++        if not done:
++            return 1, [_('Nothing to do')]
          return 0, [_('Nothing to do')]
  
      def localInstall(self, filelist, updateonly=0):
@@ -731,7 +751,7 @@ index 6056d38..ffc1741
          # read in each package into a YumLocalPackage Object
          # append it to self.localPackages
          # check if it can be installed or updated based on nevra versus rpmdb
-@@ -972,20 +1163,25 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -972,20 +1174,25 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return 0, [_('Nothing to do')]
  
      def returnPkgLists(self, extcmds, installed_available=False):
@@ -771,7 +791,7 @@ index 6056d38..ffc1741
          special = ['available', 'installed', 'all', 'extras', 'updates', 'recent',
                     'obsoletes']
          
-@@ -1017,8 +1213,25 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1017,8 +1224,25 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return ypl
  
      def search(self, args):
@@ -799,7 +819,7 @@ index 6056d38..ffc1741
          
          # call the yum module search function with lists of tags to search
          # and what to search for
-@@ -1108,9 +1321,20 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1108,9 +1332,20 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return 0, matching
  
      def deplist(self, args):
@@ -822,7 +842,7 @@ index 6056d38..ffc1741
          pkgs = []
          for arg in args:
              if (arg.endswith('.rpm') and (yum.misc.re_remote_url(arg) or
-@@ -1131,10 +1355,19 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1131,10 +1366,19 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return 0, []
  
      def provides(self, args):
@@ -846,7 +866,7 @@ index 6056d38..ffc1741
          old_sdup = self.conf.showdupesfromrepos
          # For output, as searchPackageProvides() is always in showdups mode
          self.conf.showdupesfromrepos = True
-@@ -1163,20 +1396,77 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1163,20 +1407,77 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return 0, []
      
      def resolveDepCli(self, args):
@@ -929,7 +949,7 @@ index 6056d38..ffc1741
          hdrcode = pkgcode = xmlcode = dbcode = expccode = 0
          pkgresults = hdrresults = xmlresults = dbresults = expcresults = []
          msg = self.fmtKeyValFill(_('Cleaning repos: '), 
-@@ -1228,7 +1518,19 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1228,7 +1529,19 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return code, []
  
      def returnGroupLists(self, userlist):
@@ -949,7 +969,7 @@ index 6056d38..ffc1741
          uservisible=1
              
          if len(userlist) > 0:
-@@ -1254,7 +1556,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1254,7 +1567,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
                  msg += ' (%s)' % group.groupid
              if group.langonly:
                  msg += ' [%s]' % group.langonly
@@ -958,20 +978,20 @@ index 6056d38..ffc1741
  
          done = False
          for group in installed:
-@@ -1283,7 +1585,20 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1283,7 +1596,20 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return 0, [_('Done')]
  
      def returnGroupSummary(self, userlist):
 +        """Print a summary of the groups that match the given names or
 +        wildcards.
- 
++
 +        :param userlist: a list of names or wildcards specifying the
 +           groups to summarise. If *userlist* is an empty list, all
 +           installed and available packages will be summarised
 +        :return: (exit_code, [ errors ])
 +
 +        exit_code is::
-+
+ 
 +            0 = we're done, exit
 +            1 = we've errored, exit with error string
 +            2 = we've got work yet to do, onto the next stage
@@ -979,7 +999,7 @@ index 6056d38..ffc1741
          uservisible=1
              
          if len(userlist) > 0:
-@@ -1327,7 +1642,19 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1327,7 +1653,19 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return 0, [_('Done')]
      
      def returnGroupInfo(self, userlist):
@@ -1000,7 +1020,7 @@ index 6056d38..ffc1741
          for strng in userlist:
              group_matched = False
              for group in self.comps.return_groups(strng):
-@@ -1339,9 +1666,19 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1339,9 +1677,19 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          
          return 0, []
          
@@ -1023,7 +1043,7 @@ index 6056d38..ffc1741
          pkgs_used = []
          
          for group_string in grouplist:
-@@ -1351,7 +1688,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1351,7 +1699,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
  
              
                  try:
@@ -1032,19 +1052,19 @@ index 6056d38..ffc1741
                  except yum.Errors.GroupsError:
                      self.logger.critical(_('Warning: Group %s does not exist.'), group_string)
                      continue
-@@ -1368,8 +1705,18 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1368,8 +1716,18 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
              return 2, [P_('%d package to Install', '%d packages to Install', len(pkgs_used)) % len(pkgs_used)]
  
      def removeGroups(self, grouplist):
 -        """Remove only packages of the named group(s). Do not recurse."""
 +        """Mark the packages in the given groups for removal.
- 
++
 +        :param grouplist: a list of names or wildcards specifying
 +           groups to be removed
 +        :return: (exit_code, [ errors ])
 +
 +        exit_code is::
-+
+ 
 +            0 = we're done, exit
 +            1 = we've errored, exit with error string
 +            2 = we've got work yet to do, onto the next stage
@@ -1052,7 +1072,7 @@ index 6056d38..ffc1741
          pkgs_used = []
          for group_string in grouplist:
              try:
-@@ -1389,7 +1736,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1389,7 +1747,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
  
      def _promptWanted(self):
          # shortcut for the always-off/always-on options
@@ -1061,7 +1081,7 @@ index 6056d38..ffc1741
              return False
          if self.conf.alwaysprompt:
              return True
-@@ -1400,7 +1747,6 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1400,7 +1758,6 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          #  package wasn't explictly given on the command line
          for txmbr in self.tsInfo.getMembers():
              if txmbr.isDep or \
@@ -1069,7 +1089,7 @@ index 6056d38..ffc1741
                     txmbr.name not in self.extcmds:
                  return True
          
-@@ -1408,11 +1754,11 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1408,11 +1765,11 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return False
  
      def usage(self):
@@ -1083,7 +1103,7 @@ index 6056d38..ffc1741
          sys.stdout.write(self.optparser.get_usage())
      
      def _installable(self, pkg, ematch=False):
-@@ -1468,9 +1814,9 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+@@ -1468,9 +1825,9 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
          return False
  
  class YumOptionParser(OptionParser):
@@ -1095,7 +1115,7 @@ index 6056d38..ffc1741
  
      def __init__(self,base, **kwargs):
          # check if this is called with a utils=True/False parameter
-@@ -1488,13 +1834,23 @@ class YumOptionParser(OptionParser):
+@@ -1488,13 +1845,23 @@ class YumOptionParser(OptionParser):
          self._addYumBasicOptions()
  
      def error(self, msg):
@@ -1121,7 +1141,7 @@ index 6056d38..ffc1741
          try:
              args = _filtercmdline(
                          ('--noplugins','--version','-q', '-v', "--quiet", "--verbose"), 
-@@ -1521,7 +1877,15 @@ class YumOptionParser(OptionParser):
+@@ -1521,7 +1888,15 @@ class YumOptionParser(OptionParser):
          return ret
          
      def setupYumConfig(self, args=None):
@@ -1138,7 +1158,7 @@ index 6056d38..ffc1741
          if not args:
              (opts, cmds) = self.parse_args()
          else:
-@@ -1536,13 +1900,14 @@ class YumOptionParser(OptionParser):
+@@ -1536,13 +1911,14 @@ class YumOptionParser(OptionParser):
                  
              # Handle remaining options
              if opts.assumeyes:
@@ -1158,7 +1178,7 @@ index 6056d38..ffc1741
                  self.base.conf.cache = 1
  
              if opts.obsoletes:
-@@ -1610,10 +1975,6 @@ class YumOptionParser(OptionParser):
+@@ -1610,10 +1986,6 @@ class YumOptionParser(OptionParser):
                      self.base.usage()
                      sys.exit(1)
  
@@ -1169,7 +1189,7 @@ index 6056d38..ffc1741
              # Disable all gpg key checking, if requested.
              if opts.nogpgcheck:
                  #  Altering the normal configs. doesn't work too well, esp. with
-@@ -1640,6 +2001,14 @@ class YumOptionParser(OptionParser):
+@@ -1640,6 +2012,14 @@ class YumOptionParser(OptionParser):
          sys.exit(1)
  
      def getRoot(self,opts):
@@ -1184,7 +1204,7 @@ index 6056d38..ffc1741
          self._checkAbsInstallRoot(opts)
          # If the conf file is inside the  installroot - use that.
          # otherwise look for it in the normal root
-@@ -1713,6 +2082,10 @@ class YumOptionParser(OptionParser):
+@@ -1713,6 +2093,10 @@ class YumOptionParser(OptionParser):
                          help=_("verbose operation"))
          group.add_option("-y", "--assumeyes", dest="assumeyes",
                  action="store_true", help=_("answer yes for all questions"))
@@ -2105,7 +2125,7 @@ index 1a8202a..604377b 100644
  .br
  Configuration Option: \fBrpmverbosity\fP
 diff --git a/docs/yum.conf.5 b/docs/yum.conf.5
-index 515aa73..babf66d 100644
+index 515aa73..df172fa 100644
 --- a/docs/yum.conf.5
 +++ b/docs/yum.conf.5
 @@ -114,15 +114,27 @@ are causing problems from the transaction.
@@ -2230,7 +2250,7 @@ index 515aa73..babf66d 100644
 +.IP
 +\fBreset_nice \fR
 +If set to true then yum will try to reset the nice value to zero, before
-+running an rpm transaction. Defaults to False.
++running an rpm transaction. Defaults to True.
  
  
  .SH "[repository] OPTIONS"
@@ -148414,14 +148434,16 @@ index 6177fb1..2c8bcb3 100644
 +        # self.assertResult((foo11, bar12, cbar11))
 +        self.assertResult((foo12, bar12, cbar11))
 diff --git a/test/testbase.py b/test/testbase.py
-index d0f22be..c185a7f 100644
+index d0f22be..0a931f1 100644
 --- a/test/testbase.py
 +++ b/test/testbase.py
-@@ -55,6 +55,7 @@ class FakeConf(object):
+@@ -55,6 +55,9 @@ class FakeConf(object):
          self.protected_packages = []
          self.protected_multilib = False
          self.clean_requirements_on_remove = True
 +        self.upgrade_requirements_on_install = False
++        self.recheck_installed_requires = False
++        self.group_command = 'compat'
  
  class FakeSack:
      """ Fake PackageSack to use with FakeRepository"""
@@ -150459,7 +150481,7 @@ index abd203f..572112a 100644
  - 3.4.1
  - umask bug fix.
 diff --git a/yum/__init__.py b/yum/__init__.py
-index 99039e0..fab3553 100644
+index 99039e0..7e84539 100644
 --- a/yum/__init__.py
 +++ b/yum/__init__.py
 @@ -73,6 +73,7 @@ import logginglevels
@@ -150538,7 +150560,15 @@ index 99039e0..fab3553 100644
          self._pkgSack = None
          self._lockfile = None
          self._tags = None
-@@ -213,10 +219,15 @@ class YumBase(depsolve.Depsolve):
+@@ -204,6 +210,7 @@ class YumBase(depsolve.Depsolve):
+ 
+         self.run_with_package_names = set()
+         self._cleanup = []
++        self.exit_code = 0
+ 
+     def __del__(self):
+         self.close()
+@@ -213,10 +220,15 @@ class YumBase(depsolve.Depsolve):
          for cb in self._cleanup: cb()
  
      def close(self):
@@ -150554,7 +150584,7 @@ index 99039e0..fab3553 100644
          if self._repos:
              self._repos.close()
  
-@@ -225,15 +236,33 @@ class YumBase(depsolve.Depsolve):
+@@ -225,15 +237,33 @@ class YumBase(depsolve.Depsolve):
          return transactioninfo.TransactionData()
  
      def doGenericSetup(self, cache=0):
@@ -150590,7 +150620,7 @@ index 99039e0..fab3553 100644
          warnings.warn(_('doConfigSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -297,7 +326,7 @@ class YumBase(depsolve.Depsolve):
+@@ -297,7 +327,7 @@ class YumBase(depsolve.Depsolve):
              # Try the old default
              fn = '/etc/yum.conf'
  
@@ -150599,7 +150629,7 @@ index 99039e0..fab3553 100644
          startupconf.arch = arch
          startupconf.basearch = self.arch.basearch
          if uuid:
-@@ -367,22 +396,36 @@ class YumBase(depsolve.Depsolve):
+@@ -367,22 +397,36 @@ class YumBase(depsolve.Depsolve):
      def doLoggingSetup(self, debuglevel, errorlevel,
                         syslog_ident=None, syslog_facility=None,
                         syslog_device='/dev/log'):
@@ -150643,7 +150673,7 @@ index 99039e0..fab3553 100644
          if repo_age is None:
              repo_age = os.stat(repofn)[8]
          
-@@ -429,7 +472,15 @@ class YumBase(depsolve.Depsolve):
+@@ -429,7 +473,15 @@ class YumBase(depsolve.Depsolve):
  
                  thisrepo.base_persistdir = self.conf._repos_persistdir
  
@@ -150660,7 +150690,7 @@ index 99039e0..fab3553 100644
              if thisrepo.id in self.repo_setopts:
                  for opt in self.repo_setopts[thisrepo.id].items:
                      if not hasattr(thisrepo, opt):
-@@ -440,6 +491,20 @@ class YumBase(depsolve.Depsolve):
+@@ -440,6 +492,20 @@ class YumBase(depsolve.Depsolve):
              if validate and not validate(thisrepo):
                  continue
                      
@@ -150681,7 +150711,7 @@ index 99039e0..fab3553 100644
              # Got our list of repo objects, add them to the repos
              # collection
              try:
-@@ -448,8 +513,11 @@ class YumBase(depsolve.Depsolve):
+@@ -448,8 +514,11 @@ class YumBase(depsolve.Depsolve):
                  self.logger.warning(e)
          
      def getReposFromConfig(self):
@@ -150695,7 +150725,7 @@ index 99039e0..fab3553 100644
          # Read .repo files from directories specified by the reposdir option
          # (typically /etc/yum/repos.d)
          repo_config_age = self.conf.config_file_age
-@@ -472,12 +540,13 @@ class YumBase(depsolve.Depsolve):
+@@ -472,12 +541,13 @@ class YumBase(depsolve.Depsolve):
                      self.getReposFromConfigFile(repofn, repo_age=thisrepo_age)
  
      def readRepoConfig(self, parser, section):
@@ -150714,7 +150744,7 @@ index 99039e0..fab3553 100644
          repo = yumRepo.YumRepository(section)
          try:
              repo.populate(parser, section, self.conf)
-@@ -500,31 +569,31 @@ class YumBase(depsolve.Depsolve):
+@@ -500,31 +570,31 @@ class YumBase(depsolve.Depsolve):
          return repo
  
      def disablePlugins(self):
@@ -150767,7 +150797,7 @@ index 99039e0..fab3553 100644
          if isinstance(self.plugins, plugins.YumPlugins):
              raise RuntimeError(_("plugins already initialised"))
  
-@@ -533,6 +602,8 @@ class YumBase(depsolve.Depsolve):
+@@ -533,6 +603,8 @@ class YumBase(depsolve.Depsolve):
  
      
      def doRpmDBSetup(self):
@@ -150776,7 +150806,7 @@ index 99039e0..fab3553 100644
          warnings.warn(_('doRpmDBSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -552,7 +623,8 @@ class YumBase(depsolve.Depsolve):
+@@ -552,7 +624,8 @@ class YumBase(depsolve.Depsolve):
          return self._rpmdb
  
      def closeRpmDB(self):
@@ -150786,7 +150816,7 @@ index 99039e0..fab3553 100644
          if self._rpmdb is not None:
              self._rpmdb.ts = None
              self._rpmdb.dropCachedData()
-@@ -567,6 +639,12 @@ class YumBase(depsolve.Depsolve):
+@@ -567,6 +640,12 @@ class YumBase(depsolve.Depsolve):
          self._ts = None
  
      def doRepoSetup(self, thisrepo=None):
@@ -150799,7 +150829,7 @@ index 99039e0..fab3553 100644
          warnings.warn(_('doRepoSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -630,6 +708,14 @@ class YumBase(depsolve.Depsolve):
+@@ -630,6 +709,14 @@ class YumBase(depsolve.Depsolve):
          self._repos = RepoStorage(self)
      
      def doSackSetup(self, archlist=None, thisrepo=None):
@@ -150814,7 +150844,7 @@ index 99039e0..fab3553 100644
          warnings.warn(_('doSackSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -711,6 +797,9 @@ class YumBase(depsolve.Depsolve):
+@@ -711,6 +798,9 @@ class YumBase(depsolve.Depsolve):
              
             
      def doUpdateSetup(self):
@@ -150824,7 +150854,7 @@ index 99039e0..fab3553 100644
          warnings.warn(_('doUpdateSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -765,6 +854,8 @@ class YumBase(depsolve.Depsolve):
+@@ -765,6 +855,8 @@ class YumBase(depsolve.Depsolve):
          return self._up
      
      def doGroupSetup(self):
@@ -150833,7 +150863,7 @@ index 99039e0..fab3553 100644
          warnings.warn(_('doGroupSetup() will go away in a future version of Yum.\n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)
  
-@@ -837,7 +928,10 @@ class YumBase(depsolve.Depsolve):
+@@ -837,7 +929,10 @@ class YumBase(depsolve.Depsolve):
          if self._comps.compscount == 0:
              raise Errors.GroupsError, _('No Groups Available in any repository')
  
@@ -150845,7 +150875,7 @@ index 99039e0..fab3553 100644
          self.verbose_logger.debug('group time: %0.3f' % (time.time() - group_st))                
          return self._comps
  
-@@ -881,9 +975,18 @@ class YumBase(depsolve.Depsolve):
+@@ -881,9 +976,18 @@ class YumBase(depsolve.Depsolve):
          if self._history is None:
              pdb_path = self.conf.persistdir + "/history"
              self._history = yum.history.YumHistory(root=self.conf.installroot,
@@ -150865,7 +150895,7 @@ index 99039e0..fab3553 100644
      # properties so they auto-create themselves with defaults
      repos = property(fget=lambda self: self._getRepos(),
                       fset=lambda self, value: setattr(self, "_repos", value),
-@@ -921,6 +1024,11 @@ class YumBase(depsolve.Depsolve):
+@@ -921,6 +1025,11 @@ class YumBase(depsolve.Depsolve):
                         fdel=lambda self: setattr(self, "_history", None),
                         doc="Yum History Object")
  
@@ -150877,7 +150907,7 @@ index 99039e0..fab3553 100644
      pkgtags = property(fget=lambda self: self._getTags(),
                         fset=lambda self, value: setattr(self, "_tags",value),
                         fdel=lambda self: setattr(self, "_tags", None),
-@@ -928,9 +1036,10 @@ class YumBase(depsolve.Depsolve):
+@@ -928,9 +1037,10 @@ class YumBase(depsolve.Depsolve):
      
      
      def doSackFilelistPopulate(self):
@@ -150891,7 +150921,7 @@ index 99039e0..fab3553 100644
          necessary = False
          
          # I can't think of a nice way of doing this, we have to have the sack here
-@@ -951,8 +1060,12 @@ class YumBase(depsolve.Depsolve):
+@@ -951,8 +1061,12 @@ class YumBase(depsolve.Depsolve):
              self.repos.populateSack(mdtype='filelists')
             
      def yumUtilsMsg(self, func, prog):
@@ -150906,7 +150936,7 @@ index 99039e0..fab3553 100644
          if self.rpmdb.contains(name="yum-utils"):
              return
  
-@@ -964,8 +1077,17 @@ class YumBase(depsolve.Depsolve):
+@@ -964,8 +1078,17 @@ class YumBase(depsolve.Depsolve):
               (hibeg, prog, hiend))
  
      def buildTransaction(self, unfinished_transactions_check=True):
@@ -150926,7 +150956,7 @@ index 99039e0..fab3553 100644
          if (unfinished_transactions_check and
              misc.find_unfinished_transactions(yumlibpath=self.conf.persistdir)):
              msg = _('There are unfinished transactions remaining. You might ' \
-@@ -1004,7 +1126,7 @@ class YumBase(depsolve.Depsolve):
+@@ -1004,7 +1127,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 )
  
@@ -150935,7 +150965,7 @@ index 99039e0..fab3553 100644
              self.tsInfo.pkgSack.dropCachedData()
  
          # FIXME: This is horrible, see below and yummain. Maybe create a real
-@@ -1242,13 +1364,15 @@ class YumBase(depsolve.Depsolve):
+@@ -1242,13 +1365,15 @@ class YumBase(depsolve.Depsolve):
          if None in pkgtup:
              return None
          return pkgtup
@@ -150955,7 +150985,7 @@ index 99039e0..fab3553 100644
          if pkgtup is None:
              return
          self._not_found_i[pkgtup] = YumNotFoundPackage(pkgtup)
-@@ -1454,8 +1578,14 @@ class YumBase(depsolve.Depsolve):
+@@ -1454,8 +1579,14 @@ class YumBase(depsolve.Depsolve):
          return probs
  
      def runTransaction(self, cb):
@@ -150971,7 +151001,7 @@ index 99039e0..fab3553 100644
          self.plugins.run('pretrans')
  
          #  We may want to put this other places, eventually, but for now it's
-@@ -1516,10 +1646,23 @@ class YumBase(depsolve.Depsolve):
+@@ -1516,10 +1647,23 @@ class YumBase(depsolve.Depsolve):
                  pass
          self._ts_save_file = None
          
@@ -150995,7 +151025,7 @@ index 99039e0..fab3553 100644
          
          # make resultobject - just a plain yumgenericholder object
          resultobject = misc.GenericHolder()
-@@ -1567,13 +1710,24 @@ class YumBase(depsolve.Depsolve):
+@@ -1567,13 +1711,24 @@ class YumBase(depsolve.Depsolve):
          self.plugins.run('posttrans')
          # sync up what just happened versus what is in the rpmdb
          if not self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST):
@@ -151025,7 +151055,7 @@ index 99039e0..fab3553 100644
          # check to see that the rpmdb and the tsInfo roughly matches
          # push package object metadata outside of rpmdb into yumdb
          # delete old yumdb metadata entries
-@@ -1584,9 +1738,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1584,9 +1739,16 @@ class YumBase(depsolve.Depsolve):
          #    that there is not also an install of this pkg in the tsInfo (reinstall)
          # for any kind of install add from_repo to the yumdb, and the cmdline
          # and the install reason
@@ -151042,7 +151072,7 @@ index 99039e0..fab3553 100644
          for txmbr in self.tsInfo:
              if txmbr.output_state in TS_INSTALL_STATES:
                  if not self.rpmdb.contains(po=txmbr.po):
-@@ -1596,7 +1757,9 @@ class YumBase(depsolve.Depsolve):
+@@ -1596,7 +1758,9 @@ class YumBase(depsolve.Depsolve):
                                             ' but is not!' % txmbr.po))
                      # Note: Get Panu to do te.Failed() so we don't have to
                      txmbr.output_state = TS_FAILED
@@ -151052,7 +151082,7 @@ index 99039e0..fab3553 100644
                  po = self.getInstalledPackageObject(txmbr.pkgtup)
                  rpo = txmbr.po
                  po.yumdb_info.from_repo = rpo.repoid
-@@ -1630,6 +1793,10 @@ class YumBase(depsolve.Depsolve):
+@@ -1630,6 +1794,10 @@ class YumBase(depsolve.Depsolve):
                      if md:
                          po.yumdb_info.from_repo_timestamp = str(md.timestamp)
  
@@ -151063,7 +151093,7 @@ index 99039e0..fab3553 100644
                  loginuid = misc.getloginuid()
                  if txmbr.updates or txmbr.downgrades or txmbr.reinstall:
                      if txmbr.updates:
-@@ -1640,11 +1807,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1640,11 +1808,16 @@ class YumBase(depsolve.Depsolve):
                          opo = po
                      if 'installed_by' in opo.yumdb_info:
                          po.yumdb_info.installed_by = opo.yumdb_info.installed_by
@@ -151080,7 +151110,7 @@ index 99039e0..fab3553 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 +1834,13 @@ class YumBase(depsolve.Depsolve):
+@@ -1662,10 +1835,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
@@ -151094,7 +151124,7 @@ index 99039e0..fab3553 100644
                  self.verbose_logger.log(logginglevels.DEBUG_2, 'What is this? %s' % txmbr.po)
  
          self.plugins.run('postverifytrans')
-@@ -1680,10 +1855,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1680,10 +1856,11 @@ class YumBase(depsolve.Depsolve):
          self.verbose_logger.debug('VerifyTransaction time: %0.3f' % (time.time() - vt_st))
  
      def costExcludePackages(self):
@@ -151110,7 +151140,7 @@ index 99039e0..fab3553 100644
          # if all the repo.costs are equal then don't bother running things
          costs = {}
          for r in self.repos.listEnabled():
-@@ -1705,10 +1881,12 @@ class YumBase(depsolve.Depsolve):
+@@ -1705,10 +1882,12 @@ class YumBase(depsolve.Depsolve):
              done = True
  
      def excludePackages(self, repo=None):
@@ -151126,7 +151156,7 @@ index 99039e0..fab3553 100644
          if "all" in self.conf.disable_excludes:
              return
          
-@@ -1735,9 +1913,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1735,9 +1914,11 @@ class YumBase(depsolve.Depsolve):
              self.pkgSack.addPackageExcluder(repoid, exid,'exclude.match', match)
  
      def includePackages(self, repo):
@@ -151141,7 +151171,7 @@ index 99039e0..fab3553 100644
          includelist = repo.getIncludePkgList()
          
          if len(includelist) == 0:
-@@ -1757,8 +1937,11 @@ class YumBase(depsolve.Depsolve):
+@@ -1757,8 +1938,11 @@ class YumBase(depsolve.Depsolve):
          self.pkgSack.addPackageExcluder(repo.id, exid, 'exclude.marked')
          
      def doLock(self, lockfile = YUM_PID_FILE):
@@ -151155,7 +151185,7 @@ index 99039e0..fab3553 100644
          if self.conf.uid != 0:
              #  If we are a user, assume we are using the root cache ... so don't
              # bother locking.
-@@ -1774,38 +1957,26 @@ class YumBase(depsolve.Depsolve):
+@@ -1774,38 +1958,26 @@ class YumBase(depsolve.Depsolve):
          
          mypid=str(os.getpid())    
          while not self._lock(lockfile, mypid, 0644):
@@ -151209,7 +151239,7 @@ index 99039e0..fab3553 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 +2001,69 @@ class YumBase(depsolve.Depsolve):
+@@ -1830,31 +2002,69 @@ class YumBase(depsolve.Depsolve):
          self._unlock(lockfile)
          self._lockfile = None
          
@@ -151289,7 +151319,7 @@ index 99039e0..fab3553 100644
          failed = False
  
          if type(fo) is types.InstanceType:
-@@ -1894,9 +2103,16 @@ class YumBase(depsolve.Depsolve):
+@@ -1894,9 +2104,16 @@ class YumBase(depsolve.Depsolve):
          
          
      def verifyChecksum(self, fo, checksumType, csum):
@@ -151309,7 +151339,7 @@ index 99039e0..fab3553 100644
          try:
              filesum = misc.checksum(checksumType, fo)
          except Errors.MiscError, e:
-@@ -1908,6 +2124,17 @@ class YumBase(depsolve.Depsolve):
+@@ -1908,6 +2125,17 @@ class YumBase(depsolve.Depsolve):
          return 0
  
      def downloadPkgs(self, pkglist, callback=None, callback_total=None):
@@ -151327,7 +151357,7 @@ index 99039e0..fab3553 100644
          def mediasort(apo, bpo):
              # FIXME: we should probably also use the mediaid; else we
              # could conceivably ping-pong between different disc1's
-@@ -1998,16 +2225,6 @@ class YumBase(depsolve.Depsolve):
+@@ -1998,16 +2226,6 @@ class YumBase(depsolve.Depsolve):
                      os.unlink(local)
  
              checkfunc = (self.verifyPkg, (po, 1), {})
@@ -151344,7 +151374,7 @@ index 99039e0..fab3553 100644
              try:
                  if i == 1 and not local_size and remote_size == po.size:
                      text = os.path.basename(po.relativepath)
-@@ -2032,7 +2249,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2032,7 +2250,7 @@ class YumBase(depsolve.Depsolve):
                  done_repos.add(po.repoid)
  
              except Errors.RepoError, e:
@@ -151353,7 +151383,7 @@ index 99039e0..fab3553 100644
              else:
                  po.localpath = mylocal
                  if po in errors:
-@@ -2052,7 +2269,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2052,7 +2270,22 @@ class YumBase(depsolve.Depsolve):
          return errors
  
      def verifyHeader(self, fo, po, raiseError):
@@ -151377,7 +151407,7 @@ index 99039e0..fab3553 100644
          if type(fo) is types.InstanceType:
              fo = fo.filename
              
-@@ -2076,9 +2308,12 @@ class YumBase(depsolve.Depsolve):
+@@ -2076,9 +2309,12 @@ class YumBase(depsolve.Depsolve):
          return 1
          
      def downloadHeader(self, po):
@@ -151392,7 +151422,7 @@ index 99039e0..fab3553 100644
          if hasattr(po, 'pkgtype') and po.pkgtype == 'local':
              return
                  
-@@ -2122,15 +2357,17 @@ class YumBase(depsolve.Depsolve):
+@@ -2122,15 +2358,17 @@ class YumBase(depsolve.Depsolve):
              return
  
      def sigCheckPkg(self, po):
@@ -151418,7 +151448,7 @@ index 99039e0..fab3553 100644
          if self._override_sigchecks:
              check = False
              hasgpgkey = 0
-@@ -2181,6 +2418,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2181,6 +2419,9 @@ class YumBase(depsolve.Depsolve):
          return result, msg
  
      def cleanUsedHeadersPackages(self):
@@ -151428,7 +151458,7 @@ index 99039e0..fab3553 100644
          filelist = []
          for txmbr in self.tsInfo:
              if txmbr.po.state not in TS_INSTALL_STATES:
-@@ -2218,27 +2458,42 @@ class YumBase(depsolve.Depsolve):
+@@ -2218,27 +2459,42 @@ class YumBase(depsolve.Depsolve):
                      _('%s removed'), fn)
          
      def cleanHeaders(self):
@@ -151473,7 +151503,7 @@ index 99039e0..fab3553 100644
          cachedir = self.conf.persistdir + "/rpmdb-indexes/"
          if not os.path.exists(cachedir):
              filelist = []
-@@ -2272,8 +2527,29 @@ class YumBase(depsolve.Depsolve):
+@@ -2272,8 +2528,29 @@ class YumBase(depsolve.Depsolve):
  
      def doPackageLists(self, pkgnarrow='all', patterns=None, showdups=None,
                         ignore_case=False):
@@ -151505,7 +151535,7 @@ index 99039e0..fab3553 100644
          if showdups is None:
              showdups = self.conf.showdupesfromrepos
          ygh = misc.GenericHolder(iter=pkgnarrow)
-@@ -2323,10 +2599,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2323,10 +2600,22 @@ class YumBase(depsolve.Depsolve):
                      key = (pkg.name, pkg.arch)
                      if pkg.pkgtup in dinst:
                          reinstall_available.append(pkg)
@@ -151531,7 +151561,7 @@ index 99039e0..fab3553 100644
  
          # produce the updates list of tuples
          elif pkgnarrow == 'updates':
-@@ -2461,14 +2749,13 @@ class YumBase(depsolve.Depsolve):
+@@ -2461,14 +2750,13 @@ class YumBase(depsolve.Depsolve):
  
          
      def findDeps(self, pkgs):
@@ -151551,7 +151581,7 @@ index 99039e0..fab3553 100644
          results = {}
  
          for pkg in pkgs:
-@@ -2495,10 +2782,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2495,10 +2783,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):
@@ -151578,7 +151608,7 @@ index 99039e0..fab3553 100644
          sql_fields = []
          for f in fields:
              sql_fields.append(RPM_TO_SQLITE.get(f, f))
-@@ -2661,6 +2960,14 @@ class YumBase(depsolve.Depsolve):
+@@ -2661,6 +2961,14 @@ class YumBase(depsolve.Depsolve):
                      yield (po, vs)
  
      def searchPackageTags(self, criteria):
@@ -151593,7 +151623,7 @@ index 99039e0..fab3553 100644
          results = {} # name = [(criteria, taglist)]
          for c in criteria:
              c = c.lower()
-@@ -2677,11 +2984,16 @@ class YumBase(depsolve.Depsolve):
+@@ -2677,11 +2985,16 @@ class YumBase(depsolve.Depsolve):
          return results
          
      def searchPackages(self, fields, criteria, callback=None):
@@ -151615,7 +151645,7 @@ index 99039e0..fab3553 100644
          warnings.warn(_('searchPackages() will go away in a future version of Yum.\
                        Use searchGenerator() instead. \n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)           
-@@ -2700,6 +3012,19 @@ class YumBase(depsolve.Depsolve):
+@@ -2700,6 +3013,19 @@ class YumBase(depsolve.Depsolve):
      
      def searchPackageProvides(self, args, callback=None,
                                callback_has_matchfor=False):
@@ -151635,7 +151665,7 @@ index 99039e0..fab3553 100644
          def _arg_data(arg):
              if not misc.re_glob(arg):
                  isglob = False
-@@ -2723,7 +3048,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2723,7 +3049,7 @@ class YumBase(depsolve.Depsolve):
                  where = self.returnPackagesByDep(arg)
              else:
                  usedDepString = False
@@ -151644,7 +151674,7 @@ index 99039e0..fab3553 100644
              self.verbose_logger.log(logginglevels.DEBUG_1,
                 P_('Searching %d package', 'Searching %d packages', len(where)), len(where))
              
-@@ -2817,25 +3142,93 @@ class YumBase(depsolve.Depsolve):
+@@ -2817,25 +3143,93 @@ class YumBase(depsolve.Depsolve):
              
          return matches
  
@@ -151749,7 +151779,7 @@ index 99039e0..fab3553 100644
                  if uservisible:
                      if grp.user_visible:
                          installed.append(grp)
-@@ -2848,12 +3241,29 @@ class YumBase(depsolve.Depsolve):
+@@ -2848,12 +3242,29 @@ class YumBase(depsolve.Depsolve):
                  else:
                      available.append(grp)
              
@@ -151782,7 +151812,7 @@ index 99039e0..fab3553 100644
          txmbrs_used = []
          
          thesegroups = self.comps.return_groups(grpid)
-@@ -2861,20 +3271,28 @@ class YumBase(depsolve.Depsolve):
+@@ -2861,20 +3272,28 @@ class YumBase(depsolve.Depsolve):
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
  
          for thisgroup in thesegroups:
@@ -151813,7 +151843,7 @@ index 99039e0..fab3553 100644
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -2898,13 +3316,18 @@ class YumBase(depsolve.Depsolve):
+@@ -2898,13 +3317,18 @@ class YumBase(depsolve.Depsolve):
                              self.tsInfo.remove(txmbr.po.pkgtup)
          
          
@@ -151839,7 +151869,7 @@ index 99039e0..fab3553 100644
          """
  
          if not self.comps.has_group(grpid):
-@@ -2934,12 +3357,47 @@ class YumBase(depsolve.Depsolve):
+@@ -2934,12 +3358,47 @@ class YumBase(depsolve.Depsolve):
              if 'optional' in package_types:
                  pkgs.extend(thisgroup.optional_packages)
  
@@ -151888,7 +151918,7 @@ index 99039e0..fab3553 100644
                  except Errors.InstallError, e:
                      self.verbose_logger.debug(_('No package named %s available to be installed'),
                          pkg)
-@@ -2953,6 +3411,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2953,6 +3412,7 @@ class YumBase(depsolve.Depsolve):
                  group_conditionals = enable_group_conditionals
  
              count_cond_test = 0
@@ -151896,7 +151926,7 @@ index 99039e0..fab3553 100644
              if group_conditionals:
                  for condreq, cond in thisgroup.conditional_packages.iteritems():
                      if self.isPackageInstalled(cond):
-@@ -2997,10 +3456,14 @@ class YumBase(depsolve.Depsolve):
+@@ -2997,10 +3457,14 @@ class YumBase(depsolve.Depsolve):
          return txmbrs_used
  
      def deselectGroup(self, grpid, force=False):
@@ -151915,7 +151945,7 @@ index 99039e0..fab3553 100644
          
          if not self.comps.has_group(grpid):
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -3035,12 +3498,21 @@ class YumBase(depsolve.Depsolve):
+@@ -3035,12 +3499,21 @@ class YumBase(depsolve.Depsolve):
                              self.tsInfo.remove(pkg.pkgtup)
          
      def getPackageObject(self, pkgtup, allow_missing=False):
@@ -151943,7 +151973,7 @@ index 99039e0..fab3553 100644
          # look it up in the self.localPackages first:
          for po in self.localPackages:
              if po.pkgtup == pkgtup:
-@@ -3049,7 +3521,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3049,7 +3522,7 @@ class YumBase(depsolve.Depsolve):
          pkgs = self.pkgSack.searchPkgTuple(pkgtup)
  
          if len(pkgs) == 0:
@@ -151952,7 +151982,7 @@ index 99039e0..fab3553 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 +3537,21 @@ class YumBase(depsolve.Depsolve):
+@@ -3065,13 +3538,21 @@ class YumBase(depsolve.Depsolve):
          return result
  
      def getInstalledPackageObject(self, pkgtup):
@@ -151979,7 +152009,7 @@ index 99039e0..fab3553 100644
              raise Errors.RpmDBError, _('Package tuple %s could not be found in rpmdb') % str(pkgtup)
  
          # Dito. FIXME from getPackageObject() for len() > 1 ... :)
-@@ -3079,9 +3559,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3079,9 +3560,11 @@ class YumBase(depsolve.Depsolve):
          return po
          
      def gpgKeyCheck(self):
@@ -151993,7 +152023,7 @@ index 99039e0..fab3553 100644
          gpgkeyschecked = self.conf.cachedir + '/.gpgkeyschecked.yum'
          if os.path.exists(gpgkeyschecked):
              return 1
-@@ -3106,9 +3588,13 @@ class YumBase(depsolve.Depsolve):
+@@ -3106,9 +3589,13 @@ class YumBase(depsolve.Depsolve):
              return 1
  
      def returnPackagesByDep(self, depstring):
@@ -152009,7 +152039,7 @@ index 99039e0..fab3553 100644
          if not depstring:
              return []
  
-@@ -3135,9 +3621,16 @@ class YumBase(depsolve.Depsolve):
+@@ -3135,9 +3622,16 @@ class YumBase(depsolve.Depsolve):
          return self.pkgSack.getProvides(depname, depflags, depver).keys()
  
      def returnPackageByDep(self, depstring):
@@ -152029,7 +152059,7 @@ index 99039e0..fab3553 100644
          # we get all sorts of randomness here
          errstring = depstring
          if type(depstring) not in types.StringTypes:
-@@ -3149,16 +3642,22 @@ class YumBase(depsolve.Depsolve):
+@@ -3149,16 +3643,22 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _('No Package found for %s') % errstring
          
          ps = ListPackageSack(pkglist)
@@ -152056,7 +152086,7 @@ index 99039e0..fab3553 100644
          if not depstring:
              return []
  
-@@ -3184,12 +3683,47 @@ class YumBase(depsolve.Depsolve):
+@@ -3184,12 +3684,47 @@ class YumBase(depsolve.Depsolve):
  
          return self.rpmdb.getProvides(depname, depflags, depver).keys()
  
@@ -152106,7 +152136,7 @@ index 99039e0..fab3553 100644
          
          
          if len(pkglist) == 0:
-@@ -3198,14 +3732,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3198,14 +3733,23 @@ class YumBase(depsolve.Depsolve):
          if len(pkglist) == 1:
              return pkglist[0]
  
@@ -152136,7 +152166,7 @@ index 99039e0..fab3553 100644
          returnlist = []
          compatArchList = self.arch.get_arch_list(arch)
          multiLib = []
-@@ -3222,9 +3765,9 @@ class YumBase(depsolve.Depsolve):
+@@ -3222,9 +3766,9 @@ class YumBase(depsolve.Depsolve):
                  singleLib.append(po)
                  
          # we now have three lists.  find the best package(s) of each
@@ -152149,7 +152179,7 @@ index 99039e0..fab3553 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 +3781,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3238,7 +3782,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:
@@ -152158,7 +152188,7 @@ index 99039e0..fab3553 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3246,7 +3789,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3246,7 +3790,7 @@ class YumBase(depsolve.Depsolve):
                  if single: returnlist.append(single)
          # similar for the non-multilib case
          elif single:
@@ -152167,8 +152197,12 @@ index 99039e0..fab3553 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3353,20 +3896,24 @@ class YumBase(depsolve.Depsolve):
-             if next == slow:
+@@ -3350,23 +3894,27 @@ class YumBase(depsolve.Depsolve):
+             done = True
+ 
+             slow = next_func(slow)
+-            if next == slow:
++            if node == slow:
                  return None
  
 -    def _at_groupinstall(self, pattern):
@@ -152196,7 +152230,7 @@ index 99039e0..fab3553 100644
      def _at_groupremove(self, pattern):
          " Do groupremove via. leading @ on the cmd line, for remove."
          assert pattern[0] == '@'
-@@ -3398,7 +3945,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3398,7 +3946,7 @@ class YumBase(depsolve.Depsolve):
      def _minus_deselect(self, pattern):
          """ Remove things from the transaction, like kickstart. """
          assert pattern[0] == '-'
@@ -152205,9 +152239,35 @@ index 99039e0..fab3553 100644
  
          if pat and pat[0] == '@':
              pat = pat[1:]
-@@ -3438,13 +3985,35 @@ class YumBase(depsolve.Depsolve):
+@@ -3437,14 +3985,61 @@ class YumBase(depsolve.Depsolve):
+             if flag not in self.tsInfo.probFilterFlags:
                  self.tsInfo.probFilterFlags.append(flag)
  
++    def _install_is_upgrade(self, po, ipkgs):
++        """ See if po is an upgradeable version of an installed pkg.
++        Non-compat. arch differences mean no. """
++
++        if False and self._up is not None:
++            #  This is the old code, not sure it's good to have two paths. And
++            # we don't wnat to create .up. (which requires init repos.) if we
++            # don't have to.
++            return po.pkgtup in self.up.updating_dict
++
++        for ipkg in ipkgs:
++            if po.verLE(ipkg):
++                continue
++            if po.arch == ipkg.arch: # always fine.
++                return True
++            if 'noarch' in (po.arch, ipkg.arch):
++                return True
++            if not self.arch.multilib:
++                return True
++            if canCoinstall(po.arch, ipkg.arch):
++                continue
++            return True
++
++        return False
++
      def install(self, po=None, **kwargs):
 -        """try to mark for install the item specified. Uses provided package 
 -           object, if available. If not it uses the kwargs and gets the best
@@ -152247,7 +152307,7 @@ index 99039e0..fab3553 100644
          pkgs = []
          was_pattern = False
          if po:
-@@ -3477,20 +4046,12 @@ class YumBase(depsolve.Depsolve):
+@@ -3477,20 +4072,12 @@ class YumBase(depsolve.Depsolve):
                      self.verbose_logger.debug(_('Checking for virtual provide or file-provide for %s'), 
                          arg)
  
@@ -152274,18 +152334,18 @@ index 99039e0..fab3553 100644
              else:
                  nevra_dict = self._nevra_kwarg_parse(kwargs)
  
-@@ -3577,8 +4138,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3577,8 +4164,8 @@ class YumBase(depsolve.Depsolve):
                      continue
              
              # make sure this shouldn't be passed to update:
 -            if (self.rpmdb.searchNames([po.name]) and
 -                po.pkgtup in self.up.updating_dict):
 +            ipkgs = self.rpmdb.searchNames([po.name])
-+            if ipkgs and po.verGT(sorted(ipkgs)[-1]):
++            if ipkgs and self._install_is_upgrade(po, ipkgs):
                  txmbrs = self.update(po=po)
                  tx_return.extend(txmbrs)
                  continue
-@@ -3587,7 +4148,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3587,7 +4174,7 @@ class YumBase(depsolve.Depsolve):
              # something else in the repo. Unless there is a obsoletion loop,
              # at which point ignore everything.
              obsoleting_pkg = None
@@ -152294,7 +152354,7 @@ index 99039e0..fab3553 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 +4161,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3600,23 +4187,23 @@ class YumBase(depsolve.Depsolve):
                      already_obs = pkgs[0]
  
                  if already_obs:
@@ -152325,7 +152385,7 @@ index 99039e0..fab3553 100644
                      continue
  
              # make sure we don't have a name.arch of this already installed
-@@ -3630,7 +4191,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3630,7 +4217,7 @@ class YumBase(depsolve.Depsolve):
                          found = True
                          break
                  if not found:
@@ -152334,7 +152394,7 @@ index 99039e0..fab3553 100644
                      txmbrs = self.update(po=po)
                      tx_return.extend(txmbrs)
                      continue
-@@ -3719,14 +4280,33 @@ class YumBase(depsolve.Depsolve):
+@@ -3719,14 +4306,33 @@ class YumBase(depsolve.Depsolve):
          return txmbr
  
      def update(self, po=None, requiringPo=None, update_to=False, **kwargs):
@@ -152375,7 +152435,7 @@ index 99039e0..fab3553 100644
          # check for args - if no po nor kwargs, do them all
          # if po, do it, ignore all else
          # if no po do kwargs
-@@ -3765,7 +4345,12 @@ class YumBase(depsolve.Depsolve):
+@@ -3765,7 +4371,12 @@ class YumBase(depsolve.Depsolve):
                      if new is None:
                          continue
                      tx_return.extend(self.update(po=new))
@@ -152389,7 +152449,7 @@ index 99039e0..fab3553 100644
              return tx_return
  
          # complications
-@@ -3787,7 +4372,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3787,7 +4398,7 @@ class YumBase(depsolve.Depsolve):
                  return self._minus_deselect(kwargs['pattern'])
  
              if kwargs['pattern'] and kwargs['pattern'][0] == '@':
@@ -152398,7 +152458,7 @@ index 99039e0..fab3553 100644
  
              arg = kwargs['pattern']
              if not update_to:
-@@ -3920,6 +4505,18 @@ class YumBase(depsolve.Depsolve):
+@@ -3920,6 +4531,18 @@ class YumBase(depsolve.Depsolve):
                      tx_return.append(txmbr)
                          
          for available_pkg in availpkgs:
@@ -152417,7 +152477,7 @@ index 99039e0..fab3553 100644
              #  Make sure we're not installing a package which is obsoleted by
              # something else in the repo. Unless there is a obsoletion loop,
              # at which point ignore everything.
-@@ -3985,11 +4582,18 @@ class YumBase(depsolve.Depsolve):
+@@ -3985,11 +4608,18 @@ class YumBase(depsolve.Depsolve):
          return tx_return
          
      def remove(self, po=None, **kwargs):
@@ -152441,7 +152501,7 @@ index 99039e0..fab3553 100644
          if not po and not kwargs:
              raise Errors.RemoveError, 'Nothing specified to remove'
          
-@@ -4055,17 +4659,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4055,17 +4685,19 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def installLocal(self, pkg, po=None, updateonly=False):
@@ -152471,7 +152531,7 @@ index 99039e0..fab3553 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 +4789,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4183,16 +4815,15 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def reinstallLocal(self, pkg, po=None):
@@ -152496,7 +152556,7 @@ index 99039e0..fab3553 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4215,9 +4820,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4215,9 +4846,19 @@ class YumBase(depsolve.Depsolve):
          return self.reinstall(po=po)
  
      def reinstall(self, po=None, **kwargs):
@@ -152519,7 +152579,7 @@ index 99039e0..fab3553 100644
          self._add_prob_flags(rpm.RPMPROB_FILTER_REPLACEPKG,
                               rpm.RPMPROB_FILTER_REPLACENEWFILES,
                               rpm.RPMPROB_FILTER_REPLACEOLDFILES)
-@@ -4259,16 +4874,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4259,16 +4900,15 @@ class YumBase(depsolve.Depsolve):
          return tx_mbrs
          
      def downgradeLocal(self, pkg, po=None):
@@ -152544,7 +152604,7 @@ index 99039e0..fab3553 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4309,13 +4923,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4309,13 +4949,19 @@ class YumBase(depsolve.Depsolve):
          return False
          
      def downgrade(self, po=None, **kwargs):
@@ -152571,7 +152631,7 @@ index 99039e0..fab3553 100644
          if not po and not kwargs:
              raise Errors.DowngradeError, 'Nothing specified to downgrade'
  
-@@ -4457,7 +5077,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4457,7 +5103,7 @@ class YumBase(depsolve.Depsolve):
          if e and v and r:
              evr = '%s:%s-%s' % (e, v, r)
          elif v and r:
@@ -152580,7 +152640,7 @@ index 99039e0..fab3553 100644
          elif e and v:
              evr = '%s:%s' % (e, v)
          elif v: # e and r etc. is just too weird to print
-@@ -4500,12 +5120,24 @@ class YumBase(depsolve.Depsolve):
+@@ -4500,12 +5146,24 @@ class YumBase(depsolve.Depsolve):
  
          return returndict
  
@@ -152608,7 +152668,7 @@ index 99039e0..fab3553 100644
          old_conf_obs = self.conf.obsoletes
          self.conf.obsoletes = False
          done = False
-@@ -4515,19 +5147,46 @@ class YumBase(depsolve.Depsolve):
+@@ -4515,19 +5173,46 @@ class YumBase(depsolve.Depsolve):
                      done = True
          for pkg in transaction.trans_data:
              if pkg.state == 'Downgrade':
@@ -152655,7 +152715,7 @@ index 99039e0..fab3553 100644
                  if self.install(pkgtup=pkg.pkgtup):
                      done = True
          for pkg in transaction.trans_data:
-@@ -4538,8 +5197,14 @@ class YumBase(depsolve.Depsolve):
+@@ -4538,8 +5223,14 @@ class YumBase(depsolve.Depsolve):
          return done
  
      def history_undo(self, transaction):
@@ -152672,7 +152732,7 @@ index 99039e0..fab3553 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 :).
-@@ -4674,39 +5339,49 @@ class YumBase(depsolve.Depsolve):
+@@ -4674,39 +5365,49 @@ class YumBase(depsolve.Depsolve):
              if pkgs:
                  pkgs = sorted(pkgs)[-1]
                  msg = (_('Importing %s key 0x%s:\n'
@@ -152740,7 +152800,7 @@ index 99039e0..fab3553 100644
          user_cb_fail = False
          for keyurl in keyurls:
              keys = self._retrievePublicKey(keyurl, repo)
-@@ -4725,7 +5400,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4725,7 +5426,9 @@ class YumBase(depsolve.Depsolve):
                      # Try installing/updating GPG key
                      self._getKeyImportMessage(info, keyurl)
                      rc = False
@@ -152751,7 +152811,7 @@ index 99039e0..fab3553 100644
                          rc = True
                          
                      # grab the .sig/.asc for the keyurl, if it exists
-@@ -4751,8 +5428,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4751,8 +5454,8 @@ class YumBase(depsolve.Depsolve):
                  ts = self.rpmdb.readOnlyTS()
                  result = ts.pgpImportPubkey(misc.procgpgkey(info['raw_key']))
                  if result != 0:
@@ -152762,7 +152822,7 @@ index 99039e0..fab3553 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
  
-@@ -4760,18 +5437,20 @@ class YumBase(depsolve.Depsolve):
+@@ -4760,18 +5463,20 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _("Didn't install any keys")
  
          if not key_installed:
@@ -152788,7 +152848,7 @@ index 99039e0..fab3553 100644
      
      def _getAnyKeyForRepo(self, repo, destdir, keyurl_list, is_cakey=False, callback=None):
          """
-@@ -4788,6 +5467,18 @@ class YumBase(depsolve.Depsolve):
+@@ -4788,6 +5493,18 @@ class YumBase(depsolve.Depsolve):
          """
  
          key_installed = False
@@ -152807,7 +152867,7 @@ index 99039e0..fab3553 100644
          user_cb_fail = False
          for keyurl in keyurl_list:
              keys = self._retrievePublicKey(keyurl, repo, getSig=not is_cakey)
-@@ -4819,8 +5510,11 @@ class YumBase(depsolve.Depsolve):
+@@ -4819,8 +5536,11 @@ class YumBase(depsolve.Depsolve):
                  if not key_installed:
                      self._getKeyImportMessage(info, keyurl, keytype)
                      rc = False
@@ -152820,7 +152880,7 @@ index 99039e0..fab3553 100644
                      elif callback:
                          rc = callback({"repo": repo, "userid": info['userid'],
                                          "hexkeyid": info['hexkeyid'], "keyurl": keyurl,
-@@ -4835,7 +5529,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4835,7 +5555,8 @@ class YumBase(depsolve.Depsolve):
                  # Import the key
                  result = misc.import_key_to_pubring(info['raw_key'], info['hexkeyid'], gpgdir=destdir)
                  if not result:
@@ -152830,7 +152890,7 @@ index 99039e0..fab3553 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
                  # write out the key id to imported_cakeys in the repos basedir
-@@ -4851,36 +5546,35 @@ class YumBase(depsolve.Depsolve):
+@@ -4851,36 +5572,35 @@ class YumBase(depsolve.Depsolve):
                              pass
  
          if not key_installed and user_cb_fail:
@@ -152883,7 +152943,7 @@ index 99039e0..fab3553 100644
          self._getAnyKeyForRepo(repo, repo.gpgcadir, repo.gpgcakey, is_cakey=True, callback=callback)
  
      def _limit_installonly_pkgs(self):
-@@ -4959,19 +5653,22 @@ class YumBase(depsolve.Depsolve):
+@@ -4959,19 +5679,22 @@ class YumBase(depsolve.Depsolve):
              txmbr.depends_on.append(rel)
  
      def processTransaction(self, callback=None,rpmTestDisplay=None, rpmDisplay=None):
@@ -152919,7 +152979,7 @@ index 99039e0..fab3553 100644
          
          if not callback:
              callback = callbacks.ProcessTransNoOutputCallback()
-@@ -5114,13 +5811,19 @@ class YumBase(depsolve.Depsolve):
+@@ -5114,13 +5837,19 @@ class YumBase(depsolve.Depsolve):
          return results
  
      def add_enable_repo(self, repoid, baseurls=[], mirrorlist=None, **kwargs):
@@ -152946,7 +153006,7 @@ index 99039e0..fab3553 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 +5870,15 @@ class YumBase(depsolve.Depsolve):
+@@ -5167,9 +5896,15 @@ class YumBase(depsolve.Depsolve):
  
      def setCacheDir(self, force=False, tmpdir=None, reuse=True,
                      suffix='/$basearch/$releasever'):
@@ -152965,7 +153025,7 @@ index 99039e0..fab3553 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:
-@@ -5220,13 +5929,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5220,13 +5955,24 @@ class YumBase(depsolve.Depsolve):
          self.history.write_addon_data('config-repos', myrepos)
          
      def verify_plugins_cb(self, verify_package):
@@ -152993,7 +153053,7 @@ index 99039e0..fab3553 100644
          if self.tsInfo._unresolvedMembers:
              if auto:
                  self.logger.critical(_("Dependencies not solved. Will not save unresolved transaction."))
-@@ -5234,7 +5954,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5234,7 +5980,7 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError(_("Dependencies not solved. Will not save unresolved transaction."))
          
          if not filename:
@@ -153002,7 +153062,7 @@ index 99039e0..fab3553 100644
              fd,filename = tempfile.mkstemp(suffix='.yumtx', prefix=prefix)
              f = os.fdopen(fd, 'w')
          else:
-@@ -5244,7 +5964,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5244,7 +5990,7 @@ class YumBase(depsolve.Depsolve):
          
          msg = "%s\n" % self.rpmdb.simpleVersion(main_only=True)[0]
          msg += "%s\n" % self.ts.getTsFlags()
@@ -153011,7 +153071,7 @@ index 99039e0..fab3553 100644
              msg += "0\n"
          else:
              msg += "%s\n" % len(self.repos.listEnabled())
-@@ -5266,7 +5986,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5266,7 +6012,17 @@ class YumBase(depsolve.Depsolve):
  
          
      def load_ts(self, filename, ignorerpm=None, ignoremissing=None):
@@ -153030,7 +153090,7 @@ index 99039e0..fab3553 100644
          # check rpmversion - if not match throw a fit
          # check repoversions  (and repos)- if not match throw a fit
          # load each txmbr - if pkgs being updated don't exist, bail w/error
-@@ -5292,6 +6022,16 @@ class YumBase(depsolve.Depsolve):
+@@ -5292,6 +6048,16 @@ class YumBase(depsolve.Depsolve):
          # 3+numrepos = num pkgs
          # 3+numrepos+1 -> EOF= txmembers
          
@@ -153047,7 +153107,7 @@ index 99039e0..fab3553 100644
          # rpm db ver
          rpmv = data[0].strip()
          if rpmv != str(self.rpmdb.simpleVersion(main_only=True)[0]):
-@@ -5329,6 +6069,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5329,6 +6095,7 @@ class YumBase(depsolve.Depsolve):
          pkgcount = 0
          pkgprob = False
          curpkg = None
@@ -159069,7 +159129,7 @@ index 4dcbea7..bb4dde8 100644
          return True
  
 diff --git a/yummain.py b/yummain.py
-index 9f79f4f..e1a9702 100755
+index 9f79f4f..c473df6 100755
 --- a/yummain.py
 +++ b/yummain.py
 @@ -29,13 +29,13 @@ from yum import Errors
@@ -159136,7 +159196,25 @@ index 9f79f4f..e1a9702 100755
              else:
                  logger.critical(_("Another app is currently holding the yum lock; exiting as configured by exit_on_lock"))
                  return 1
-@@ -238,9 +244,15 @@ def main(args):
+@@ -154,7 +160,7 @@ def main(args):
+         for msg in resultmsgs:
+             verbose_logger.log(logginglevels.INFO_2, '%s', msg)
+         if unlock(): return 200
+-        return 0
++        return base.exit_code
+     elif result == 1:
+         # Fatal error
+         for msg in resultmsgs:
+@@ -193,7 +199,7 @@ def main(args):
+     if result == 0:
+         # Normal exit
+         if unlock(): return 200
+-        return 0
++        return base.exit_code
+     elif result == 1:
+         # Fatal error
+         for msg in resultmsgs:
+@@ -238,16 +244,27 @@ def main(args):
          rpmdb_warn_checks()
          return_code = result
          if base._ts_save_file:
@@ -159153,8 +159231,9 @@ index 9f79f4f..e1a9702 100755
      else:
          verbose_logger.log(logginglevels.INFO_2, _('Complete!'))
  
-@@ -248,6 +260,11 @@ def main(args):
-     return return_code
+     if unlock(): return 200
+-    return return_code
++    return return_code or base.exit_code
  
  def hotshot(func, *args, **kwargs):
 +    """Profile the given function using the hotshot profiler.
diff --git a/yum.spec b/yum.spec
index 1227d0f..b5d1fa3 100644
--- a/yum.spec
+++ b/yum.spec
@@ -18,7 +18,7 @@
 Summary: RPM package installer/updater/manager
 Name: yum
 Version: 3.4.3
-Release: 21%{?dist}
+Release: 22%{?dist}
 License: GPLv2+
 Group: System Environment/Base
 Source0: http://yum.baseurl.org/download/3.4/%{name}-%{version}.tar.gz
@@ -311,6 +311,13 @@ exit 0
 %endif
 
 %changelog
+* Fri Mar  9 2012 James Antill <james at fedoraproject.org> - 3.4.3-22
+- update to latest HEAD.
+- Fail on bad reinstall/downgrade arguments. bug 800285.
+- Fix weird multiple obsoletion bug. BZ 800016
+- Check for a compat. arch. as well, when hand testing for upgradability.
+- Allow changing the exit code on non-fatal errors.
+
 * Thu Mar  1 2012 James Antill <james at fedoraproject.org> - 3.4.3-21
 - update to latest HEAD.
 - Translation update.


More information about the scm-commits mailing list