blob: 8a7451eaeb7daec29dd28816b257515d3366ceb5 [file] [log] [blame]
#!/usr/bin/env bash
# Copyright (c) Microsoft Corporation
# SPDX-License-Identifier: Apache-2.0
# This script accepts either a list of files relative to the current
# working directory, or it will check all files tracked in Git. In
# both cases, it ignores files matching any regular expression listed
# in '.check-license.ignore'.
set -o errexit
set -o pipefail
license=("Copyright" "SPDX-License-Identifier:")
root=$(git rev-parse --show-toplevel)
# If we are inside mingw* environment, then we update the path to proper format
if [[ $(uname) == MINGW* ]] ; then
root=$(cygpath -u "${root}")
fi
ignore_res=()
while IFS=$'\r' read -r i; do
if [[ $i =~ ^# ]] || [[ -z $i ]]; then # ignore comments
continue
fi
ignore_res+=("$i")
done < "$root/scripts/.check-license.ignore"
should_ignore() {
for re in "${ignore_res[@]}"; do
if [[ $1 =~ $re ]]; then
return
fi
done
false
}
# Create array of files to check, either from the given arguments or
# all files in Git, ignore any that match a regex in the ignore file.
files=()
if [[ $# -ne 0 ]]; then
for f in "$@"; do
file=$(realpath -q "$f") || file=""
if [[ ! -f $file ]]; then # skip non-existent files
continue
fi
file=${file#$root/} # remove the prefix
if should_ignore "$file"; then
continue
fi
files+=("$file")
done
else
# Find all files in Git. These are guaranteed to exist, to not be
# generated, and to not have the prefix.
cd "$root"
while IFS= read -r -d '' file; do
if should_ignore "$file"; then
continue
fi
files+=("$file")
done < <(git ls-files -z)
fi
failures=0
for file in "${files[@]}"; do
for line in "${license[@]}"; do
# We check only the first four lines to avoid false positives
# (such as this script), but to allow for a shebang and empty
# line between it and the license.
if ! head -n4 "${root}/${file}" | grep --quiet --fixed-strings --max-count=1 "${line}"; then
echo "${file}" missing "${line}"
failures=$((failures + 1))
break
fi
done
done
exit $failures