[Yum-devel] [PATCH 3/3] Fix obsoleting pkgs. from <install norach> to multilib. using archdistance
James Antill
james at and.org
Tue May 18 20:59:40 UTC 2010
---
yum/__init__.py | 40 ++++++++++++++++++++++++++++++++++++----
1 files changed, 36 insertions(+), 4 deletions(-)
diff --git a/yum/__init__.py b/yum/__init__.py
index f5f2b51..773b433 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -41,7 +41,8 @@ from config import ParsingError, ConfigParser
import Errors
import rpmsack
import rpmUtils.updates
-from rpmUtils.arch import canCoinstall, ArchStorage, isMultiLibArch
+from rpmUtils.arch import archDifference, canCoinstall, ArchStorage, isMultiLibArch
+from rpmUtils.miscutils import compareEVR
import rpmUtils.transaction
import comps
import pkgtag_db
@@ -2890,9 +2891,40 @@ class YumBase(depsolve.Depsolve):
oobsoleting.append(opkgtup)
if oobsoleting:
obsoleting = oobsoleting
- # NOTE: if we move from noarch => multilib. then the ordering
- # here seems to always prefer i386 over x86_64 which is wrong.
- # Need to sort by arch?
+ if len(obsoleting) > 1:
+ # Pick the first name, and run with it...
+ first = obsoleting[0]
+ obsoleting = [pkgtup for pkgtup in obsoleting
+ if first[0] == pkgtup[0]]
+ if len(obsoleting) > 1:
+ # Lock to the latest version...
+ def _sort_ver(x, y):
+ n1,a1,e1,v1,r1 = x
+ n2,a2,e2,v2,r2 = y
+ return compareEVR((e1,v1,r1), (e2,v2,r2))
+ obsoleting.sort(_sort_ver)
+ first = obsoleting[0]
+ obsoleting = [pkgtup for pkgtup in obsoleting
+ if not _sort_ver(first, pkgtup)]
+ if len(obsoleting) > 1:
+ # Now do arch distance (see depsolve:compare_providers)...
+ def _sort_arch_i(carch, a1, a2):
+ res1 = archDifference(carch, a1)
+ if not res1:
+ return 0
+ res2 = archDifference(carch, a2)
+ if not res2:
+ return 0
+ return res1 - res2
+ def _sort_arch(x, y):
+ n1,a1,e1,v1,r1 = x
+ n2,a2,e2,v2,r2 = y
+ ret = _sort_arch_i(po.arch, a1, a2)
+ if ret:
+ return ret
+ ret = _sort_arch_i(self.arch.bestarch, a1, a2)
+ return ret
+ obsoleting.sort(_sort_arch)
obsoleting = obsoleting[0]
obsoleting_pkg = self.getPackageObject(obsoleting)
return obsoleting_pkg
--
1.7.0.1
More information about the Yum-devel
mailing list