Hi!
I was wondering if _requiringFromInstalled couldn't be done easier if the
REMOVE txmbr that is known in checkRemove is passed over. Attached is my
first try to do this. The "if not remove_txmbr:" which more or less needs to
do the same thing as the old code is probably a bit oversimplified (at least
looping over all pkgs/txmbrs might be a good idea).
Anyone an idea of what might get wrong?
Florian
>From e616a45f0ee62cc9ef43932ee33c164800ed2f20 Mon Sep 17 00:00:00 2001
From: Florian Festi <[EMAIL PROTECTED]>
Date: Wed, 13 Feb 2008 12:33:38 +0100
Subject: [PATCH] Use already known txmbr when reloving installed pkgs problems
---
yum/depsolve.py | 108 +++++++++++-------------------------------------------
1 files changed, 22 insertions(+), 86 deletions(-)
diff --git a/yum/depsolve.py b/yum/depsolve.py
index 8c784eb..dcaa34f 100644
--- a/yum/depsolve.py
+++ b/yum/depsolve.py
@@ -242,7 +242,7 @@ class Depsolve(object):
self.verbose_logger.log(logginglevels.DEBUG_1,
_('Removing Package %s'), txmbr.po)
- def _processReq(self, po, requirement):
+ def _processReq(self, po, requirement, remove_txmbr=None):
"""processes a Requires dep from the resolveDeps functions, returns a tuple
of (CheckDeps, missingdep, conflicts, errors) the last item is an array
of error messages"""
@@ -258,7 +258,7 @@ class Depsolve(object):
if po.repo.id != "installed":
CheckDeps, missingdep = self._requiringFromTransaction(po, requirement, errormsgs)
else:
- CheckDeps, missingdep = self._requiringFromInstalled(po, requirement, errormsgs)
+ CheckDeps, missingdep = self._requiringFromInstalled(po, requirement, remove_txmbr, errormsgs)
# Check packages with problems
if missingdep:
@@ -277,7 +277,7 @@ class Depsolve(object):
return (CheckDeps, missingdep, errormsgs)
- def _requiringFromInstalled(self, requiringPo, requirement, errorlist):
+ def _requiringFromInstalled(self, requiringPo, requirement, remove_txmbr, errorlist):
"""processes the dependency resolution for a dep where the requiring
package is installed"""
@@ -292,71 +292,14 @@ class Depsolve(object):
needname, needflags, needversion = requirement
niceformatneed = rpmUtils.miscutils.formatRequire(needname, needversion, needflags)
-
- # we must first find out why the requirement is no longer there
- # we must find out what provides/provided it from the rpmdb (if anything)
- # then check to see if that thing is being acted upon by the transaction set
- # if it is then we need to find out what is being done to it and act accordingly
- needmode = None # mode in the transaction of the needed pkg (if any)
- needpo = None
- providers = []
-
- if self.cheaterlookup.has_key((needname, needflags, needversion)):
- self.verbose_logger.log(logginglevels.DEBUG_2, _('Needed Require has already been looked up, cheating'))
- cheater_po = self.cheaterlookup[(needname, needflags, needversion)]
- providers = [cheater_po]
-
- elif self.rpmdb.contains(name=needname):
- txmbrs = self.tsInfo.matchNaevr(name=needname)
- for txmbr in txmbrs:
- providers.append(txmbr.po)
-
- else:
- self.verbose_logger.log(logginglevels.DEBUG_2, _('Needed Require is not a package name. Looking up: %s'), niceformatneed)
- providers = self.rpmdb.getProvides(needname, needflags, needversion)
-
- for inst_po in providers:
- inst_str = '%s.%s %s:%s-%s' % inst_po.pkgtup
- (i_n, i_a, i_e, i_v, i_r) = inst_po.pkgtup
- self.verbose_logger.log(logginglevels.DEBUG_2,
- _('Potential Provider: %s'), inst_str)
- thismode = self.tsInfo.getMode(name=i_n, arch=i_a,
- epoch=i_e, ver=i_v, rel=i_r)
-
- if thismode is None and i_n in self.conf.exactarchlist:
- # check for mode by the same name+arch
- thismode = self.tsInfo.getMode(name=i_n, arch=i_a)
-
- if thismode is None and i_n not in self.conf.exactarchlist:
- # check for mode by just the name
- thismode = self.tsInfo.getMode(name=i_n)
-
- # if this package is being obsoleted, it's just like if it's
- # being upgraded as far as checking for other providers
- if thismode is None:
- if filter(lambda x: x.obsoleted_by,
- self.tsInfo.matchNaevr(i_n, i_a, i_e, i_v, i_r)):
- thismode = 'u'
-
- if thismode is not None:
- needmode = thismode
-
- self.cheaterlookup[(needname, needflags, needversion)] = inst_po
- self.verbose_logger.log(logginglevels.DEBUG_2, _('Mode is %s for provider of %s: %s'),
- needmode, niceformatneed, inst_str)
- break
-
- self.verbose_logger.log(logginglevels.DEBUG_2, _('Mode for pkg providing %s: %s'),
- niceformatneed, needmode)
-
- if needmode in ['e']:
- self.verbose_logger.log(logginglevels.DEBUG_2, _('TSINFO: %s package requiring %s marked as erase'),
- requiringPo, needname)
- txmbr = self.tsInfo.addErase(requiringPo)
- txmbr.setAsDep(po=inst_po)
- checkdeps = 1
+ if not remove_txmbr:
+ for po in self.rpmdb.getProvides(*requirement):
+ txmbrs = self.tsInfo.getMembersWithState(po.pkgtup, TS_REMOVE_STATES)
+ if txmbrs:
+ remove_txmbr = txmbrs[0]
+ break
- if needmode in ['i', 'u']:
+ if remove_txmbr and (remove_txmbr.obsoleted_by or remove_txmbr.updated_by):
length = len(self.tsInfo)
self.update(name=name, epoch=epoch, version=ver, release=rel)
txmbrs = self.tsInfo.getMembersWithState(requiringPo.pkgtup, TS_REMOVE_STATES)
@@ -370,23 +313,16 @@ class Depsolve(object):
return checkdeps, missingdep
self.verbose_logger.log(logginglevels.DEBUG_2, _('Cannot find an update path for dep for: %s'), niceformatneed)
return self._requiringFromTransaction(requiringPo, requirement, errorlist)
-
- if needmode is None:
- reqpkg = (name, ver, rel, None)
- if self.pkgSack is None:
- return self._requiringFromTransaction(requiringPo, requirement, errorlist)
- else:
- prob_pkg = "%s (%s)" % (requiringPo,requiringPo.repoid)
- msg = _('Unresolvable requirement %s for %s') % (niceformatneed,
- prob_pkg)
- self.verbose_logger.log(logginglevels.DEBUG_2, msg)
- checkdeps = 0
- missingdep = 1
- errorlist.append(msg)
+ if remove_txmbr and remove_txmbr.ts_state=='e' and not (remove_txmbr.obsoleted_by or remove_txmbr.updated_by):
+ self.verbose_logger.log(logginglevels.DEBUG_2, _('TSINFO: %s package requiring %s marked as erase'),
+ requiringPo, needname)
+ txmbr = self.tsInfo.addErase(requiringPo)
+ txmbr.setAsDep(po=remove_txmbr.po)
+ checkdeps = 1
+ return checkdeps, missingdep
- return checkdeps, missingdep
-
+ return self._requiringFromTransaction(requiringPo, requirement, errorlist)
def _requiringFromTransaction(self, requiringPo, requirement, errorlist):
"""processes the dependency resolution for a dep where requiring
@@ -801,8 +737,8 @@ class Depsolve(object):
CheckRemoves = True
missing_in_pkg = False
- for po, dep in thisneeds:
- (checkdep, missing, errormsgs) = self._processReq(po, dep)
+ for po, dep, removed_txmbr in thisneeds:
+ (checkdep, missing, errormsgs) = self._processReq(po, dep, removed_txmbr)
CheckDeps |= checkdep
errors += errormsgs
missing_in_pkg |= missing
@@ -843,7 +779,7 @@ class Depsolve(object):
if not provs:
reqtuple = (req[0], version_tuple_to_string(req[2]), flags[req[1]])
self._dcobj.addRequires(txmbr.po, [reqtuple])
- ret.append( (txmbr.po, (req[0], flags[req[1]], version_tuple_to_string(req[2]))) )
+ ret.append( (txmbr.po, (req[0], flags[req[1]], version_tuple_to_string(req[2])), None) )
continue
#Add relationship
@@ -880,7 +816,7 @@ class Depsolve(object):
if not self.tsInfo.getProvides(rn, rf, rv):
reqtuple = (rn, version_tuple_to_string(rv), flags[rf])
self._dcobj.addRequires(pkg, [reqtuple])
- ret.append( (pkg, (rn, flags[rf], version_tuple_to_string(rv))) )
+ ret.append( (pkg, (rn, flags[rf], version_tuple_to_string(rv)), txmbr) )
return ret
def _checkFileRequires(self):
--
1.5.3.8
_______________________________________________
Yum-devel mailing list
[email protected]
https://lists.dulug.duke.edu/mailman/listinfo/yum-devel