[yum-git] yum/__init__.py
Seth Vidal
skvidal at linux.duke.edu
Fri Mar 28 21:55:01 UTC 2008
yum/__init__.py | 210 +++++++++++++++++++++++++++++++-------------------------
1 file changed, 118 insertions(+), 92 deletions(-)
New commits:
commit 833e6056ee3711813167142d53802e464a0ac258
Author: Seth Vidal <skvidal at fedoraproject.org>
Date: Fri Mar 28 17:53:18 2008 -0400
partial fix for incorrect update for dependency resolution.
still fails: testUpdatenoarchToMultilibForDependency
diff --git a/yum/__init__.py b/yum/__init__.py
index e3d3765..8d97b0e 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -40,6 +40,7 @@ import Errors
import rpmsack
import rpmUtils.updates
import rpmUtils.arch
+from rpmUtils.arch import getCanonArch, archDifference
import rpmUtils.transaction
import comps
import config
@@ -2235,110 +2236,135 @@ class YumBase(depsolve.Depsolve):
return tx_return
- else:
- instpkgs = []
- availpkgs = []
- if po: # just a po
- if po.repoid == 'installed':
- instpkgs.append(po)
- else:
- availpkgs.append(po)
- elif kwargs.has_key('pattern'):
+ # complications
+ # the user has given us something - either a package object to be
+ # added to the transaction as an update or they've given us a pattern
+ # of some kind
+
+ instpkgs = []
+ availpkgs = []
+ if po: # just a po
+ if po.repoid == 'installed':
+ instpkgs.append(po)
+ else:
+ availpkgs.append(po)
+
+
+ elif kwargs.has_key('pattern'):
+ (e, m, u) = self.rpmdb.matchPackageNames([kwargs['pattern']])
+ instpkgs.extend(e)
+ instpkgs.extend(m)
+
+ # if we can't find an installed package then look at available pkgs
+ if not instpkgs:
(e, m, u) = self.pkgSack.matchPackageNames([kwargs['pattern']])
availpkgs.extend(e)
availpkgs.extend(m)
- (e, m, u) = self.rpmdb.matchPackageNames([kwargs['pattern']])
- instpkgs.extend(e)
- instpkgs.extend(m)
-
- else: # we have kwargs, sort them out.
- nevra_dict = self._nevra_kwarg_parse(kwargs)
+
+ else: # we have kwargs, sort them out.
+ nevra_dict = self._nevra_kwarg_parse(kwargs)
- availpkgs = self.pkgSack.searchNevra(name=nevra_dict['name'],
- epoch=nevra_dict['epoch'], arch=nevra_dict['arch'],
+ instpkgs = self.rpmdb.searchNevra(name=nevra_dict['name'],
+ epoch=nevra_dict['epoch'], arch=nevra_dict['arch'],
ver=nevra_dict['version'], rel=nevra_dict['release'])
-
- instpkgs = self.rpmdb.searchNevra(name=nevra_dict['name'],
- epoch=nevra_dict['epoch'], arch=nevra_dict['arch'],
+
+ if not instpkgs:
+ availpkgs = self.pkgSack.searchNevra(name=nevra_dict['name'],
+ epoch=nevra_dict['epoch'], arch=nevra_dict['arch'],
ver=nevra_dict['version'], rel=nevra_dict['release'])
+
+
+
+ # for any thing specified
+ # get the list of available pkgs matching it (or take the po)
+ # get the list of installed pkgs matching it (or take the po)
+ # go through each list and look for:
+ # things obsoleting it if it is an installed pkg
+ # things it updates if it is an available pkg
+ # things updating it if it is an installed pkg
+ # in that order
+ # all along checking to make sure we:
+ # don't update something that's already been obsoleted
+ # don't update something that's already been updated
- # for any thing specified
- # get the list of available pkgs matching it (or take the po)
- # get the list of installed pkgs matching it (or take the po)
- # go through each list and look for:
- # things obsoleting it if it is an installed pkg
- # things it updates if it is an available pkg
- # things updating it if it is an installed pkg
- # in that order
- # all along checking to make sure we:
- # don't update something that's already been obsoleted
-
- # TODO: we should search the updates and obsoletes list and
- # mark the package being updated or obsoleted away appropriately
- # and the package relationship in the tsInfo
-
- if self.conf.obsoletes:
- for installed_pkg in instpkgs:
- for obsoleting in self.up.obsoleted_dict.get(installed_pkg.pkgtup, []):
- obsoleting_pkg = self.getPackageObject(obsoleting)
- # FIXME check for what might be in there here
- txmbr = self.tsInfo.addObsoleting(obsoleting_pkg, installed_pkg)
- self.tsInfo.addObsoleted(installed_pkg, obsoleting_pkg)
- if requiringPo:
- txmbr.setAsDep(requiringPo)
- tx_return.append(txmbr)
- for available_pkg in availpkgs:
- for obsoleted in self.up.obsoleting_dict.get(available_pkg.pkgtup, []):
- obsoleted_pkg = self.getInstalledPackageObject(obsoleted)
- txmbr = self.tsInfo.addObsoleting(available_pkg, obsoleted_pkg)
- if requiringPo:
- txmbr.setAsDep(requiringPo)
- tx_return.append(txmbr)
- if self.tsInfo.isObsoleted(obsoleted):
- self.verbose_logger.log(logginglevels.DEBUG_2, _('Package is already obsoleted: %s.%s %s:%s-%s'), obsoleted)
- else:
- txmbr = self.tsInfo.addObsoleted(obsoleted_pkg, available_pkg)
- tx_return.append(txmbr)
- for available_pkg in availpkgs:
- for updated in self.up.updating_dict.get(available_pkg.pkgtup, []):
- if self.tsInfo.isObsoleted(updated):
- self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s'),
- updated)
- else:
- updated_pkg = self.rpmdb.searchPkgTuple(updated)[0]
- txmbr = self.tsInfo.addUpdate(available_pkg, updated_pkg)
- if requiringPo:
- txmbr.setAsDep(requiringPo)
- tx_return.append(txmbr)
+ # if there are more than one package that matches an update from
+ # a pattern/kwarg then:
+ # if it is a valid update and we'
+
+ # TODO: we should search the updates and obsoletes list and
+ # mark the package being updated or obsoleted away appropriately
+ # and the package relationship in the tsInfo
+
- # check to see if the pkg we want to install is not _quite_ the newest
- # one but still technically an update over what is installed.
- #FIXME - potentially do the comparables thing from what used to
- # be in cli.installPkgs() to see what we should be comparing
- # it to of what is installed. in the meantime name.arch is
- # most likely correct
-
- pot_updated = self.rpmdb.searchNevra(name=available_pkg.name, arch=available_pkg.arch)
- for ipkg in pot_updated:
- if ipkg.EVR < available_pkg.EVR:
- txmbr = self.tsInfo.addUpdate(available_pkg, ipkg)
- if requiringPo:
- txmbr.setAsDep(requiringPo)
- tx_return.append(txmbr)
-
-
+ # check for obsoletes first
+ if self.conf.obsoletes:
for installed_pkg in instpkgs:
- for updating in self.up.updatesdict.get(installed_pkg.pkgtup, []):
- updating_pkg = self.getPackageObject(updating)
- if self.tsInfo.isObsoleted(installed_pkg.pkgtup):
- self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s'),
- installed_pkg.pkgtup)
+ for obsoleting in self.up.obsoleted_dict.get(installed_pkg.pkgtup, []):
+ obsoleting_pkg = self.getPackageObject(obsoleting)
+ # FIXME check for what might be in there here
+ txmbr = self.tsInfo.addObsoleting(obsoleting_pkg, installed_pkg)
+ self.tsInfo.addObsoleted(installed_pkg, obsoleting_pkg)
+ if requiringPo:
+ txmbr.setAsDep(requiringPo)
+ tx_return.append(txmbr)
+ for available_pkg in availpkgs:
+ for obsoleted in self.up.obsoleting_dict.get(available_pkg.pkgtup, []):
+ obsoleted_pkg = self.getInstalledPackageObject(obsoleted)
+ txmbr = self.tsInfo.addObsoleting(available_pkg, obsoleted_pkg)
+ if requiringPo:
+ txmbr.setAsDep(requiringPo)
+ tx_return.append(txmbr)
+ if self.tsInfo.isObsoleted(obsoleted):
+ self.verbose_logger.log(logginglevels.DEBUG_2, _('Package is already obsoleted: %s.%s %s:%s-%s'), obsoleted)
else:
- txmbr = self.tsInfo.addUpdate(updating_pkg, installed_pkg)
- if requiringPo:
- txmbr.setAsDep(requiringPo)
+ txmbr = self.tsInfo.addObsoleted(obsoleted_pkg, available_pkg)
tx_return.append(txmbr)
+ for installed_pkg in instpkgs:
+ for updating in self.up.updatesdict.get(installed_pkg.pkgtup, []):
+ updating_pkg = self.getPackageObject(updating)
+ if self.tsInfo.isObsoleted(installed_pkg.pkgtup):
+ self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s'),
+ installed_pkg.pkgtup)
+ else:
+ print 1
+ txmbr = self.tsInfo.addUpdate(updating_pkg, installed_pkg)
+ if requiringPo:
+ txmbr.setAsDep(requiringPo)
+ tx_return.append(txmbr)
+
+
+ for available_pkg in availpkgs:
+ for updated in self.up.updating_dict.get(available_pkg.pkgtup, []):
+ if self.tsInfo.isObsoleted(updated):
+ self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s'),
+ updated)
+ elif self.tsInfo.getMembersWithState(updated, [TS_UPDATED]):
+ self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already updated: %s.%s %s:%s-%s'),
+ updated)
+
+ else:
+ updated_pkg = self.rpmdb.searchPkgTuple(updated)[0]
+ txmbr = self.tsInfo.addUpdate(available_pkg, updated_pkg)
+ if requiringPo:
+ txmbr.setAsDep(requiringPo)
+ tx_return.append(txmbr)
+
+ # check to see if the pkg we want to install is not _quite_ the newest
+ # one but still technically an update over what is installed.
+ #FIXME - potentially do the comparables thing from what used to
+ # be in cli.installPkgs() to see what we should be comparing
+ # it to of what is installed. in the meantime name.arch is
+ # most likely correct
+ pot_updated = self.rpmdb.searchNevra(name=available_pkg.name, arch=available_pkg.arch)
+ for ipkg in pot_updated:
+ if ipkg.EVR < available_pkg.EVR:
+ txmbr = self.tsInfo.addUpdate(available_pkg, ipkg)
+ if requiringPo:
+ txmbr.setAsDep(requiringPo)
+ tx_return.append(txmbr)
+
+
return tx_return
More information about the Yum-cvs-commits
mailing list