| #!/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= |
| goodParent= |
| |
| if ! git rev-parse --quiet --verify "${baseCommit}" |
| then |
| echo "Invalid <BASE_COMMIT> '${baseCommit}'" |
| exit 1 |
| fi |
| |
| while read dash 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}" |
| ;; |
| "") |
| ;; |
| *) # Line contains whitespace error information for current commit. |
| 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:"---% 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 |