2012-06-19 21:24:45 +00:00
#! /bin/sh -f
#
2021-01-11 07:42:10 +00:00
# Copyright (c) 2012, 2020, Oracle and/or its affiliates. All rights reserved.
2012-06-19 21:24:45 +00:00
# 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.
2021-01-11 07:42:10 +00:00
# It works with the templates in the make/data/license-templates directory of the jdk source.
2012-06-19 21:24:45 +00:00
#
# 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 } "
2021-01-11 07:42:10 +00:00
# set up a variable for the template directory
template_dir = ${ script_dir } /../data/license-templates
2012-06-19 21:24:45 +00:00
# Check existence of the template directory.
if [ ! -d ${ template_dir } ] ; then
2021-01-11 07:42:10 +00:00
echo "ERROR: The template directory " ${ template_dir } " doesn't exist." 1>& 2
2012-06-19 21:24:45 +00:00
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