diff --git a/tools/copyright/copyright b/tools/copyright/copyright new file mode 100644 index 000000000..b786eda5d --- /dev/null +++ b/tools/copyright/copyright @@ -0,0 +1,13 @@ +// Copyright (c) 2017 VMware, Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. diff --git a/tools/copyright/header-check.sh b/tools/copyright/header-check.sh new file mode 100755 index 000000000..99d959dad --- /dev/null +++ b/tools/copyright/header-check.sh @@ -0,0 +1,187 @@ +#!/bin/bash +# Copyright 2016-2017 VMware, Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Simple script that will check files of type .go, .sh, .bash or Makefile +# for the copyright header. +# +# This will be called by the CI system (with no args) to perform checking and +# fail the job if headers are not correctly set. It can also be called with the +# 'fix' argument to automatically add headers to the missing files. +# +# Check if headers are fine: +# $ ./scripts/header-check.sh +# Check and fix headers: +# All changes must be committed for fix to work +# $ ./scripts/header-check.sh fix + +set -e -o pipefail + +# These header variables MUST match the first two lines of the +# VMware-copyright file in the scripts directory. +# +# These will be evaluated as a regex against the target file +HEADER_OLD[1]="^\/\*$" +HEADER_OLD[2]="^\s*Copyright \(c\) [0-9]{4} VMware, Inc\. All Rights Reserved\.$" + +HEADER_NEW[1]="^\/\/ Copyright \(c\) [0-9]{4} VMware, Inc\. All Rights Reserved\.$" +HEADER_NEW[2]="^\/\/$" + +# Initialize vars +ERR=false +FAIL=false +OLD_MATCHED=false + +all-files() { + git ls-files |\ + # Check .go files, Makefile, sh files, bash files, and robot files + # grep -e "\.go$" -e "\.ts$" -e "\.css$" -e "Makefile$" -e "\.sh$" -e "\.bash$" -e "\.robot$" |\ + grep -e "\.sh$" |\ + # Ignore vendor/ + grep -v vendor |\ + # Ignore api test + grep -v apitests + # / |\ + # # Ignore files marked as deleted in git + # grep -v "$(git status -s | grep -e "^\sD" | cut -d' ' -f3)" +} + +for file in $(all-files); do + ext=${file##*.} + if [[ $ext == "go" ]]; then + echo -n "Header check: $file... " + # get the file extension / type + OLD_MATCHED=false + + # match the old style header + for count in $(seq 1 ${#HEADER_OLD[@]}); do + text=${HEADER_OLD[$count]} + if [[ "$increment" = true ]]; then + line=$((count + 1)) + else + line=$count + fi + # do we have a header match? + if [[ $(sed ${line}q\;d ${file}) =~ ${text} ]]; then + OLD_MATCHED=true + fi + done + + # add header if there isn't. + if [ $OLD_MATCHED == true ]; then + # is there is a fix argument and are all changes committed + if [ "$(uname -s)" = "Darwin" ]; then + permissions=$(stat -f "%OLp" ${file}) + else + permissions=$(stat --format '%a' ${file}) + fi + + # make it writable + chmod 755 ${file} + + # remove the old header. + tail -n +15 ${file} > ${file}.new + + mv ${file}.new ${file} + + # make permissions the same + chmod $permissions ${file} + echo "$(tput -T xterm setaf 3)REMOVING OLD HEADER $(tput -T xterm sgr0)" + else + echo "$(tput -T xterm setaf 3)NO OLD HEADER $(tput -T xterm sgr0)" + fi + fi +done + +sleep 2 + +for file in $(all-files); do + echo -n "Header check: $file... " + # get the file extension / type + ext=${file##*.} + + # increment line count in certain cases + increment=false + + # should we be incrementing the line count + if [[ $ext == "sh" ]]; then + increment=true + fi + + # match the new style header + for count in $(seq 1 ${#HEADER_NEW[@]}); do + text=${HEADER_NEW[$count]} + + if [[ "$increment" = true ]]; then + line=$((count + 1)) + else + line=$count + fi + # do we have a header match? + if [[ ! $(sed ${line}q\;d ${file}) =~ ${text} ]]; then + ERR=true + fi + done + + # add header if there isn't. + if [ $ERR == true ]; then + # is there is a fix argument and are all changes committed + if [[ $# -gt 0 && $1 =~ [[:upper:]fix] ]]; then + if [ "$(uname -s)" = "Darwin" ]; then + permissions=$(stat -f "%OLp" ${file}) + else + permissions=$(stat --format '%a' ${file}) + fi + + # make it writable + chmod 755 ${file} + + # based on file type fix the copyright + case "$ext" in + go) + cat ./tools/copyright/copyright ${file} > ${file}.new + ;; + ts) + cat ./tools/copyright/copyright ${file} > ${file}.new + ;; + sh) + head -1 ${file} > ${file}.new + cat ./tools/copyright/copyright | sed 's/\/\//\#/1' >> ${file}.new + tail -n +2 ${file} >> ${file}.new + ;; + *) + cat ./tools/copyright/copyright | sed 's/\/\//\#/1' > ${file}.new + cat ${file} >> ${file}.new + ;; + esac + + mv ${file}.new ${file} + + # make permissions the same + chmod $permissions ${file} + + echo "$(tput -T xterm setaf 3)FIXING$(tput -T xterm sgr0)" + ERR=false + else + echo "$(tput -T xterm setaf 1)FAIL$(tput -T xterm sgr0)" + ERR=false + FAIL=true + fi + else + echo "$(tput -T xterm setaf 2)OK$(tput -T xterm sgr0)" + fi +done + +# If we failed one check, return 1 +[ $FAIL == true ] && exit 1 || exit 0