mirror of
https://github.com/git-for-windows/git.git
synced 2026-02-03 18:59:59 -06:00
Every once in a while, whitespace errors are introduced in Git for Windows' rebases to newer Git versions, simply by virtue of integrating upstream commits that do not follow upstream Git's own whitespace rule. In Git v2.50.0-rc0, for example, 03f2915541a4 (xdiff: disable cleanup_records heuristic with --minimal, 2025-04-29) introduced a trailing space. Arguably, non-actionable alerts are worse than no alerts at all, so let's suppress those alerts that we cannot do anything about, anyway. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
107 lines
2.4 KiB
Bash
Executable File
107 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# Check that commits after a specified point do not contain new or modified
|
|
# lines with whitespace errors. An optional formatted summary can be generated
|
|
# by providing an output file path and url as additional arguments.
|
|
#
|
|
|
|
baseCommit=$1
|
|
outputFile=$2
|
|
url=$3
|
|
|
|
if test "$#" -ne 1 && test "$#" -ne 3 || test -z "$1"
|
|
then
|
|
echo "USAGE: $0 <BASE_COMMIT> [<OUTPUT_FILE> <URL>]"
|
|
exit 1
|
|
fi
|
|
|
|
problems=()
|
|
commit=
|
|
commitText=
|
|
commitTextmd=
|
|
committerEmail=
|
|
goodParent=
|
|
|
|
if ! git rev-parse --quiet --verify "${baseCommit}"
|
|
then
|
|
echo "Invalid <BASE_COMMIT> '${baseCommit}'"
|
|
exit 1
|
|
fi
|
|
|
|
while read dash email sha etc
|
|
do
|
|
case "${dash}" in
|
|
"---") # Line contains commit information.
|
|
if test -z "${goodParent}"
|
|
then
|
|
# Assume the commit has no whitespace errors until detected otherwise.
|
|
goodParent=${sha}
|
|
fi
|
|
|
|
commit="${sha}"
|
|
commitText="${sha} ${etc}"
|
|
commitTextmd="[${sha}](${url}/commit/${sha}) ${etc}"
|
|
committerEmail="${email}"
|
|
;;
|
|
"")
|
|
;;
|
|
*) # Line contains whitespace error information for current commit.
|
|
# Quod licet Iovi non licet bovi
|
|
test gitster@pobox.com != "$committerEmail" || break
|
|
|
|
if test -n "${goodParent}"
|
|
then
|
|
problems+=("1) --- ${commitTextmd}")
|
|
echo ""
|
|
echo "--- ${commitText}"
|
|
goodParent=
|
|
fi
|
|
|
|
case "${dash}" in
|
|
*:[1-9]*:) # contains file and line number information
|
|
dashend=${dash#*:}
|
|
problems+=("[${dash}](${url}/blob/${commit}/${dash%%:*}#L${dashend%:}) ${sha} ${etc}")
|
|
;;
|
|
*)
|
|
problems+=("\`${dash} ${sha} ${etc}\`")
|
|
;;
|
|
esac
|
|
echo "${dash} ${sha} ${etc}"
|
|
;;
|
|
esac
|
|
done <<< "$(git log --check --pretty=format:"---% ce% h% s" "${baseCommit}"..)"
|
|
|
|
if test ${#problems[*]} -gt 0
|
|
then
|
|
if test -z "${goodParent}"
|
|
then
|
|
goodParent=${baseCommit: 0:7}
|
|
fi
|
|
|
|
echo "A whitespace issue was found in one or more of the commits."
|
|
echo "Run the following command to resolve whitespace issues:"
|
|
echo "git rebase --whitespace=fix ${goodParent}"
|
|
|
|
# If target output file is provided, write formatted output.
|
|
if test -n "$outputFile"
|
|
then
|
|
echo "🛑 Please review the Summary output for further information."
|
|
(
|
|
echo "### :x: A whitespace issue was found in one or more of the commits."
|
|
echo ""
|
|
echo "Run these commands to correct the problem:"
|
|
echo "1. \`git rebase --whitespace=fix ${goodParent}\`"
|
|
echo "1. \`git push --force\`"
|
|
echo ""
|
|
echo "Errors:"
|
|
|
|
for i in "${problems[@]}"
|
|
do
|
|
echo "${i}"
|
|
done
|
|
) >"$outputFile"
|
|
fi
|
|
|
|
exit 2
|
|
fi
|