1*bfed486aSAli Bahrami#! /usr/bin/python 2*bfed486aSAli Bahrami 3*bfed486aSAli Bahrami# 4*bfed486aSAli Bahrami# CDDL HEADER START 5*bfed486aSAli Bahrami# 6*bfed486aSAli Bahrami# The contents of this file are subject to the terms of the 7*bfed486aSAli Bahrami# Common Development and Distribution License (the "License"). 8*bfed486aSAli Bahrami# You may not use this file except in compliance with the License. 9*bfed486aSAli Bahrami# 10*bfed486aSAli Bahrami# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 11*bfed486aSAli Bahrami# or http://www.opensolaris.org/os/licensing. 12*bfed486aSAli Bahrami# See the License for the specific language governing permissions 13*bfed486aSAli Bahrami# and limitations under the License. 14*bfed486aSAli Bahrami# 15*bfed486aSAli Bahrami# When distributing Covered Code, include this CDDL HEADER in each 16*bfed486aSAli Bahrami# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 17*bfed486aSAli Bahrami# If applicable, add the following below this CDDL HEADER, with the 18*bfed486aSAli Bahrami# fields enclosed by brackets "[]" replaced with your own identifying 19*bfed486aSAli Bahrami# information: Portions Copyright [yyyy] [name of copyright owner] 20*bfed486aSAli Bahrami# 21*bfed486aSAli Bahrami# CDDL HEADER END 22*bfed486aSAli Bahrami# 23*bfed486aSAli Bahrami 24*bfed486aSAli Bahrami# 25*bfed486aSAli Bahrami# Copyright 2009 Sun Microsystems, Inc. All rights reserved. 26*bfed486aSAli Bahrami# Use is subject to license terms. 27*bfed486aSAli Bahrami# 28*bfed486aSAli Bahrami 29*bfed486aSAli Bahrami# 30*bfed486aSAli Bahrami# Check that source files contain a valid comment block 31*bfed486aSAli Bahrami# 32*bfed486aSAli Bahrami 33*bfed486aSAli Bahramiimport re, sys 34*bfed486aSAli Bahrami 35*bfed486aSAli BahramiCmntChrs = r'#*!/\\";. ' 36*bfed486aSAli Bahrami 37*bfed486aSAli Bahramiclass CmtBlkError(Exception): 38*bfed486aSAli Bahrami def __init__(self, lineno, seen, shouldbe): 39*bfed486aSAli Bahrami Exception.__init__(self) 40*bfed486aSAli Bahrami self.lineno = lineno 41*bfed486aSAli Bahrami self.seen = seen 42*bfed486aSAli Bahrami self.shouldbe = shouldbe 43*bfed486aSAli Bahrami 44*bfed486aSAli Bahramidef checkblock(block, blk_text): 45*bfed486aSAli Bahrami line = block['start'] 46*bfed486aSAli Bahrami lictxt = block['block'] 47*bfed486aSAli Bahrami 48*bfed486aSAli Bahrami for actual, valid in map(lambda x, y: (x and x.lstrip(CmntChrs), y), 49*bfed486aSAli Bahrami lictxt, blk_text): 50*bfed486aSAli Bahrami if actual != valid: 51*bfed486aSAli Bahrami raise CmtBlkError(line, actual, valid) 52*bfed486aSAli Bahrami line += 1 53*bfed486aSAli Bahrami 54*bfed486aSAli Bahramidef cmtblkchk(fh, blk_name, blk_text, filename=None, 55*bfed486aSAli Bahrami lenient=False, verbose=False, output=sys.stderr): 56*bfed486aSAli Bahrami 57*bfed486aSAli Bahrami ret = 0 58*bfed486aSAli Bahrami blocks = [] 59*bfed486aSAli Bahrami lic = [] 60*bfed486aSAli Bahrami in_cmt = False 61*bfed486aSAli Bahrami start = 0 62*bfed486aSAli Bahrami lineno = 0 63*bfed486aSAli Bahrami 64*bfed486aSAli Bahrami StartText = '%s HEADER START' % blk_name 65*bfed486aSAli Bahrami EndText = '%s HEADER END' % blk_name 66*bfed486aSAli Bahrami full_text = [StartText, ''] + blk_text + ['', EndText] 67*bfed486aSAli Bahrami 68*bfed486aSAli Bahrami StartRE = re.compile(r'^[%s ]*%s' % (CmntChrs, StartText)) 69*bfed486aSAli Bahrami EndRE = re.compile(r'^[%s ]*%s' % (CmntChrs, EndText)) 70*bfed486aSAli Bahrami 71*bfed486aSAli Bahrami if not filename: 72*bfed486aSAli Bahrami filename = fh.name 73*bfed486aSAli Bahrami 74*bfed486aSAli Bahrami for line in fh: 75*bfed486aSAli Bahrami line = line.rstrip('\r\n') 76*bfed486aSAli Bahrami lineno += 1 77*bfed486aSAli Bahrami 78*bfed486aSAli Bahrami if StartRE.search(line): 79*bfed486aSAli Bahrami in_cmt = True 80*bfed486aSAli Bahrami lic.append(line) 81*bfed486aSAli Bahrami start = lineno 82*bfed486aSAli Bahrami elif in_cmt and EndRE.search(line): 83*bfed486aSAli Bahrami in_cmt = False 84*bfed486aSAli Bahrami lic.append(line) 85*bfed486aSAli Bahrami blocks.append({'start':start, 'block':lic}) 86*bfed486aSAli Bahrami start = 0 87*bfed486aSAli Bahrami lic = [] 88*bfed486aSAli Bahrami elif in_cmt: 89*bfed486aSAli Bahrami lic.append(line) 90*bfed486aSAli Bahrami 91*bfed486aSAli Bahrami if in_cmt: 92*bfed486aSAli Bahrami output.write('Error: Incomplete %s block in file %s\n' 93*bfed486aSAli Bahrami ' at line %s\n''' % (blk_name, filename, start)) 94*bfed486aSAli Bahrami 95*bfed486aSAli Bahrami # Check for no comment block, warn if we're not being lenient 96*bfed486aSAli Bahrami if not len(blocks) and not lenient: 97*bfed486aSAli Bahrami if not ret: 98*bfed486aSAli Bahrami ret = 2 99*bfed486aSAli Bahrami output.write("Warning: No %s block in file %s\n" % 100*bfed486aSAli Bahrami (blk_name, filename)) 101*bfed486aSAli Bahrami 102*bfed486aSAli Bahrami # Check for multiple comment blocks 103*bfed486aSAli Bahrami if len(blocks) > 1: 104*bfed486aSAli Bahrami ret = 1 105*bfed486aSAli Bahrami output.write('Error: Multiple %s blocks in file %s\n' 106*bfed486aSAli Bahrami ' at lines %s\n''' % 107*bfed486aSAli Bahrami (blk_name, filename, 108*bfed486aSAli Bahrami ', '.join([str(x['start']) for x in blocks]))) 109*bfed486aSAli Bahrami 110*bfed486aSAli Bahrami # Validate each comment block 111*bfed486aSAli Bahrami for b in blocks: 112*bfed486aSAli Bahrami try: 113*bfed486aSAli Bahrami checkblock(b, full_text) 114*bfed486aSAli Bahrami except CmtBlkError, e: 115*bfed486aSAli Bahrami ret = 1 116*bfed486aSAli Bahrami output.write( 117*bfed486aSAli Bahrami "Error: Invalid line in %s block in file %s\n" 118*bfed486aSAli Bahrami " at line %d, should be\n" 119*bfed486aSAli Bahrami " '%s'\n" 120*bfed486aSAli Bahrami " is\n" 121*bfed486aSAli Bahrami " '%s'\n" % (blk_name, filename, 122*bfed486aSAli Bahrami e.lineno, e.shouldbe, e.seen)) 123*bfed486aSAli Bahrami break 124*bfed486aSAli Bahrami 125*bfed486aSAli Bahrami if verbose and not ret: 126*bfed486aSAli Bahrami output.write("Message: Valid %s block in file %s\n" % 127*bfed486aSAli Bahrami (blk_name, filename)) 128*bfed486aSAli Bahrami 129*bfed486aSAli Bahrami return ret 130