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