1#! /usr/bin/python 2# 3# CDDL HEADER START 4# 5# The contents of this file are subject to the terms of the 6# Common Development and Distribution License (the "License"). 7# You may not use this file except in compliance with the License. 8# 9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10# or http://www.opensolaris.org/os/licensing. 11# See the License for the specific language governing permissions 12# and limitations under the License. 13# 14# When distributing Covered Code, include this CDDL HEADER in each 15# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16# If applicable, add the following below this CDDL HEADER, with the 17# fields enclosed by brackets "[]" replaced with your own identifying 18# information: Portions Copyright [yyyy] [name of copyright owner] 19# 20# CDDL HEADER END 21# 22 23# 24# Copyright 2008 Sun Microsystems, Inc. All rights reserved. 25# Use is subject to license terms. 26# 27 28# Copyright 2018 OmniOS Community Edition (OmniOSce) Association. 29 30# 31# Mercurial (lack of) keyword checks 32# 33 34import re, sys 35 36# A general 'ident'-style decleration, to allow for leniency. 37ident = re.compile(r'((\%Z\%(\%M\%)\s+\%I\%|\%W\%)\s+\%E\% SMI)') 38 39# 40# Absolutely anything that appears to be an SCCS keyword. 41# It's impossible to programatically differentiate between these 42# and other, legitimate, uses of matching strings. 43# 44anykword = re.compile(r'%[A-ILMP-UWYZ]%') 45 46def keywords(fh, filename=None, lenient=False, verbose=False, 47 output=sys.stderr): 48 '''Search FH for SCCS keywords, which should not be present when 49 Mercurial is in use. 50 51 If LENIENT, accept #ident-style declarations, for the purposes of 52 migration''' 53 54 if not filename: 55 filename = fh.name 56 57 ret = 0 58 lineno = 0 59 60 for line in fh: 61 line = line.rstrip('\r\n') 62 lineno += 1 63 64 if lenient and ident.search(line): 65 continue 66 67 match = anykword.findall(line) 68 if match: 69 ret = 1 70 output.write('%s: %d: contains SCCS keywords "%s"\n' % 71 (filename, lineno, ', '.join(match))) 72 if verbose: 73 output.write(" %s\n" % line) 74 75 return ret 76