[PATCH] srpm-excluded-arch.py enhancement
Dennis Gilmore
dennis at ausil.us
Mon Apr 20 15:40:05 UTC 2015
Please separate the argparse change from the functionality change
Dennis
On Monday, February 23, 2015 10:08:20 AM Jakub Cajka 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 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
> +
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.fedoraproject.org/pipermail/rel-eng/attachments/20150420/186f2467/attachment.sig>
More information about the rel-eng
mailing list