pkgs.py runs on python3
authorparmentelat <thierry.parmentelat@inria.fr>
Mon, 3 Dec 2018 10:36:51 +0000 (11:36 +0100)
committerparmentelat <thierry.parmentelat@inria.fr>
Mon, 3 Dec 2018 10:36:51 +0000 (11:36 +0100)
pkgs.py

diff --git a/pkgs.py b/pkgs.py
index deb8906..d4445f0 100755 (executable)
--- 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 ()
 #
 # -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<plus_minus>[+-]?)'
-    re_qualified += '\s*'
-    re_qualified += '(?P<keyword>{re_ident})'.format(re_ident=re_ident)
-    re_qualified += '\s*'
-    re_qualified += '(?P<qualifier>>=|<=|=)'
-    re_qualified += '\s*'
-    re_qualified += '(?P<fcdistro>{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<plus_minus>[+-]?)'
+    re_qualified += r'\s*'
+    re_qualified += r'(?P<keyword>{re_ident})'.format(re_ident=re_ident)
+    re_qualified += r'\s*'
+    re_qualified += r'(?P<qualifier>>=|<=|=)'
+    re_qualified += r'\s*'
+    re_qualified += r'(?P<fcdistro>{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)