qusal/scripts/copyright-lint.sh
Ben Grande a02997b89e
doc: simplify installation command
Many people reported problems with the installation command, most of
them had typos, understandable due to the long command. Tar is available
even on minimal templates. Using tar is not more dangerous than using
qfile-unpacker in this case because the project has no signed archives
and passing a directory to dom0 is insecure, considering a git repo, an
attacker could find information in the .git directory or modify files
and add them to git exclude, which won't be noticed when verifying the
commit signature.

In the future, if a signed tarball were to be provided, qvm-run and pipe
would be used instead, making the command even simpler.
2025-01-08 14:38:48 +01:00

103 lines
2.3 KiB
Bash
Executable File

#!/bin/sh
## SPDX-FileCopyrightText: 2025 Benjamin Grande M. S. <ben.grande.b@gmail.com>
##
## SPDX-License-Identifier: AGPL-3.0-or-later
## Try its best to get wrong copyright information.
## Will show false positives if the copyright owner uploads code with year
## smaller than the current year.
set -eu
command -v git >/dev/null ||
{ printf '%s\n' "Missing program: git" >&2; exit 1; }
repo_toplevel="$(git rev-parse --show-toplevel)"
test -d "${repo_toplevel}" || exit 1
cd "${repo_toplevel}"
unset repo_toplevel
./scripts/requires-program.sh reuse date
case "${-}" in
*x*) xtrace=1;;
*) xtrace=0;;
esac
email="<$(git config --get user.email)>"
year="$(date -- '+%Y')"
fail="0"
files=""
if test -n "${1-}"; then
for f in "${@}"; do
test -f "${f}" || continue
test -r "${f}" || continue
files="${files} ${f}"
done
else
files="$(git log --name-only --date=raw --since="${year}" --format="")"
files="${files} $(git diff --cached --name-only)"
fi
if test -z "${files}"; then
exit 0
fi
tmpdir="$(mktemp -d)"
target="${tmpdir}/spdx"
trap 'rm -rf -- "${tmpdir}"' EXIT INT HUP QUIT ABRT
set +x
data="$(reuse spdx)"
printf '%s\n' "${data}" | tee -- "${target}" >/dev/null
test "${xtrace}" = 0 || set -x
for file in ${files}; do
test "${xtrace}" = 0 || set -x
case "${file}" in
.reuse/dep5) continue;;
*) ;;
esac
file="${file#./}"
set +x
awk -v year="${year}" -v email="${email}" -v file="${file}" -- '
BEGIN {
year_found = 0
}
$1 == "FileName:" {
sub(/^\.\//, "", $2)
f = ($2 == file)
}
($1 == "FileCopyrightText:" || $1 == "SPDX-FileCopyrightText:") && f {
sub(/^(SPDX-)?FileCopyrightText:\s<text>SPDX-FileCopyrightText:\s/, "")
sub(/^SPDX-FileCopyrightText:\s/, "")
sub(/^FileCopyrightText:\s<text>/, "")
sub(/<\/text>$/, "")
if ($NF == email) {
found_years = $0
gsub(/[^0-9,-]/, "", found_years)
split(found_years, year_array, "[-,]")
for (i in year_array) {
if (year_array[i] + 0 >= year) {
year_found = 1
break
}
}
}
}
END {
if (year_found != 1) {
message = file ": " found_years ": outdated copyright year: " email
print message > "/dev/stderr"
exit 1
}
}' "${target}" || fail=1
done
if test "${fail}" = "1"; then
exit 1
fi