xref: /illumos-gate/usr/src/tools/onbld/Checks/Keywords.py (revision 5328fc53d11d7151861fa272e4fb0248b8f0e145)
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