aboutsummaryrefslogtreecommitdiff
path: root/make/scripts/lic_check.sh
blob: c166115ebb63f887e849c5c9ee062543385fc4a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
#! /bin/sh -f
#
# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

#
# This script checks a copyright notice.
#
# The script should be located in the main jdk repository under make/scripts.
# It works with the templates in the make/templates directory of the jdk source.
#
# Usage: "lic_check.sh [-gpl] or [-gplcp] or [-bsd] file(s)"

script_directory=`dirname $0`
script_name=`basename $0`
first_option=$1

# parse the first argument

case "$1" in
	"-gpl")
		header="gpl-header"
		;;
	"-gplcp")
		header="gpl-cp-header"
		;;
	"-bsd")
		header="bsd-header"
                ;;
	*)
		echo "Usage: $0 [-gpl] or [-gplcp] or [-bsd] file(s)" 1>&2
		exit 1
		;;
esac
shift

#initialize error status
error_status=0

# determine and set the absolute path for the script directory
D=`dirname "${script_directory}"`
B=`basename "${script_directory}"`
script_dir="`cd \"${D}\" 2>/dev/null && pwd || echo \"${D}\"`/${B}"

# set up a variable for the templates directory
template_dir=${script_dir}/../templates

# Check existence of the template directory.
if [ ! -d ${template_dir} ] ; then
        echo "ERROR: The templates directory "${template_dir}" doesn't exist." 1>&2
        exit 1
fi

# set the temporary file location
tmpfile=/tmp/source_file.$$
rm -f ${tmpfile}

# check number of lines in the template file
lines=`cat ${template_dir}/${header} | wc -l`

# the template file has one empty line at the end, we need to ignore it
lines=`expr ${lines} - 1`

# A loop through the all script parameters:
#
# 1. Given a set of source files and a license template header, read a file name of each source file.
# 2. Check if a given file exists. When a directory is encountered, dive in and process all sources in those directories.
# 3. Read each line of the given file and check it for a copyright string.
# 4. If a copyright string found, check the correctness of the years format in the string and replace years with %YEARS%.
# 5. Continue reading the file until the number of lines is equal to the length of the license template header ($lines) and remove a comment prefix for each line.
# 6. Store the result (the license header from a given file) into a temporary file.
# 7. If a temporary file is not empty, compare it with a template file to verify if the license text is the same as in a template.
# 8. Produce a error in case a temporary file is empty, it means we didn't find a copyright string, or it's not correct
#
while [ "$#" -gt "0" ] ; do
	touch ${tmpfile}

	# In case of the directory as a parameter check recursively every file inside.
	if [ -d $1 ] ; then
		curdir=`pwd`
		cd $1
		echo "*** Entering directory: "`pwd`
		echo "***"
		files=`ls .`
		sh ${script_dir}/${script_name} ${first_option} ${files}
		status=$?
		if [ ${error_status} -ne 1 ] ; then
			error_status=${status}
		fi
		cd ${curdir}
		shift
		continue
	else
		echo "### Checking copyright notice in the file: "$1
		echo "###"
	fi

	# Check the existence of the source file.
	if [ ! -f $1 ] ; then
        	echo "ERROR: The source file "$1" doesn't exist." 1>&2
		error_status=1
		shift
        	continue
	fi

	# read the source file and determine where the header starts, then get license header without prefix
	counter=0
	while read line ; do
		# remove windows "line feed" character from the line (if any)
		line=`echo "${line}" | tr -d '\r'`
		# check if the given line contains copyright
		check_copyright=`echo "${line}" | grep "Copyright (c) "`
		if [ "${check_copyright}" != "" ] ; then
			# determine the comment prefix
			prefix=`echo "${line}" | cut -d "C" -f 1`
			# remove prefix (we use "_" as a sed delimiter, since the prefix could be like //)
			copyright_without_prefix=`echo "${line}" | sed s_"^${prefix}"__g`
			# copyright years
			year1=`echo "${copyright_without_prefix}" | cut -d " " -f 3`
			year2=`echo "${copyright_without_prefix}" | cut -d " " -f 4`
			# Processing the first year in the copyright string
			length=`expr "${year1}" : '.*'`
			if [ ${length} -ne 5 ] ; then
        			break
			fi
			check_year1=`echo ${year1} | egrep "19[0-9][0-9],|2[0-9][0-9][0-9],"`
			if [ "${check_year1}" = "" ] ; then
        			break
			fi
			# Processing the second year in the copyright string
			if [ "${year2}" != "Oracle" ] ; then
        			length=`expr "${year2}" : '.*'`
        			if [ ${length} -ne 5 ] ; then
                			break
        			else
                			check_year2=`echo ${year2} | egrep "19[0-9][0-9],|2[0-9][0-9][0-9],"`
                			if [ "${check_year2}" = "" ] ; then
                        			break
                			fi
        			fi
			fi

			# copyright string without copyright years
			no_years=`echo "${copyright_without_prefix}" | sed 's/[0-9,]*//g'`
			# copyright string before years
			before_years=`echo "${no_years}" | cut -d "O" -f 1`
			# copyright string after years
			after_years=`echo "${no_years}" | cut -d ")" -f 2`
			# form a new copyright string with %YEARS%
			new_copyright=`echo ${before_years}"%YEARS%"${after_years}`
			# save the new copyright string to a file
			echo "${new_copyright}" > ${tmpfile}
			# start counting the lines
                       	counter=1
			# move to the next line
			continue
		fi
		if [ ${counter} -ne 0 ] ; then
			# this should be a license header line, hence increment counter
			counter=`expr ${counter} + 1`
			# record a string without a prefix to a file
			newline=`echo "${line}" | sed s_"^${prefix}"__`

			# we need to take care of the empty lines in the header, i.e. check the prefix without spaces
			trimmed_prefix=`echo "${prefix}" | tr -d " "`
			trimmed_line=`echo "${line}"  | tr -d " "`
			if [ "${trimmed_line}" = "${trimmed_prefix}" ] ; then
				echo "" >> ${tmpfile}
			else
				echo "${newline}" >> ${tmpfile}
			fi
		fi
		# stop reading lines when a license header ends and add an empty line to the end
		if [ ${counter} -eq ${lines} ] ; then
			echo "" >> ${tmpfile}
			break
		fi
	done < $1

	# compare the license header with a template file
	if [ -s ${tmpfile} ] ; then
		diff -c ${tmpfile} ${template_dir}/${header} 1>&2
		if [ "$?" = "0" ] ; then
			echo "SUCCESS: The license header for "`pwd`"/"$1" has been verified."
			echo "###"
		else
			echo "ERROR: License header is not correct in "`pwd`"/"$1 1>&2
			echo "See diffs above. " 1>&2
			echo "###" 1>&2
			echo "" 1>&2
			error_status=1
		fi
	else
		# If we don't have a temporary file, there is a problem with a copyright string (or no copyright string)
		echo "ERROR: Copyright string is not correct or missing in "`pwd`"/"$1 1>&2
		echo "###" 1>&2
		echo "" 1>&2
		error_status=1
	fi
	rm -f ${tmpfile}
	shift
done
if [ ${error_status} -ne 0 ] ; then
	exit 1
fi