87 строки
2.2 KiB
Bash
87 строки
2.2 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# Copyright (c) Microsoft Corporation
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
# 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 (c) Microsoft Corporation" "SPDX-License-Identifier: MIT")
|
|
|
|
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 "$f")
|
|
|
|
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}"
|
|
failures=$((failures + 1))
|
|
break
|
|
fi
|
|
done
|
|
done
|
|
|
|
exit $failures
|