[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