mirror of
https://git.sr.ht/~rjarry/aerc
synced 2025-12-12 20:36:12 +01:00
The + character is not part of the 'basic regular expressions' in BSD grep. Use -E to enable extended (modern) regular expressions. Also remove escaping. This makes the commit msg hook work on macOS 14.2. Signed-off-by: Maarten Aertsen <maarten@nlnetlabs.nl> Signed-off-by: Robin Jarry <robin@jarry.cc>
81 lines
1.9 KiB
Bash
Executable File
81 lines
1.9 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
set -e
|
|
|
|
debug() {
|
|
if [ "$GIT_TRAILER_DEBUG" = 1 ]; then
|
|
"$@" >&2
|
|
fi
|
|
}
|
|
|
|
trailer_order="
|
|
Closes:
|
|
Fixes:
|
|
Implements:
|
|
References:
|
|
Link:
|
|
Changelog-added:
|
|
Changelog-fixed:
|
|
Changelog-changed:
|
|
Changelog-deprecated:
|
|
Cc:
|
|
Suggested-by:
|
|
Requested-by:
|
|
Reported-by:
|
|
Co-authored-by:
|
|
Signed-off-by:
|
|
Tested-by:
|
|
Reviewed-by:
|
|
Acked-by:
|
|
"
|
|
file=${1?file}
|
|
tmp=$(mktemp)
|
|
trap "rm -f $tmp" EXIT
|
|
|
|
# Read unfolded trailers and normalize case.
|
|
git interpret-trailers --parse --trim-empty "$file" |
|
|
while read -r key value; do
|
|
# Force title case on trailer key.
|
|
first_letter=$(echo "$key" | sed 's/^\(.\).*/\1/' | tr '[:lower:]' '[:upper:]')
|
|
other_letters=$(echo "$key" | sed 's/^.\(.*\)/\1/' | tr '[:upper:]' '[:lower:]')
|
|
key="$first_letter$other_letters"
|
|
|
|
# Find sort order of this key.
|
|
order=$(echo "$trailer_order" | grep -Fxn "$key" | sed -nE 's/^([0-9]+):.*/\1/p')
|
|
if [ -z "$order" ]; then
|
|
echo "warning: unknown trailer '$key'" >&2
|
|
# Unknown trailers are always first.
|
|
order="0"
|
|
fi
|
|
|
|
echo "$order $key $value"
|
|
done |
|
|
# Sort trailers according to their numeric order, trim the numeric order.
|
|
LC_ALL=C sort -n | sed -E 's/^[0-9]+ //' > "$tmp"
|
|
|
|
debug echo ==== sanitized trailers ====
|
|
debug cat "$tmp"
|
|
|
|
# Unfortunately, reordering trailers is not possible at the moment. Delete all
|
|
# trailers first. The only way to do it is to force replace existing trailers
|
|
# with empty values and trim empty trailers one by one.
|
|
while read -r key value; do
|
|
git interpret-trailers --in-place --if-exists=replace \
|
|
--trailer="$key " "$file"
|
|
git interpret-trailers --in-place --trim-empty "$file"
|
|
done < "$tmp"
|
|
|
|
set --
|
|
while read -r trailer; do
|
|
case "$trailer" in
|
|
Changelog-*)
|
|
# Wrap changelog entries indenting with a space.
|
|
trailer=$(echo "$trailer" | fmt -w 72 | sed '2,$s/^/ /')
|
|
;;
|
|
esac
|
|
set -- "$@" --trailer="$trailer"
|
|
done < "$tmp"
|
|
|
|
# Remove duplicate "key: value" trailers (e.g. duplicate signed-off-by).
|
|
git interpret-trailers --in-place --if-exists=addIfDifferent "$@" "$file"
|