#!/usr/bin/env bash
set -Ee -o pipefail
SCRIPTDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPTDIR}/.validate"
ghShorthandRegex='(^|[^[:alnum:]_])#[0-9]+'
ghRefPrefixRegex='(^|[^[:alnum:]_./-])'
ghRepoNameRegex='[[:alnum:]_.-]+'
ghRepoRefRegex="${ghRefPrefixRegex}${ghRepoNameRegex}#[0-9]+"
ghOwnerRepoRefRegex="${ghRefPrefixRegex}${ghRepoNameRegex}/${ghRepoNameRegex}#[0-9]+"
ghURLRegex='https?://(www\.)?github\.com/[^[:space:]/]+/[^[:space:]/]+/(issues|pull)/[0-9]+'
badReferences=()
check_references() {
local source="$1"
local content="$2"
local matches
matches=$(grep -En -e "$ghShorthandRegex" -e "$ghRepoRefRegex" -e "$ghOwnerRepoRefRegex" -e "$ghURLRegex" <<< "$content" || true)
if [ -n "$matches" ]; then
badReferences+=("$source")
echo "::error::${source} contains a GitHub issue or PR reference. Reference commit hashes instead."
fi
}
for commit in $(validate_log --format='format:%H%n'); do
if [ -z "$(git log -1 --format='format:' --name-status "$commit")" ]; then
# no content (ie, Merge commit, etc)
continue
fi
check_references "Commit $commit" "$(git log -1 --format='format:%B' "$commit")"
done
if [ "${#badReferences[@]}" -ne 0 ]; then
printf "\nPlease remove GitHub issue or PR references from commit messages.\n"
printf "Reference commit hashes instead.\n"
printf "Keep GitHub issue or PR references in GitHub-visible text, such as PR descriptions or comments.\n"
exit 1
fi