Hi!
The attached patches improve YumBase.update to handle multilib updates and
obsoletes better. This improves several situations:
Updating noarch to multilib (32 + 64 bit) and vice versa.
Check obsoletes not only for the updating pkg but also for pkgs obsoleted by
the updating pkgs. Also handle noarch <-> multilib transitions in obsoletes
better.
Florian
>From be9925868ec31642e698b44d8905f72799f58236 Mon Sep 17 00:00:00 2001
From: Florian Festi <[EMAIL PROTECTED]>
Date: Tue, 23 Oct 2007 14:34:20 +0200
Subject: [PATCH] Add .obsoleting_dict to updates object to have better access to obsoletes
---
rpmUtils/updates.py | 7 ++++---
1 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/rpmUtils/updates.py b/rpmUtils/updates.py
index 7111957..4a5eeba 100644
--- a/rpmUtils/updates.py
+++ b/rpmUtils/updates.py
@@ -260,6 +260,10 @@ class Updates:
if not self.obsoleted_dict.has_key(old):
self.obsoleted_dict[old] = []
self.obsoleted_dict[old].append(new)
+ self.obsoleting_dict = {}
+ for obsoleted, obsoletings in self.obsoleted_dict.iteritems():
+ for obsoleting in obsoletings:
+ self.obsoleting_dict.setdefault(obsoleting, []).append(obsoleted)
def doUpdates(self):
"""check for key lists as populated then commit acts of evil to
@@ -473,16 +477,13 @@ class Updates:
(rpm_e, rpm_v, rpm_r) = hipdict[(n, rpm_a)][0] # there can be just one
(e, v, r) = hapdict[(n, a)][0] # just one, I'm sure, I swear!
-
rc = rpmUtils.miscutils.compareEVR((e, v, r), (rpm_e, rpm_v, rpm_r))
-
if rc > 0:
# this is definitely an update - put it in the dict
if not updatedict.has_key((n, rpm_a, rpm_e, rpm_v, rpm_r)):
updatedict[(n, rpm_a, rpm_e, rpm_v, rpm_r)] = []
updatedict[(n, rpm_a, rpm_e, rpm_v, rpm_r)].append((n, a, e, v, r))
-
self.updatesdict = updatedict
self.makeUpdatingDict()
--
1.5.2.4
>From 3feceef3116766d9c44fec73a14e3fd80c741136 Mon Sep 17 00:00:00 2001
From: Florian Festi <[EMAIL PROTECTED]>
Date: Tue, 23 Oct 2007 15:51:15 +0200
Subject: [PATCH] Fix some issues in YumBase.update() - handle more that one obsolete per pkg - handle pkgs obsoleted by updates - handle more than one update per packagFix some issues in YumBase.update() - handle more that one obsolete per pkg - handle pkgs obsoleted by updates - handle more than one update per packagee
---
yum/__init__.py | 39 ++++++++++++++++++++++-----------------
1 files changed, 22 insertions(+), 17 deletions(-)
diff --git a/yum/__init__.py b/yum/__init__.py
index 4a202df..056a330 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -1974,7 +1974,6 @@ class YumBase(depsolve.Depsolve):
else:
obsoletes = []
-
tx_return = []
if not po and not kwargs.keys(): # update everything (the easy case)
self.verbose_logger.log(logginglevels.DEBUG_2, 'Updating Everything')
@@ -2032,33 +2031,39 @@ class YumBase(depsolve.Depsolve):
# mark the package being updated or obsoleted away appropriately
# and the package relationship in the tsInfo
- for installed_pkg in instpkgs:
- if self.up.obsoleted_dict.has_key(installed_pkg.pkgtup) and self.conf.obsoletes:
- obsoleting = self.up.obsoleted_dict[installed_pkg.pkgtup][0]
- 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)
- tx_return.append(txmbr)
-
+ 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)
+ 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)
+ 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:
- if self.up.updating_dict.has_key(available_pkg.pkgtup):
- updated = self.up.updating_dict[available_pkg.pkgtup][0]
+ 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)
+ updated)
else:
updated_pkg = self.rpmdb.searchPkgTuple(updated)[0]
txmbr = self.tsInfo.addUpdate(available_pkg, updated_pkg)
tx_return.append(txmbr)
-
for installed_pkg in instpkgs:
- if self.up.updatesdict.has_key(installed_pkg.pkgtup):
- updating = self.up.updatesdict[installed_pkg.pkgtup][0]
+ 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)
+ installed_pkg.pkgtup)
else:
txmbr = self.tsInfo.addUpdate(updating_pkg, installed_pkg)
tx_return.append(txmbr)
--
1.5.2.4
_______________________________________________
Yum-devel mailing list
[email protected]
https://lists.dulug.duke.edu/mailman/listinfo/yum-devel