On Mon, 23 Feb 2015 10:08:20 -0500 (EST)
Jakub Cajka <jcajka(a)redhat.com> wrote:
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
and we
also discussed a possibility of adding a test-case. Jakub, thanks for
the patch.
Dan
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(a)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(a)ausil.us>
+# Jakub Cajka <jcajka(a)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
_______________________________________________
rel-eng mailing list
rel-eng(a)lists.fedoraproject.org
https://admin.fedoraproject.org/mailman/listinfo/rel-eng