[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