From 388894b0528aa29dab4446a34a09458084c422b1 Mon Sep 17 00:00:00 2001 From: James Antill Date: Mar 09 2012 22:33:38 +0000 Subject: 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. --- 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 - 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 - 3.4.3-21 - update to latest HEAD. - Translation update.