[PATCH] srpm-excluded-arch.py enhancement

Jakub Cajka jcajka at redhat.com
Mon Feb 23 15:08:20 UTC 2015


Hello,

I have prepared enhancement of srpm-excluded-arch.py based on sharkcz's ideas(if I'm not mistaken :) ). I have moved this script from optparse to argparse, added possibility to run this script over multiple paths/directories(for example updates and release, etc.) and prepare list of excluded packages based on most recent ENVR. Also is possible to issue warning(to stderr) if package have multiple versions present and state of exclusion have changed(to warn about possible unintentional changes). Command syntax should be the same as original version, except switch -w, which adds up mentioned warnings(outputted to stderr), and --path accepts more than one path now, expansion is done up to 3 levels using python glob.

I hope it brings desired improvements( and no bugs :)), looking forward for any feedback,... Patch follows.

Best regards,
Jakub


>From b91af25ac1a89b4892cc1ffb4af60346cdb40eca Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jakub=20=C4=8Cajka?= <jcajka at redhat.com>
Date: Mon, 23 Feb 2015 15:57:48 +0100
Subject: [PATCH] srpm-excluded-arch.py can check multiple paths

---
 scripts/srpm-excluded-arch.py | 97 ++++++++++++++++++++++++++++++-------------
 1 file changed, 68 insertions(+), 29 deletions(-)

diff --git a/scripts/srpm-excluded-arch.py b/scripts/srpm-excluded-arch.py
index 2125517..718f7c2 100755
--- a/scripts/srpm-excluded-arch.py
+++ b/scripts/srpm-excluded-arch.py
@@ -3,39 +3,54 @@
 # srpm-exlcuded-arch: is a tool to give you a list of packge names that
 # are excluded on the given arches.  access to a srpm tree is needed.
 #
-# Copyright (C) 2008-2013 Red Hat, Inc.
+# Copyright (C) 2008-2015 Red Hat, Inc.
 # SPDX-License-Identifier:      GPL-2.0+
 #
 # Authors:
 #       Dennis Gilmore <dennis at ausil.us>
+#       Jakub Cajka <jcajka at redhat.com>
 
 import rpm
 import os
 import sys
-import optparse
+import argparse
 import glob
+import types
 
-OptionParser = optparse.OptionParser
-usage = "%prog [options]"
-parser = OptionParser(usage=usage)
-parser.add_option("-a", "--arches", 
-       help="space or command separated list of arches to check for")
-parser.add_option("--path", default='./',
-       help="path to dir with srpms, default current directory")
-(options, args) = parser.parse_args()
-arches = options.arches
-if arches == None:
-   print "You must pass arches to check for in."
-   sys.exit()
-else:
-   if arches.find(',') == -1:
-        arches = arches.split(' ')
-   else:
-        arches = arches.split(',')
-
-srpm_path = options.path
-srpms = glob.glob('%s/*.rpm' % srpm_path)
-pkglist = []
+def rpmvercmp((e1, v1, r1), (e2, v2, r2)):
+    """find out which build is newer"""
+    rc = rpm.labelCompare((e1, v1, r1), (e2, v2, r2))
+    if rc == 1:
+    #first evr wins
+        return 1
+    elif rc == 0:
+    #same evr
+        return 0
+    else:
+        #second evr wins
+        return -1
+
+parser = argparse.ArgumentParser()
+parser.add_argument('-a', '--arches', nargs='+', required=True)
+parser.add_argument('-w', '--withcheck', action='store_true')
+parser.add_argument('--path', nargs='+', default='./')
+args = parser.parse_args()
+
+# be previous version compatible i.e. -a "arch arch ..."
+if len(args.arches) == 1 and type(args.arches[0]) is types.StringType:
+    if args.arches[0].find(',') == -1:
+        args.arches = args.arches[0].split(' ')
+    else:
+        args.arches = args.arches[0].split(',')
+
+arches = args.arches
+srpms = []
+
+for srpm_path  in args.path:
+    srpms += glob.glob('%s/*/*/*.rpm' % srpm_path)
+    srpms += glob.glob('%s/*/*.rpm' % srpm_path)
+    srpms += glob.glob('%s/*.rpm' % srpm_path)
+pkglist = {}
 
 for srpm in srpms:
     """Return the rpm header."""
@@ -52,14 +67,38 @@ for srpm in srpms:
             if arch not in hdr[rpm.RPMTAG_EXCLUSIVEARCH]:
                 if arch not in ExcludeArch:
                     ExcludeArch.append(arch)
-    if ExcludeArch == arches:
-        pkgname = hdr[rpm.RPMTAG_NAME]
-        if pkgname not in pkglist:
-            pkglist.append(pkgname)
-            #print "Excluding: %s" % pkgname
+
+    pkgname = hdr[rpm.RPMTAG_NAME]
+    pkgevr = ('0'if not hdr[rpm.RPMTAG_EPOCH] else str(hdr[rpm.RPMTAG_EPOCH]),
+              hdr[rpm.RPMTAG_VERSION],
+              hdr[rpm.RPMTAG_RELEASE])
+    if not pkgname in pkglist:
+        pkglist[pkgname] = []
+    excluded = set(ExcludeArch) == set(arches)
+
+    pkglist[pkgname].append({'evr':pkgevr, 'excluded':excluded})
 
 output = ""
+warning = ""
+
 for pkg in pkglist:
-    output +=  pkg + " "
+    pkglist[pkg].sort(cmp=rpmvercmp, key=lambda x: x['evr'], reverse=True)
+    if pkglist[pkg][0]['excluded']:
+        output += pkg + " "
+
+    if args.withcheck:
+        last = None
+        change = ""
+        for srpm in pkglist[pkg]:
+            if last and last['excluded'] != srpm['excluded']:
+                change += str(srpm)+'->'+str(last)
+            last = srpm
+        if change:
+            warning += pkg + " " + change + "\n"
+
+if args.withcheck and warning:
+    warning = "WARNING: Fellowing packages have changed their exclude state:\n"+warning
+    sys.stderr.write(warning)
 
 print output
+
-- 
1.9.3


More information about the rel-eng mailing list