aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rwxr-xr-xtools/post-receive.hook73
1 files changed, 73 insertions, 0 deletions
diff --git a/tools/post-receive.hook b/tools/post-receive.hook
new file mode 100755
index 0000000..004422f
--- /dev/null
+++ b/tools/post-receive.hook
@@ -0,0 +1,73 @@
+#!/bin/bash
+#
+# Git post-receive hook to update Patchwork patches after Git pushes
+#
+# Copyright © 2010 martin f. krafft <madduck@madduck.net>
+# Released under the terms of the Artistic Licence 2.0
+#
+set -eu
+
+#TODO: the state map should really live in the repo's git-config
+STATE_MAP="refs/heads/master:Accepted"
+
+PWDIR=/srv/patchwork/apps/patchwork
+
+do_exit=0
+trap "do_exit=1" INT
+
+get_patchwork_hash()
+{
+ local hash
+ hash=$(git show $1 | python $PWDIR/parser.py --hash)
+ echo $hash
+ test -n "$hash"
+}
+
+get_patch_id()
+{
+ local id
+ id=$($PWDIR/bin/pwclient view -h $1 2>/dev/null \
+ | sed -rne 's,X-Patchwork-Id: ,,p')
+ echo $id
+ test -n "$id"
+}
+
+set_patch_state()
+{
+ $PWDIR/bin/pwclient update -s $2 -c $3 $1 2>&1
+}
+
+update_patches()
+{
+ local cnt; cnt=0
+ for rev in $(git rev-list --no-merges --reverse ${1}^..${2}); do
+ if [ "$do_exit" = 1 ]; then
+ echo "I: exiting..." >&2
+ break
+ fi
+ hash=$(get_patchwork_hash $rev) \
+ || { echo "E: failed to hash rev $rev." >&2; continue; }
+ id=$(get_patch_id $hash) \
+ || { echo "E: failed to find patch for rev $rev." >&2; continue; }
+ reason="$(set_patch_state $id $3 $rev)" \
+ || { echo "E: failed to update patch #$id${reason:+: $reason}." >&2; continue; }
+ echo "I: patch #$id updated using rev $rev." >&2
+ cnt=$(($cnt + 1))
+ done
+ echo "I: $cnt patch(es) updated to state $3." >&2
+}
+
+while read oldrev newrev refname; do
+ found=0
+ for i in $STATE_MAP; do
+ key="${i%:*}"
+ if [ "$key" = "$refname" ]; then
+ update_patches $oldrev $newrev ${i#*:}
+ found=1
+ break
+ fi
+ done
+ if [ $found -eq 0 ]; then
+ echo "E: no mapping for refname $key" >&2
+ fi
+done