bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami#! /usr/bin/python
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
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#
8276d7915abc7c44934b5701e6ae35ec26eba740Jonathan Adams# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami#
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami#
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami# Check that source files contain a valid comment block
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami#
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahramiimport re, sys
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali BahramiCmntChrs = r'#*!/\\";. '
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahramiclass CmtBlkError(Exception):
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami def __init__(self, lineno, seen, shouldbe):
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami Exception.__init__(self)
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami self.lineno = lineno
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami self.seen = seen
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami self.shouldbe = shouldbe
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahramidef checkblock(block, blk_text):
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami line = block['start']
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami lictxt = block['block']
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami for actual, valid in map(lambda x, y: (x and x.lstrip(CmntChrs), y),
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami lictxt, blk_text):
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami if actual != valid:
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami raise CmtBlkError(line, actual, valid)
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami line += 1
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahramidef cmtblkchk(fh, blk_name, blk_text, filename=None,
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami lenient=False, verbose=False, output=sys.stderr):
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami ret = 0
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami blocks = []
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami lic = []
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami in_cmt = False
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami start = 0
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami lineno = 0
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami StartText = '%s HEADER START' % blk_name
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami EndText = '%s HEADER END' % blk_name
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami full_text = [StartText, ''] + blk_text + ['', EndText]
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami StartRE = re.compile(r'^[%s ]*%s' % (CmntChrs, StartText))
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami EndRE = re.compile(r'^[%s ]*%s' % (CmntChrs, EndText))
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami if not filename:
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami filename = fh.name
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami for line in fh:
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami line = line.rstrip('\r\n')
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami lineno += 1
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami if StartRE.search(line):
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami in_cmt = True
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami lic.append(line)
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami start = lineno
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami elif in_cmt and EndRE.search(line):
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami in_cmt = False
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami lic.append(line)
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami blocks.append({'start':start, 'block':lic})
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami start = 0
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami lic = []
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami elif in_cmt:
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami lic.append(line)
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami if in_cmt:
8276d7915abc7c44934b5701e6ae35ec26eba740Jonathan Adams output.write('%s: %s: Error: Incomplete %s block\n''' %
8276d7915abc7c44934b5701e6ae35ec26eba740Jonathan Adams (filename, start, blk_name))
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami # Check for no comment block, warn if we're not being lenient
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami if not len(blocks) and not lenient:
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami if not ret:
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami ret = 2
8276d7915abc7c44934b5701e6ae35ec26eba740Jonathan Adams output.write("%s: Warning: No %s block\n" %
8276d7915abc7c44934b5701e6ae35ec26eba740Jonathan Adams (filename, blk_name))
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami # Check for multiple comment blocks
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami if len(blocks) > 1:
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami ret = 1
8276d7915abc7c44934b5701e6ae35ec26eba740Jonathan Adams output.write('%s: Error: Multiple %s blocks\n'
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami ' at lines %s\n''' %
8276d7915abc7c44934b5701e6ae35ec26eba740Jonathan Adams (filename, blk_name,
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami ', '.join([str(x['start']) for x in blocks])))
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami # Validate each comment block
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami for b in blocks:
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami try:
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami checkblock(b, full_text)
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami except CmtBlkError, e:
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami ret = 1
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami output.write(
8276d7915abc7c44934b5701e6ae35ec26eba740Jonathan Adams "%s: %d: Error: Invalid line in %s block:\n"
8276d7915abc7c44934b5701e6ae35ec26eba740Jonathan Adams " should be\n"
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami " '%s'\n"
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami " is\n"
8276d7915abc7c44934b5701e6ae35ec26eba740Jonathan Adams " '%s'\n" % (filename, e.lineno, blk_name,
8276d7915abc7c44934b5701e6ae35ec26eba740Jonathan Adams e.shouldbe, e.seen))
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami break
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami if verbose and not ret:
8276d7915abc7c44934b5701e6ae35ec26eba740Jonathan Adams output.write("%s: Valid %s block\n" %
8276d7915abc7c44934b5701e6ae35ec26eba740Jonathan Adams (filename, blk_name))
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami
bfed486ad8de8b8ebc6345a8e10accae08bf2f45Ali Bahrami return ret