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