| #!/bin/bash -f | |
| # | |
| # Copyright (c) 2010, 2025, 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. | |
| # | |
| # Script to update the Copyright YEAR range in Mercurial & Git sources. | |
| # (Originally from xdono, Thanks!) | |
| #------------------------------------------------------------ | |
| copyright="Copyright" | |
| copyright_symbol="(c)" | |
| company="Oracle" | |
| year=`date +%Y` | |
| #------------------------------------------------------------ | |
| awk="awk" | |
| # Stop on any error | |
| set -e | |
| # To allow total changes counting | |
| shopt -s lastpipe | |
| # Temp area | |
| tmp=/tmp/`basename $0`.${USER}.$$ | |
| rm -f -r ${tmp} | |
| mkdir -p ${tmp} | |
| total=0 | |
| usage="Usage: `basename "$0"` [-c company] [-y year] [-h|f]" | |
| Help() | |
| { | |
| # Display Help | |
| echo "Updates the Copyright year range in Git sources." | |
| echo | |
| echo "By default, the tool limits the processed changesets " | |
| echo "to those in the current branch and the current year." | |
| echo | |
| echo "Note, cancelling the script will skip cleanup in /tmp." | |
| echo | |
| echo $usage | |
| echo "options:" | |
| echo "-c Specifies the company. Set to Oracle by default." | |
| echo "-y Specifies the copyright year. Set to current year by default." | |
| echo "-f Updates the copyright for all change sets in a given year," | |
| echo " as specified by -y." | |
| echo "-h Print this help." | |
| echo | |
| } | |
| full_year=false | |
| # Process options | |
| while getopts "c:fhy:" option; do | |
| case $option in | |
| c) # supplied company year | |
| company=${OPTARG} | |
| ;; | |
| f) # update all change sets in a full year | |
| full_year=true | |
| ;; | |
| h) # display help | |
| Help | |
| exit 0 | |
| ;; | |
| y) # supplied company year | |
| year=${OPTARG} | |
| ;; | |
| \?) # illegal option | |
| echo "$usage" | |
| exit 1 | |
| ;; | |
| esac | |
| done | |
| # VCS check | |
| git_installed=false | |
| which git > /dev/null && git_installed=true | |
| if [ "$git_installed" != "true" ]; then | |
| echo "Error: This script requires git. Please install it." | |
| exit 1 | |
| fi | |
| git_found=false | |
| git status &> /dev/null && git_found=true | |
| if [ "$git_found" != "true" ]; then | |
| echo "Error: Please execute script from within a JDK git repository." | |
| exit 1 | |
| else | |
| echo "Using Git version control system" | |
| vcs_status=(git ls-files -m) | |
| if [ "$full_year" = "true" ]; then | |
| vcs_list_changesets=(git log --no-merges --since="${year}-01-01T00:00:00Z" --until="${year}-12-31T23:59:59Z" --pretty=tformat:"%H") | |
| else | |
| vcs_list_changesets=(git log --no-merges 'master..HEAD' --since="${year}-01-01T00:00:00Z" --until="${year}-12-31T23:59:59Z" --pretty=tformat:"%H") | |
| fi | |
| vcs_changeset_message=(git log -1 --pretty=tformat:"%B") # followed by ${changeset} | |
| vcs_changeset_files=(git diff-tree --no-commit-id --name-only -r) # followed by ${changeset} | |
| fi | |
| # Return true if it makes sense to edit this file | |
| saneFileToCheck() | |
| { | |
| if [ "$1" != "" -a -f $1 ] ; then | |
| isText=`file "$1" | grep -i -E '(text|source)' | cat` | |
| hasCopyright=`grep 'Copyright' "$1" | cat` | |
| lastLineCount=`tail -1 "$1" | wc -l` | |
| if [ "${isText}" != "" \ | |
| -a "${hasCopyright}" != "" \ | |
| -a ${lastLineCount} -eq 1 ] ; then | |
| echo "true" | |
| else | |
| echo "false" | |
| fi | |
| else | |
| echo "false" | |
| fi | |
| } | |
| # Update the copyright year on a file | |
| updateFile() # file | |
| { | |
| changed="false" | |
| if [ `saneFileToCheck "$1"` = "true" ] ; then | |
| rm -f $1.OLD | |
| mv $1 $1.OLD | |
| cat $1.OLD | \ | |
| sed -e "s@\(${copyright} \(${copyright_symbol} \)\{0,1\}[12][0-9][0-9][0-9],\) [12][0-9][0-9][0-9], ${company}@\1 ${year}, ${company}@" | \ | |
| sed -e "s@\(${copyright} \(${copyright_symbol} \)\{0,1\}[12][0-9][0-9][0-9],\) [12][0-9][0-9][0-9] ${company}@\1 ${year} ${company}@" | \ | |
| sed -e "s@\(${copyright} \(${copyright_symbol} \)\{0,1\}[12][0-9][0-9][0-9],\) ${company}@\1 ${year}, ${company}@" | \ | |
| sed -e "s@\(${copyright} \(${copyright_symbol} \)\{0,1\}[12][0-9][0-9][0-9],\) ${company}@\1, ${year}, ${company}@" | \ | |
| sed -e "s@\(${copyright} \(${copyright_symbol} \)\{0,1\}[12][0-9][0-9][0-9]\) ${company}@\1, ${year} ${company}@" | \ | |
| sed -e "s@${copyright} ${year}, ${year}, ${company}@${copyright} ${year}, ${company}@" | \ | |
| sed -e "s@${copyright} ${copyright_symbol} ${year}, ${year}, ${company}@${copyright} ${copyright_symbol} ${year}, ${company}@" \ | |
| > $1 | |
| if ! diff -b -w $1.OLD $1 > /dev/null ; then \ | |
| changed="true" | |
| rm -f $1.OLD | |
| else | |
| rm -f $1 | |
| mv $1.OLD $1 | |
| fi | |
| fi | |
| echo "${changed}" | |
| } | |
| # Update the copyright year on all files changed by this changeset | |
| updateChangesetFiles() # changeset | |
| { | |
| count=0 | |
| files=${tmp}/files.$1 | |
| rm -f ${files} | |
| "${vcs_changeset_files[@]}" "$1" | expand \ | |
| | ${awk} -F' ' '{for(i=1;i<=NF;i++)print $i}' \ | |
| > ${files} | |
| if [ -f "${files}" -a -s "${files}" ] ; then | |
| fcount=`cat ${files}| wc -l` | |
| for i in `cat ${files}` ; do | |
| if [ `updateFile "${i}"` = "true" ] ; then | |
| count=`expr ${count} '+' 1` | |
| fi | |
| done | |
| if [ ${count} -gt 0 ] ; then | |
| printf " UPDATED year on %d of %d files.\n" ${count} ${fcount} | |
| total=`expr ${total} '+' ${count}` | |
| else | |
| printf " None of the %d files were changed.\n" ${fcount} | |
| fi | |
| else | |
| printf " ERROR: No files changed in the changeset? Must be a mistake.\n" | |
| set -x | |
| ls -al ${files} | |
| "${vcs_changeset_files[@]}" "$1" | |
| "${vcs_changeset_files[@]}" "$1" | expand \ | |
| | ${awk} -F' ' '{for(i=1;i<=NF;i++)print $i}' | |
| set +x | |
| exit 1 | |
| fi | |
| rm -f ${files} | |
| } | |
| # Check if repository is clean | |
| previous=`"${vcs_status[@]}"|wc -l` | |
| if [ ${previous} -ne 0 ] ; then | |
| echo "WARNING: This repository contains previously edited working set files." | |
| echo " ${vcs_status[*]} | wc -l = `"${vcs_status[@]}" | wc -l`" | |
| fi | |
| # Get all changesets this year | |
| all_changesets=${tmp}/all_changesets | |
| rm -f ${all_changesets} | |
| "${vcs_list_changesets[@]}" > ${all_changesets} | |
| # Check changeset to see if it is Copyright only changes, filter changesets | |
| if [ -s ${all_changesets} ] ; then | |
| echo "Changesets made in ${year}: `cat ${all_changesets} | wc -l`" | |
| index=0 | |
| cat ${all_changesets} | while read changeset ; do | |
| index=`expr ${index} '+' 1` | |
| desc=${tmp}/desc.${changeset} | |
| rm -f ${desc} | |
| echo "------------------------------------------------" | |
| "${vcs_changeset_message[@]}" "${changeset}" > ${desc} | |
| printf "%d: %s\n%s\n" ${index} "${changeset}" "`cat ${desc}|head -1`" | |
| if [ "${year}" = "2010" ] ; then | |
| if cat ${desc} | grep -i -F "Added tag" > /dev/null ; then | |
| printf " EXCLUDED tag changeset.\n" | |
| elif cat ${desc} | grep -i -F rebrand > /dev/null ; then | |
| printf " EXCLUDED rebrand changeset.\n" | |
| elif cat ${desc} | grep -i -F copyright > /dev/null ; then | |
| printf " EXCLUDED copyright changeset.\n" | |
| else | |
| updateChangesetFiles ${changeset} | |
| fi | |
| else | |
| if cat ${desc} | grep -i -F "Added tag" > /dev/null ; then | |
| printf " EXCLUDED tag changeset.\n" | |
| elif cat ${desc} | grep -i -F "copyright year" > /dev/null ; then | |
| printf " EXCLUDED copyright year changeset.\n" | |
| else | |
| updateChangesetFiles ${changeset} | |
| fi | |
| fi | |
| rm -f ${desc} | |
| done | |
| fi | |
| if [ ${total} -gt 0 ] ; then | |
| echo "---------------------------------------------" | |
| echo "Updated the copyright year on a total of ${total} files." | |
| if [ ${previous} -eq 0 ] ; then | |
| echo "This count should match the count of modified files in the repository: ${vcs_status[*]}" | |
| else | |
| echo "WARNING: This repository contained previously edited working set files." | |
| fi | |
| echo " ${vcs_status[*]} | wc -l = `"${vcs_status[@]}" | wc -l`" | |
| else | |
| echo "---------------------------------------------" | |
| echo "No files were changed" | |
| if [ ${previous} -ne 0 ] ; then | |
| echo "WARNING: This repository contained previously edited working set files." | |
| fi | |
| echo " ${vcs_status[*]} | wc -l = `"${vcs_status[@]}" | wc -l`" | |
| fi | |
| # Cleanup | |
| rm -f -r ${tmp} | |
| exit 0 |