aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Jarry <robin@jarry.cc>2023-07-16 16:06:09 +0200
committerRobin Jarry <robin@jarry.cc>2023-08-04 23:36:37 +0200
commit046b6e34ee6b53e274f03b59c895df40494eb923 (patch)
tree2b202c7611d235fecf1b0b12b9946eb8de41050a
parentdee1adce3f6ac9ba889fca89561231408e251aaa (diff)
downloadaerc-046b6e34ee6b53e274f03b59c895df40494eb923.tar.gz
aerc-046b6e34ee6b53e274f03b59c895df40494eb923.zip
contrib: update sendemail-validate hook
With git 2.41, git send-email exports a patch counter to the validate hook. Copy the example hook from git and adapt it for aerc. Link: https://github.com/git/git/commit/3c8d3adeae83 Signed-off-by: Robin Jarry <robin@jarry.cc> Acked-by: Tim Culverhouse <tim@timculverhouse.com>
-rw-r--r--CONTRIBUTING.md3
-rw-r--r--Makefile8
-rwxr-xr-xcontrib/check-patches2
-rwxr-xr-xcontrib/sendemail-validate87
4 files changed, 64 insertions, 36 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index fc96e9ab..340eef83 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,8 +65,7 @@ defaults:
$ make gitconfig
git config format.subjectPrefix "PATCH aerc"
git config sendemail.to "~rjarry/aerc-devel@lists.sr.ht"
- git config sendemail.validate true
- ln -sf ../../contrib/sendemail-validate-series .git/hooks/sendemail-validate
+ '.git/hooks/sendemail-validate' -> '../../contrib/sendemail-validate'
And send the patch to the mailing list ([step-by-step
instructions][git-send-email-tutorial]):
diff --git a/Makefile b/Makefile
index 55a0b93c..acd8a728 100644
--- a/Makefile
+++ b/Makefile
@@ -206,10 +206,12 @@ uninstall:
gitconfig:
git config format.subjectPrefix "PATCH aerc"
git config sendemail.to "~rjarry/aerc-devel@lists.sr.ht"
- git config sendemail.validate true
@mkdir -p .git/hooks
- @rm -f .git/hooks/sendemail-validate
- ln -sf ../../contrib/sendemail-validate .git/hooks/sendemail-validate-series
+ @rm -f .git/hooks/sendemail-validate*
+ @if grep -q GIT_SENDEMAIL_FILE_COUNTER `git --exec-path`/git-send-email 2>/dev/null; then \
+ ln -svf ../../contrib/sendemail-validate .git/hooks/sendemail-validate && \
+ git config sendemail.validate true; \
+ fi
.PHONY: check-patches
check-patches:
diff --git a/contrib/check-patches b/contrib/check-patches
index 20291eb6..3ae2e834 100755
--- a/contrib/check-patches
+++ b/contrib/check-patches
@@ -26,7 +26,7 @@ for rev in $(git rev-list --reverse "$revision_range"); do
body=$(git log --format='%b' -1 "$rev")
body=${body%$(git log --format='%(trailers)' -1 "$rev")}
if [ "$(echo "$body" | wc -w)" -lt 3 ]; then
- echo "error [PATCH $n/$total] '$title' body has less than three words, please elaborate" >&2
+ echo "error [PATCH $n/$total] '$title' body has less than three words, please describe your changes" >&2
fail=true
fi
diff --git a/contrib/sendemail-validate b/contrib/sendemail-validate
index d94f6c3e..35b7d9e3 100755
--- a/contrib/sendemail-validate
+++ b/contrib/sendemail-validate
@@ -1,41 +1,68 @@
#!/bin/sh
-set -e
+# An example hook script to validate a patch (and/or patch series) before
+# sending it via email.
+#
+# The hook should exit with non-zero status after issuing an appropriate
+# message if it wants to prevent the email(s) from being sent.
+#
+# To enable this hook, rename this file to "sendemail-validate".
+#
+# By default, it will only check that the patch(es) can be applied on top of
+# the default upstream branch without conflicts in a secondary worktree. After
+# validation (successful or not) of the last patch of a series, the worktree
+# will be deleted.
+#
+# The following config variables can be set to change the default remote and
+# remote ref that are used to apply the patches against:
+#
+# sendemail.validateRemote (default: origin)
+# sendemail.validateRemoteRef (default: HEAD)
-die() {
- echo "error: $*" >&2
- exit 1
+validate_cover_letter () {
+ file="$1"
+ true
}
-run() {
- echo "+ $*" >&2
- "$@"
+validate_patch () {
+ file="$1"
+ # Ensure that the patch applies without conflicts.
+ git am -3 "$file"
}
-set --
-while read -r file; do
- # skip empty patches (cover letter)
- if grep -q "^diff --git " "$file"; then
- set -- "$@" "$file"
- fi
-done
-if [ $# -eq 0 ]; then
- exit 0
-fi
+validate_series () {
+ make all tests lint check-patches
+}
-echo 'Cloning upstream repo in temp dir ...'
-tmp=$(mktemp -d)
-trap "rm -rf -- $tmp" EXIT
-run git clone -q --depth=1 "https://git.sr.ht/~rjarry/aerc" "$tmp" ||
- die "Failed to clone upstream repository. No network connection?"
-export GIT_DIR="$tmp/.git"
+# main -------------------------------------------------------------------------
-run cd $tmp
+if test "$GIT_SENDEMAIL_FILE_COUNTER" = 1
+then
+ remote=$(git config --default origin --get sendemail.validateRemote) &&
+ ref=$(git config --default HEAD --get sendemail.validateRemoteRef) &&
+ worktree=$(mktemp --tmpdir -d sendemail-validate.XXXXXXX) &&
+ git worktree add -fd --checkout "$worktree" "refs/remotes/$remote/$ref" &&
+ git config --replace-all sendemail.validateWorktree "$worktree"
+else
+ worktree=$(git config --get sendemail.validateWorktree)
+fi || {
+ echo "sendemail-validate: error: failed to prepare worktree" >&2
+ exit 1
+}
+
+unset GIT_DIR GIT_WORK_TREE
+cd "$worktree" &&
-run git am -3 "$@" ||
- die "Failed to apply patch on upstream master branch. git pull --rebase?"
+if grep -q "^diff --git " "$1"
+then
+ validate_patch "$1"
+else
+ validate_cover_letter "$1"
+fi &&
-for target in all lint tests check-patches; do
- run make $target ||
- die "Please fix the above issues and amend your patch(es)."
-done
+if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL"
+then
+ git config --unset-all sendemail.validateWorktree &&
+ trap 'git worktree remove -ff "$worktree"' EXIT &&
+ validate_series
+fi