[yum-git] yum/depsolve.py
Florian Festi
ffesti at linux.duke.edu
Mon May 26 10:52:01 UTC 2008
yum/depsolve.py | 109 +++++++++++---------------------------------------------
1 file changed, 23 insertions(+), 86 deletions(-)
New commits:
commit 41f8ae4532ba7810534a7eefb9e0d05c78a98178
Author: Florian Festi <ffesti at redhat.com>
Date: Wed Feb 13 12:33:38 2008 +0100
Use already known txmbr when resolving installed pkgs problems
diff --git a/yum/depsolve.py b/yum/depsolve.py
index cc5ba2c..8a9811a 100644
--- a/yum/depsolve.py
+++ b/yum/depsolve.py
@@ -206,7 +206,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"""
@@ -222,7 +222,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:
@@ -241,7 +241,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"""
@@ -256,71 +256,15 @@ 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):
+ for txmbr in self.tsInfo.getMembersWithState(po.pkgtup, TS_REMOVE_STATES):
+ if (remove_txmbr is None or
+ (not txmbr.obsoleted_by and not txmbr.updated_by)):
+ # prefer true deletes
+ remove_txmbr = txmbr
- 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)
@@ -334,23 +278,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
@@ -709,8 +646,8 @@ class Depsolve(object):
missing_in_pkg = False
while True:
- 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
@@ -753,7 +690,7 @@ class Depsolve(object):
self.verbose_logger.log(logginglevels.DEBUG_2, _("looking for %s as a requirement of %s"), req, txmbr)
provs = self.tsInfo.getProvides(*req)
if not provs:
- yield (txmbr.po, (req[0], req[1], version_tuple_to_string(req[2])))
+ yield (txmbr.po, (req[0], req[1], version_tuple_to_string(req[2])), None)
#Add relationship
for po in provs:
@@ -784,7 +721,7 @@ class Depsolve(object):
for pkg, hits in self.tsInfo.getRequires(*prov).iteritems():
for rn, rf, rv in hits:
if not self.tsInfo.getProvides(rn, rf, rv):
- yield (pkg, (rn, rf, version_tuple_to_string(rv)))
+ yield (pkg, (rn, rf, version_tuple_to_string(rv)), txmbr)
def _checkFileRequires(self):
fileRequires = set()
More information about the Yum-cvs-commits
mailing list