diff mbox

Add a simple sample Git post-receive hook

Message ID 1265340794-25595-1-git-send-email-madduck@madduck.net
State Accepted
Headers show

Commit Message

Martin Krafft Feb. 5, 2010, 3:33 a.m. UTC
This patch adds a post-receive hook to lib/git, which can be used to
update Patchwork following a push to the Git repository.

Surely, it can be improved. One thing to do would be to export the state
map to git-config somehow.

Signed-off-by: martin f. krafft <madduck@madduck.net>
---
 lib/git/post-receive.hook |   73 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 73 insertions(+), 0 deletions(-)
 create mode 100755 lib/git/post-receive.hook

Comments

Jeremy Kerr June 25, 2010, 1:04 a.m. UTC | #1
Hi Martin,

Just going doing some patchwork updates, and noticed that you've licenced this 
file under the Artistic Licence. Would you be prepared to make these 
contributions under the GPL?

Regards,


Jeremy

> diff --git a/lib/git/post-receive.hook b/lib/git/post-receive.hook
> new file mode 100755
> index 0000000..767d4af
> --- /dev/null
> +++ b/lib/git/post-receive.hook
> @@ -0,0 +1,73 @@
> +#!/bin/sh
> +#
> +# 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
> +#
Martin Krafft June 25, 2010, 7:16 a.m. UTC | #2
also sprach Jeremy Kerr <jk@ozlabs.org> [2010.06.25.0304 +0200]:
> Just going doing some patchwork updates, and noticed that you've licenced this 
> file under the Artistic Licence. Would you be prepared to make these 
> contributions under the GPL?

Begrudgedly, as I consider the GPL non-free, if you need it… yes.
diff mbox

Patch

diff --git a/lib/git/post-receive.hook b/lib/git/post-receive.hook
new file mode 100755
index 0000000..767d4af
--- /dev/null
+++ b/lib/git/post-receive.hook
@@ -0,0 +1,73 @@ 
+#!/bin/sh
+#
+# 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