From f30470260e40ab236c6e980103def01437aaa2a3 Mon Sep 17 00:00:00 2001 From: Denis Silakov Date: Thu, 21 Mar 2013 13:03:23 +0400 Subject: [PATCH] Take versions and flags into account when calculating obsoleted packages --- urpm-repomanage.py | 48 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/urpm-repomanage.py b/urpm-repomanage.py index 5188533..e92ea71 100755 --- a/urpm-repomanage.py +++ b/urpm-repomanage.py @@ -127,6 +127,8 @@ def main(args): verfile = {} pkgdict = {} # hold all of them - put them in (n,a) = [(e,v,r),(e1,v1,r1)] obsolete = {} + obsolete_vers = {} + obsolete_flags = {} keepnum = int(options.keep)*(-1) # the number of items to keep @@ -154,12 +156,20 @@ def main(args): if options.obsolete: obsolete_by_pkg = hdr[rpm.RPMTAG_OBSOLETENAME] + obsolete_by_pkg_flags = hdr[rpm.RPMTAG_OBSOLETEFLAGS] + obsolete_by_pkg_vers = hdr[rpm.RPMTAG_OBSOLETEVERSION] + idx=0; for obs in obsolete_by_pkg: # Do not count packages obsoleted by themselves - let's leave this for rpmlint if hdr['name'] != obs: if obs not in obsolete: obsolete[obs] = [] + obsolete_flags[obs] = [] + obsolete_vers[obs] = [] obsolete[obs].append(hdr['name']) + obsolete_vers[obs].append(obsolete_by_pkg_vers[idx]) + obsolete_flags[obs].append(obsolete_by_pkg_flags[idx]) + idx+=1 pkgtuple = miscutils.pkgDistTupleFromHeader(hdr) (n,a,e,v,r,d) = pkgtuple @@ -192,14 +202,42 @@ def main(args): if options.obsolete: for (n,a) in pkgdict.keys(): evrlist = pkgdict[(n,a)] + idx=0 if n in obsolete: for pkg in evrlist: (e,v,r,d) = pkg - print str(verfile[(n,a,e,v,r,d)]).replace("['","").replace("']","") - if options.verbose: - print >> sys.stderr, str(verfile[(n,a,e,v,r,d)]).replace("['","").replace("']","") + " is obsoleted by:" - for replacement in obsolete[n]: - print >> sys.stderr, " " + replacement + + # Check OBSOLETEFLAGS and OBSOLETEVERSION - do we really satisfy them? + really_obsoleted = 0; + oef = obsolete_flags[n][idx] + + if obsolete_vers[n][idx].find("-") >= 0: + (over,orel) = obsolete_vers[n][idx].split("-"); + else: + over = obsolete_vers[n][idx] + orel = None + + if over.find(":") >= 0: + (oep,over) = over.split(":"); + else: + oep = None + + rc = miscutils.compareEVR((e, v, r), (oep, over, orel)) + + if rc >= 1 and ((oef & rpm.RPMSENSE_GREATER) or (oef & rpm.RPMSENSE_EQUAL)): + really_obsoleted = 1; + if rc == 0 and (oef & rpm.RPMSENSE_EQUAL): + really_obsoleted = 1; + if rc <= -1 and ((oef & rpm.RPMSENSE_LESS) or (oef & rpm.RPMSENSE_EQUAL)): + really_obsoleted = 1; + + if really_obsoleted == 1: + print str(verfile[(n,a,e,v,r,d)]).replace("['","").replace("']","") + if options.verbose: + print >> sys.stderr, str(verfile[(n,a,e,v,r,d)]).replace("['","").replace("']","") + " is obsoleted by:" + for replacement in obsolete[n]: + print >> sys.stderr, " " + replacement + idx+=1 #if new if options.new: