#!/bin/bash # # Git post-receive hook to update Patchwork patches after Git pushes # # Copyright © 2010 martin f. krafft # Released under the GNU General Public License v2 or later. 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 info -h $1 2>/dev/null \ | sed -rne 's,- id[[:space:]]*: ,,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