#!/bin/bash if [ "$#" -lt 1 ]; then printf 'Usage: %s \n' "$0" 1>&2 exit 1 fi 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 print_commits 'author' "${author_missing[@]}" print_commits 'committer' "${committer_missing[@]}" exec gitk "$@"