From 4931f4001fb7ed440383ec48a14050e9529832d8 Mon Sep 17 00:00:00 2001 From: parmentelat Date: Mon, 3 Dec 2018 11:36:51 +0100 Subject: [PATCH] pkgs.py runs on python3 --- pkgs.py | 211 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 108 insertions(+), 103 deletions(-) diff --git a/pkgs.py b/pkgs.py index deb89064..d4445f06 100755 --- a/pkgs.py +++ b/pkgs.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # # This is a replacement for the formerly bash-written function pl_parsePkgs () # @@ -26,34 +26,32 @@ # -package=centos5: p1 p2 # -package<=centos5: p1 p2 -from __future__ import print_function +# pylint: disable=c0111 + import sys from sys import stderr from optparse import OptionParser import re -default_arch='x86_64' +default_arch = 'x86_64' known_arch = ['i386', 'i686', 'x86_64'] default_fcdistro = 'f29' known_fcdistros = [ 'centos5', 'centos6', # oldies but we have references to that in the pkgs files - 'f8', 'f10', 'f12', 'f16', + 'f8', 'f10', 'f12', 'f14', 'f16', 'f18', 'f20', 'f21', 'f22', 'f23', 'f24', # these ones are still relevant - 'f14', 'f18', 'f20', 'f21', 'f22', 'f23', 'f24', 'f25', 'f27', 'f29', + 'f25', 'f27', 'f29', + # scientific linux 'sl6', # debians - 'wheezy','jessie', + 'wheezy', 'jessie', # ubuntus - 'precise', # 12.04 LTS 'trusty', # 14.04 LTS - 'utopic', # 14.10 - 'vivid', # 15.04 - 'wily', # 15.10 - 'xenial', # 16.04 + 'xenial', # 16.04 LTS ] -default_pldistro='onelab' +default_pldistro = 'onelab' known_keywords = [ 'group', 'groupname', 'groupdesc', @@ -94,7 +92,7 @@ class PkgsParser: sys.exit(1) # qualifier is either '>=','<=', or '=' - def match (self, qualifier, version): + def match(self, qualifier, version): if qualifier == '=': return self.version == version elif qualifier == '>=': @@ -102,91 +100,91 @@ class PkgsParser: elif qualifier == '<=': return self.version <= version else: - raise Exception('Internal error - unexpected qualifier {qualifier}'.format(**locals())) + raise Exception( + 'Internal error - unexpected qualifier {}'.format(qualifier)) - m_comment = re.compile('\A\s*#') - m_blank = re.compile('\A\s*\Z') + m_comment = re.compile(r'\A\s*#') + m_blank = re.compile(r'\A\s*\Z') - m_ident = re.compile('\A'+re_ident+'\Z') - re_qualified = '\s*' - re_qualified += '(?P[+-]?)' - re_qualified += '\s*' - re_qualified += '(?P{re_ident})'.format(re_ident=re_ident) - re_qualified += '\s*' - re_qualified += '(?P>=|<=|=)' - re_qualified += '\s*' - re_qualified += '(?P{re_ident}[0-9]+)'.format(re_ident=re_ident) - re_qualified += '\s*' - m_qualified = re.compile('\A{re_qualified}\Z'.format(**locals())) + m_ident = re.compile(r'\A'+re_ident+r'\Z') + re_qualified = r'\s*' + re_qualified += r'(?P[+-]?)' + re_qualified += r'\s*' + re_qualified += r'(?P{re_ident})'.format(re_ident=re_ident) + re_qualified += r'\s*' + re_qualified += r'(?P>=|<=|=)' + re_qualified += r'\s*' + re_qualified += r'(?P{re_ident}[0-9]+)'.format(re_ident=re_ident) + re_qualified += r'\s*' + m_qualified = re.compile(r'\A{}\Z'.format(re_qualified)) re_old = '[a-z]+[+-][a-z]+[0-9]+' - m_old = re.compile('\A{re_old}\Z'.format(**locals())) + m_old = re.compile(r'\A{}\Z'.format(re_old)) # returns a tuple (included, excluded) def parse(self, filename): ok = True included = [] excluded = [] - lineno = 0 try: - for line in file(filename).readlines(): - lineno += 1 - line = line.strip() - if self.m_comment.match(line) or self.m_blank.match(line): - continue - try: - lefts, rights = line.split(':', 1) - for left in lefts.split(): - ########## single ident - if self.m_ident.match(left): - if left not in known_keywords: - raise Exception("Unknown keyword {left}".format(**locals())) - elif left == self.keyword: - included += rights.split() - else: - m = self.m_qualified.match(left) - if m: - (plus_minus, kw, qual, fcdistro) = m.groups() - if kw not in known_keywords: - raise Exception("Unknown keyword in {left}".format(**locals())) - if fcdistro not in known_fcdistros: - raise Exception('Unknown fcdistro {fcdistro}'.format(**locals())) - # skip if another keyword - if kw != self.keyword: continue - # does this fcdistro match ? - (distro, version) = m_fcdistro_cutter.match(fcdistro).groups() - version = int (version) - # skip if another distro family - if distro != self.distro: continue - # skip if the qualifier does not fit - if not self.match (qual, version): - if self.options.verbose: - print('{filename}:{lineno}:qualifer {left} does not apply' - .format(**locals()), file=stderr) - continue - # we're in, let's add (default) or remove (if plus_minus is minus) - if plus_minus == '-': - if self.options.verbose: - print('{filename}:{lineno}: from {left}, excluding {rights}' - .format(**locals()), file=stderr) - excluded += rights.split() - else: - if self.options.verbose: - print('{filename}:{lineno}: from {left}, including {rights}'\ - .format(**locals()), file=stderr) + with open(filename) as feed: + for lineno, line in enumerate(feed, 1): + line = line.strip() + if self.m_comment.match(line) or self.m_blank.match(line): + continue + try: + lefts, rights = line.split(':', 1) + for left in lefts.split(): + ########## single ident + if self.m_ident.match(left): + if left not in known_keywords: + raise Exception("Unknown keyword {left}".format(**locals())) + elif left == self.keyword: included += rights.split() - elif self.m_old.match(left): - raise Exception('Old-fashioned syntax not supported anymore {left}'.\ - format(**locals())) else: - raise Exception('error in left expression {left}'.format(**locals())) + m = self.m_qualified.match(left) + if m: + (plus_minus, kw, qual, fcdistro) = m.groups() + if kw not in known_keywords: + raise Exception("Unknown keyword in {left}".format(**locals())) + if fcdistro not in known_fcdistros: + raise Exception('Unknown fcdistro {fcdistro}'.format(**locals())) + # skip if another keyword + if kw != self.keyword: continue + # does this fcdistro match ? + (distro, version) = m_fcdistro_cutter.match(fcdistro).groups() + version = int (version) + # skip if another distro family + if distro != self.distro: continue + # skip if the qualifier does not fit + if not self.match (qual, version): + if self.options.verbose: + print('{filename}:{lineno}:qualifer {left} does not apply' + .format(**locals()), file=stderr) + continue + # we're in, let's add (default) or remove (if plus_minus is minus) + if plus_minus == '-': + if self.options.verbose: + print('{filename}:{lineno}: from {left}, excluding {rights}' + .format(**locals()), file=stderr) + excluded += rights.split() + else: + if self.options.verbose: + print('{filename}:{lineno}: from {left}, including {rights}'\ + .format(**locals()), file=stderr) + included += rights.split() + elif self.m_old.match(left): + raise Exception('Old-fashioned syntax not supported anymore {left}'.\ + format(**locals())) + else: + raise Exception('error in left expression {left}'.format(**locals())) - except Exception as e: - ok = False - print("{filename}:{lineno}:syntax error: {e}".format(**locals()), file=stderr) - except Exception as e: + except Exception as e: + ok = False + print("{filename}:{lineno}:syntax error: {e}".format(**locals()), file=stderr) + except Exception as exc: ok = False - print('Could not parse file', filename, e, file=stderr) + print('Could not parse file', filename, exc, file=stderr) return (ok, included, excluded) def run (self): @@ -199,11 +197,11 @@ class PkgsParser: excluded += e ok = ok and o # avoid set operations that would not preserve order - results = [ x for x in included if x not in excluded ] + results = [x for x in included if x not in excluded] - results = [ x.replace('@arch@', self.arch).\ - replace('@fcdistro@', self.fcdistro).\ - replace('@pldistro@', self.pldistro) for x in results] + results = [x.replace('@arch@', self.arch) + .replace('@fcdistro@', self.fcdistro) + .replace('@pldistro@', self.pldistro) for x in results] if self.options.sort_results: results.sort() # default is space-separated @@ -217,22 +215,28 @@ class PkgsParser: def main (): usage = "Usage: %prog [options] keyword input[...]" - parser = OptionParser (usage=usage) - parser.add_option ('-a', '--arch', dest='arch', action='store', default=default_arch, - help='target arch, e.g. i386 or x86_64, default={}'.format(default_arch)) - parser.add_option ('-f', '--fcdistro', dest='fcdistro', action='store', default=default_fcdistro, - help='fcdistro, e.g. f12 or centos5') - parser.add_option ('-d', '--pldistro', dest='pldistro', action='store', default=default_pldistro, - help='pldistro, e.g. onelab or planetlab') - parser.add_option ('-v', '--verbose', dest='verbose', action='store_true', default=False, - help='verbose when using qualifiers') - parser.add_option ('-n', '--new-line', dest='new_line', action='store_true', default=False, - help='print outputs separated with newlines rather than with a space') - parser.add_option ('-u', '--no-sort', dest='sort_results', default=True, action='store_false', - help='keep results in the same order as in the inputs') + parser = OptionParser(usage=usage) + parser.add_option( + '-a', '--arch', dest='arch', action='store', default=default_arch, + help='target arch, e.g. i386 or x86_64, default={}'.format(default_arch)) + parser.add_option( + '-f', '--fcdistro', dest='fcdistro', action='store', default=default_fcdistro, + help='fcdistro, e.g. f12 or centos5') + parser.add_option( + '-d', '--pldistro', dest='pldistro', action='store', default=default_pldistro, + help='pldistro, e.g. onelab or planetlab') + parser.add_option( + '-v', '--verbose', dest='verbose', action='store_true', default=False, + help='verbose when using qualifiers') + parser.add_option( + '-n', '--new-line', dest='new_line', action='store_true', default=False, + help='print outputs separated with newlines rather than with a space') + parser.add_option( + '-u', '--no-sort', dest='sort_results', default=True, action='store_false', + help='keep results in the same order as in the inputs') (options, args) = parser.parse_args() - if len(args) <= 1 : + if len(args) <= 1: parser.print_help(file=stderr) sys.exit(1) keyword = args[0] @@ -242,13 +246,14 @@ def main (): parser.print_help(file=stderr) sys.exit(1) if options.arch == 'i686': - options.arch='i386' + options.arch = 'i386' if not options.fcdistro in known_fcdistros: print('Unsupported fcdistro', options.fcdistro, file=stderr) parser.print_help(file=stderr) sys.exit(1) - pkgs = PkgsParser(options.arch, options.fcdistro, options.pldistro, keyword, inputs, options) + pkgs = PkgsParser(options.arch, options.fcdistro, options.pldistro, + keyword, inputs, options) if pkgs.run(): sys.exit(0) -- 2.43.0