| #!@TOOLS_PYTHON@ |
| # |
| # CDDL HEADER START |
| # |
| # The contents of this file are subject to the terms of the |
| # Common Development and Distribution License (the "License"). |
| # You may not use this file except in compliance with the License. |
| # |
| # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
| # or http://www.opensolaris.org/os/licensing. |
| # See the License for the specific language governing permissions |
| # and limitations under the License. |
| # |
| # When distributing Covered Code, include this CDDL HEADER in each |
| # file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
| # If applicable, add the following below this CDDL HEADER, with the |
| # fields enclosed by brackets "[]" replaced with your own identifying |
| # information: Portions Copyright [yyyy] [name of copyright owner] |
| # |
| # CDDL HEADER END |
| # |
| |
| # |
| # Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. |
| # Copyright 2018 OmniOS Community Edition (OmniOSce) Association. |
| # |
| |
| # |
| # Check for valid CDDL blocks in source files. |
| # |
| |
| import sys, os, io, getopt, fnmatch |
| |
| sys.path.insert(1, os.path.join(os.path.dirname(__file__), "..", "lib", |
| "python%d.%d" % sys.version_info[:2])) |
| |
| # Allow running from the source tree, using the modules in the source tree |
| sys.path.insert(2, os.path.join(os.path.dirname(__file__), '..')) |
| |
| from onbld.Checks.Cddl import cddlchk |
| |
| class ExceptionList(object): |
| def __init__(self): |
| self.dirs = [] |
| self.files = [] |
| self.extensions = [] |
| |
| def load(self, exfile): |
| fh = None |
| try: |
| fh = open(exfile, 'r') |
| except IOError as e: |
| sys.stderr.write('Failed to open exception list: ' |
| '%s: %s\n' % (e.filename, e.strerror)) |
| sys.exit(2) |
| |
| for line in fh: |
| line = line.strip() |
| |
| if line.strip().endswith('/'): |
| self.dirs.append(line[0:-1]) |
| elif line.startswith('*.'): |
| self.extensions.append(line) |
| else: |
| self.files.append(line) |
| |
| fh.close() |
| |
| def match(self, filename): |
| if os.path.isdir(filename): |
| return filename in self.dirs |
| else: |
| if filename in self.files: |
| return True |
| |
| for pat in self.extensions: |
| if fnmatch.fnmatch(filename, pat): |
| return True |
| |
| def __contains__(self, elt): |
| return self.match(elt) |
| |
| def usage(): |
| progname = os.path.split(sys.argv[0])[1] |
| sys.stderr.write('''Usage: %s [-av] [-x exceptions] paths... |
| -a check that all the specified files have a CDDL block. |
| -v report on all files, not just those with errors. |
| -x exceptions load an exceptions file |
| ''' % progname) |
| sys.exit(2) |
| |
| |
| def check(filename, opts): |
| try: |
| with io.open(filename, encoding='utf-8', |
| errors='replace') as fh: |
| return cddlchk(fh, verbose=opts['verbose'], |
| lenient=opts['lenient'], |
| output=sys.stdout) |
| except IOError as e: |
| sys.stderr.write("failed to open '%s': %s\n" % |
| (e.filename, e.strerror)) |
| return 1 |
| |
| def walker(opts, dirname, fnames): |
| for f in fnames: |
| path = os.path.join(dirname, f) |
| |
| if not os.path.isdir(path): |
| if not path in opts['exclude']: |
| opts['status'] |= check(path, opts) |
| else: |
| if path in opts['exclude']: |
| fnames.remove(f) |
| |
| def walkpath(path, opts): |
| if os.path.isdir(path): |
| os.path.walk(path, walker, opts) |
| else: |
| if not path in opts['exclude']: |
| opts['status'] |= check(path, opts) |
| |
| def main(args): |
| options = { |
| 'status': 0, |
| 'lenient': True, |
| 'verbose': False, |
| 'exclude': ExceptionList() |
| } |
| |
| try: |
| opts, args = getopt.getopt(sys.argv[1:], 'avx:') |
| except getopt.GetoptError: |
| usage() |
| sys.exit(2) |
| |
| for opt, arg in opts: |
| if opt == '-a': |
| options['lenient'] = False |
| elif opt == '-v': |
| options['verbose'] = True |
| elif opt == '-x': |
| options['exclude'].load(arg) |
| |
| for path in args: |
| walkpath(path, options) |
| |
| return options['status'] |
| |
| if __name__ == '__main__': |
| sys.exit(main(sys.argv[1:])) |