]> git.ipfire.org Git - thirdparty/git.git/blobdiff - t/t1416-ref-transaction-hooks.sh
Merge branch 'ps/ref-transaction-hook'
[thirdparty/git.git] / t / t1416-ref-transaction-hooks.sh
diff --git a/t/t1416-ref-transaction-hooks.sh b/t/t1416-ref-transaction-hooks.sh
new file mode 100755 (executable)
index 0000000..da58d86
--- /dev/null
@@ -0,0 +1,109 @@
+#!/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