#!/bin/sh test_description='reference transaction hooks' . ./test-lib.sh test_expect_success setup ' mkdir -p .git/hooks && test_commit PRE && test_commit POST && POST_OID=$(git rev-parse POST) ' test_expect_success 'hook allows updating ref if successful' ' test_when_finished "rm .git/hooks/reference-transaction" && git reset --hard PRE && write_script .git/hooks/reference-transaction <<-\EOF && echo "$*" >>actual EOF cat >expect <<-EOF && prepared committed EOF git update-ref HEAD POST && test_cmp expect actual ' test_expect_success 'hook aborts updating ref in prepared state' ' test_when_finished "rm .git/hooks/reference-transaction" && git reset --hard PRE && write_script .git/hooks/reference-transaction <<-\EOF && if test "$1" = prepared then exit 1 fi EOF test_must_fail git update-ref HEAD POST 2>err && test_i18ngrep "ref updates aborted by hook" err ' test_expect_success 'hook gets all queued updates in prepared state' ' test_when_finished "rm .git/hooks/reference-transaction actual" && git reset --hard PRE && write_script .git/hooks/reference-transaction <<-\EOF && if test "$1" = prepared then while read -r line do printf "%s\n" "$line" done >actual fi EOF cat >expect <<-EOF && $ZERO_OID $POST_OID HEAD $ZERO_OID $POST_OID refs/heads/master EOF git update-ref HEAD POST <<-EOF && update HEAD $ZERO_OID $POST_OID update refs/heads/master $ZERO_OID $POST_OID EOF test_cmp expect actual ' test_expect_success 'hook gets all queued updates in committed state' ' test_when_finished "rm .git/hooks/reference-transaction actual" && git reset --hard PRE && write_script .git/hooks/reference-transaction <<-\EOF && if test "$1" = committed then while read -r line do printf "%s\n" "$line" done >actual fi EOF cat >expect <<-EOF && $ZERO_OID $POST_OID HEAD $ZERO_OID $POST_OID refs/heads/master EOF git update-ref HEAD POST && test_cmp expect actual ' test_expect_success 'hook gets all queued updates in aborted state' ' test_when_finished "rm .git/hooks/reference-transaction actual" && git reset --hard PRE && write_script .git/hooks/reference-transaction <<-\EOF && if test "$1" = aborted then while read -r line do printf "%s\n" "$line" done >actual fi EOF cat >expect <<-EOF && $ZERO_OID $POST_OID HEAD $ZERO_OID $POST_OID refs/heads/master EOF git update-ref --stdin <<-EOF && start update HEAD POST $ZERO_OID update refs/heads/master POST $ZERO_OID abort EOF test_cmp expect actual ' test_done