#!/bin/bash
if [ "$#" -lt 1 ]; then
- printf "Usage: %s <commit range>\n", "$0" 1>&2
+ printf 'Usage: %s <commit range>\n' "$0" 1>&2
exit 1
fi
-for c in $(git rev-list --no-merges "$@"); do
- ae=$(git log -1 --format='%ae' "$c")
- aE=$(git log -1 --format='%aE' "$c")
- an=$(git log -1 --format='%an' "$c")
- aN=$(git log -1 --format='%aN' "$c")
- ce=$(git log -1 --format='%ce' "$c")
- cE=$(git log -1 --format='%cE' "$c")
- cn=$(git log -1 --format='%cn' "$c")
- cN=$(git log -1 --format='%cN' "$c")
- sob=$(git log -1 --format='%b' "$c" | grep -i 'Signed-off-by')
-
- am=false
- cm=false
- grep -i -q "<$ae>" <<<"$sob" ||
- grep -i -q "<$aE>" <<<"$sob" ||
- grep -i -q ":[[:space:]]*$an[[:space:]]*<" <<<"$sob" ||
- grep -i -q ":[[:space:]]*$aN[[:space:]]*<" <<<"$sob" ||
- am=true
- grep -i -q "<$ce>" <<<"$sob" ||
- grep -i -q "<$cE>" <<<"$sob" ||
- grep -i -q ":[[:space:]]*$cn[[:space:]]*<" <<<"$sob" ||
- grep -i -q ":[[:space:]]*$cN[[:space:]]*<" <<<"$sob" ||
- cm=true
-
- if "$am" || "$cm"; then
- printf "Commit %s\n" "$c"
- "$am" && printf "\tauthor SOB missing\n"
- "$cm" && printf "\tcommitter SOB missing\n"
- printf "%s %s\n%s\n" "$ae" "$ce" "$sob"
+commits=$(git rev-list --no-merges "$@")
+if [ -z "$commits" ]; then
+ printf 'No commits\n'
+ exit 0
+fi
+
+"$(realpath "$(dirname "$0")")/check_fixes" "$@"
+
+declare -a author_missing committer_missing
+
+print_commits()
+{
+ if [ "$#" -eq 1 ]; then
+ return
+ fi
+
+ local t="$1"
+
+ shift
+
+ s=
+ is='is'
+ its='its'
+ if [ "$#" -gt 1 ]; then
+ s='s'
+ is='are'
+ its='their'
+ fi
+ printf 'Commit%s\n\n' "$s"
+ git log --no-walk --pretty='format: %h ("%s")' "$@"
+ printf '\n%s missing a Signed-off-by from %s %s%s.\n\n' \
+ "$is" "$its" "$t" "$s"
+}
+
+check_unexpected_files()
+{
+ local files
+
+ readarray files < <(git diff-tree -r --diff-filter=A --name-only --no-commit-id "$1" '*.rej' '*.orig')
+ if [ "${#files[@]}" -eq 0 ]; then
+ return
+ fi
+
+ s=
+ this='this'
+ if [ "${#files[@]}" -gt 1 ]; then
+ s='s'
+ this='these'
+ fi
+
+ printf 'Commit\n\n'
+ git log --no-walk --pretty='format: %h ("%s")' "$1"
+ printf '\nadded %s unexpected file%s:\n\n' "$this" "$s"
+ printf ' %s\n' "${files[@]}"
+}
+
+for c in $commits; do
+ ae=$(git log -1 --format='<%ae>%n<%aE>%n %an %n %aN ' "$c" | sort -u)
+ ce=$(git log -1 --format='<%ce>%n<%cE>%n %cn %n %cN ' "$c" | sort -u)
+ sob=$(git log -1 --format='%b' "$c" |
+ sed -En 's/^\s*Signed-off-by:?\s*/ /ip')
+
+ if ! grep -i -F -q "$ae" <<<"$sob"; then
+ author_missing+=("$c")
+ fi
+ if ! grep -i -F -q "$ce" <<<"$sob"; then
+ committer_missing+=("$c")
fi
+
+ check_unexpected_files "$c"
done
-exit 0
+print_commits 'author' "${author_missing[@]}"
+print_commits 'committer' "${committer_missing[@]}"
+
+exec gitk "$@"