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 (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
25#
26
27#
28# Make sure there is a correctly formed copyright message containing
29# the current year.
30#
31# We treat extant but incorrect copyrights of known format as present
32# for the purposes of the "no copyright found" messages to avoid
33# treating every otherwise incorrect copyright as also not present
34#
35
36import time, re, sys
37
38def err(stream, msg, fname, line=None):
39	if line:
40		stream.write("%s: %d: %s\n" % (fname, line, msg))
41	else:
42		stream.write("%s: %s\n" % (fname, msg))
43
44# pre-2002 copyright with '(c)'
45oldcopyright = re.compile(r'Copyright \(c\) .* Sun Microsystems, Inc\.')
46
47# pre-2002 copyright with 'by'
48oldcopyright1 = re.compile(r'Copyright .* by Sun Microsystems, Inc\.')
49
50# last valid Sun copyright
51suncopyright = re.compile(r'Copyright ([\d, -]+) Sun Microsystems, Inc\.' +
52			  r'(\s+)(All rights reserved\.)?')
53
54# old, check to make sure no longer present
55licterms = 'Use is subject to license terms.'
56
57# initial Oracle copyright
58goodcopyright = re.compile(r'Copyright \(c\) (\d\d\d\d, )?(\d\d\d\d)(,)? ' +
59			   r'Oracle and/or its affiliates\.(\s+)' +
60			   r'All rights reserved\.')
61
62def copyright(fh, filename=None, output=sys.stderr):
63	ret = lineno = rights = 0
64	check_license = False
65
66	if not filename:
67		filename = fh.name
68
69	for line in fh:
70		lineno += 1
71
72		if check_license:
73			check_license = False
74			if licterms in line:
75				err(output, "old '%s' message found" % licterms,
76				    filename, lineno)
77				ret = 1
78				continue
79
80		if oldcopyright.search(line):
81			err(output, "ancient Sun copyright", filename,
82			    lineno)
83			rights += 1
84			ret = 1
85			check_license = True
86			continue
87		elif oldcopyright1.search(line):
88			err(output, "pre-2002 Sun copyright", filename, lineno)
89			rights += 1
90			ret = 1
91			check_license = True
92			continue
93		elif suncopyright.search(line):
94			err(output, "old Sun copyright", filename, lineno)
95			rights += 1
96			ret = 1
97			check_license = True
98			continue
99
100		#
101		# group 1 = optional initial year
102		# group 2 = current year
103		# group 3 = comma after current year
104		# group 4 = spacing between phrases
105		#
106		match = goodcopyright.search(line)
107		if match:
108			# only check for the old license message on the line
109			# following a copyright match
110			check_license = True
111			rights += 1
112
113			year = time.strftime('%Y')
114			if match.group(2) != year:
115				err(output, "wrong copyright year %s, should "
116				    "be %s" %
117				    (match.group(2), year), filename, lineno)
118				ret = 1
119
120			if match.group(3) != ',':
121				err(output, "need comma after current year",
122				    filename, lineno)
123				ret = 1
124
125			if match.group(4) != ' ':
126				err(output, "need one space between copyright "
127				    "and all rights reserved phrases",
128				    filename, lineno)
129				ret = 1
130
131	if rights == 0:
132		err(output, "no copyright message found", filename)
133		ret = 1
134
135	return ret
136