Otherwise we install two different versions, if the newer pkg doesn't also do the obsoletes (stupid, stupid, packaging). --- yum/__init__.py | 9 +++++++++ yum/transactioninfo.py | 11 +++++++++++ 2 files changed, 20 insertions(+), 0 deletions(-)
diff --git a/yum/__init__.py b/yum/__init__.py index 0df32a3..adc43d9 100644 --- a/yum/__init__.py +++ b/yum/__init__.py @@ -2990,6 +2990,15 @@ class YumBase(depsolve.Depsolve): # It's a minor UI problem for RHEL, but might as well dtrt. obs_pkgs = [self.getPackageObject(tup) for tup in obs_tups] for obsoleting_pkg in packagesNewestByNameArch(obs_pkgs): + newer = self.tsInfo.findNewer(obsoleting_pkg) + if newer: + # This is to work around pkgA-1 obs pkgB, but pkgA-2 + # doesn't. So we don't want to install two versions. + tx = newer[0] + txmbr = self.tsInfo.addObsoleting(tx.po, installed_pkg) + self.tsInfo.addObsoleted(installed_pkg, tx.po) + tx_return.append(txmbr) + continue tx_return.extend(self.install(po=obsoleting_pkg)) for available_pkg in availpkgs: for obsoleted in self.up.obsoleting_dict.get(available_pkg.pkgtup, []): diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py index 84dbb4b..85e035d 100644 --- a/yum/transactioninfo.py +++ b/yum/transactioninfo.py @@ -155,6 +155,17 @@ class TransactionData: return result + def findNewer(self, po, states=('i', 'u')): + """ Return any packages in the transaction that are newer than the + given package. Can also filter to states, default is + install/update. """ + + ret = [] + for txmbr in self.matchNaevr(name=po.name): + if txmbr in states and txmbr.po.verGT(po): + ret.append(txmbr) + return ret + def _isLocalPackage(self, txmember): # Is this the right criteria? # FIXME: This is kinda weird, we really want all local pkgs to be in a -- 1.6.2.5 _______________________________________________ Yum-devel mailing list Yum-devel@lists.baseurl.org http://lists.baseurl.org/mailman/listinfo/yum-devel