From: Jiang Xin <worldhello.net@gmail.com>
To: Junio C Hamano <gitster@pobox.com>,
Patrick Steinhardt <ps@pks.im>,
Michael Heemskerk <mheemskerk@atlassian.com>,
Git List <git@vger.kernel.org>
Cc: Jiang Xin <zhiyou.jx@alibaba-inc.com>,
Jiang Xin <worldhello.net@gmail.com>,
Eric Sunshine <sunshine@sunshineco.com>
Subject: [PATCH v2 1/9] t1416: more testcases for reference-transaction hook
Date: Fri, 19 Aug 2022 11:21:39 +0800 [thread overview]
Message-ID: <20220819032147.28841-2-worldhello.net@gmail.com> (raw)
In-Reply-To: <CANYiYbFw71bX827akAG87RSKOozPk313Hoe573O9dQ65_U6sLQ@mail.gmail.com>
From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Append more testcases in t1416 for various git commands that may trigger
the "reference-transaction" hook.
In order to create a common "reference-transaction" hook, we define the
common hook path using config variable "core.hooksPath", and create the
"reference-transaction" hook in the path.
Some commands trigger the "reference-transaction" hook properly and get
the expected output. E.g.:
* git branch <new-branch> <oid> # create new branch
* git clone
* git commit [--amend]
* git fetch
* git merge
* git push [--atomic]
* git reset --hard
* git tag [-f] <tag> <oid> # update tag
* git tag <new-tag> <oid> # create new tag
* git update-ref --stdin # create new refs
* git update-ref <ref> <oid> # create new ref
* git update-ref <ref> <new-oid> <old-oid> # update ref
But 17 testcases failed.
Some commands failed because the expected "<old-oid>" became
"<zero-oid>". E.g.:
* git branch [-f] <ref> <new-oid> # update branch
* git cherry-pick <oid>
* git rebase
* git tag -d <tag>
* git update-ref --stdin # update/delete refs
* git update-ref -d <ref>
* git update-ref <ref> <new-oid> # update ref
Some commands failed because the "reference-transaction committed"
command was repeated multiple times for the same changes. E.g.:
* git cherry-pick
* git rebase
* git revert
* git tag -d <tag>
* git update-ref -d <ref>
* git update-ref --stdin # delete refs
Some commands should not trigger the "reference-transaction" hook
because no real changes have occurred to the repository. E.g.:
* git gc
* git pack-refs --all
Some commands did not execute the "reference-transaction" hook at all.
E.g.:
* git branch -c <src> <dest> # copy branch
* git branch -m <old> <new> # rename branch
Some commands ran unexpected command "reference-transaction aborted".
E.g.:
* git branch -d <branch> # delete branch
* git branch -m <old> <new> # rename branch
* git cherr-pick <oid>
* git rebase
* git revert
* git tag -d <tag> # delete tag
* git update-ref -d <ref> # delete ref
We will fix the failed testcases in later commits.
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Helped-by: Eric Sunshine <sunshine@sunshineco.com>
---
t/t1416-ref-transaction-hooks.sh | 1484 ++++++++++++++++++++++++++++++
1 file changed, 1484 insertions(+)
diff --git a/t/t1416-ref-transaction-hooks.sh b/t/t1416-ref-transaction-hooks.sh
index 27731722a5..84509cb6a4 100755
--- a/t/t1416-ref-transaction-hooks.sh
+++ b/t/t1416-ref-transaction-hooks.sh
@@ -133,4 +133,1488 @@ test_expect_success 'interleaving hook calls succeed' '
test_cmp expect target-repo.git/actual
'
+HOOK_OUTPUT=hook-output
+
+# Create commits in <repo> and assign each commit's oid to shell variables
+# given in the arguments (A, B, and C). E.g.:
+#
+# create_commits_in <repo> A B C
+#
+# NOTE: Never calling this function from a subshell since variable
+# assignments will disappear when subshell exits.
+create_commits_in () {
+ local repo="$1" &&
+ shift &&
+ while test $# -gt 0
+ do
+ local name=$1 &&
+ shift &&
+ test_commit -C "$repo" --no-tag "$name" &&
+ local rev=$(git -C "$repo" rev-parse HEAD) &&
+ eval "$name=$rev" || return 1
+ done
+}
+
+get_abbrev_oid () {
+ local oid=$1 &&
+ local suffix=${oid#???????} &&
+ oid=${oid%$suffix} &&
+ if test -n "$oid"
+ then
+ echo "$oid"
+ else
+ echo "undefined-oid"
+ fi
+}
+
+# Format the output of git-push, git-show-ref and other commands to make a
+# user-friendly and stable text. We can easily prepare the expect text
+# without having to worry about future changes of the commit ID.
+make_user_friendly_and_stable_output () {
+ sed \
+ -e "s/$(get_abbrev_oid $A)[0-9a-f]*/<COMMIT-A>/g" \
+ -e "s/$(get_abbrev_oid $B)[0-9a-f]*/<COMMIT-B>/g" \
+ -e "s/$(get_abbrev_oid $C)[0-9a-f]*/<COMMIT-C>/g" \
+ -e "s/$(get_abbrev_oid $D)[0-9a-f]*/<COMMIT-D>/g" \
+ -e "s/$(get_abbrev_oid $E)[0-9a-f]*/<COMMIT-E>/g" \
+ -e "s/$(get_abbrev_oid $F)[0-9a-f]*/<COMMIT-F>/g" \
+ -e "s/$(get_abbrev_oid $G)[0-9a-f]*/<COMMIT-G>/g" \
+ -e "s/$(get_abbrev_oid $H)[0-9a-f]*/<COMMIT-H>/g" \
+ -e "s/$(get_abbrev_oid $I)[0-9a-f]*/<COMMIT-I>/g" \
+ -e "s/$ZERO_OID/<ZERO-OID>/g"
+}
+
+test_cmp_heads_and_tags () {
+ local indir= expect actual &&
+ while test $# != 0
+ do
+ case "$1" in
+ -C)
+ indir="$2" &&
+ shift
+ ;;
+ *)
+ break
+ ;;
+ esac &&
+ shift
+ done &&
+ expect=${1:-expect} &&
+ actual=${2:-actual-heads-and-tags} &&
+ indir=${indir:+"$indir"/} &&
+ test_path_is_file "$expect" &&
+ test_when_finished "rm -f \"$actual\"" &&
+ git ${indir:+ -C "$indir"} show-ref --heads --tags |
+ make_user_friendly_and_stable_output >"$actual" &&
+ test_cmp "$expect" "$actual"
+}
+
+test_expect_success 'setup git config and hook' '
+ git config --global core.hooksPath "$HOME/test-hooks" &&
+ git config --global core.abbrev 7 &&
+ mkdir "test-hooks" &&
+ write_script "test-hooks/reference-transaction" <<-EOF
+ exec >>"$HOME/$HOOK_OUTPUT"
+ printf "## Call hook: reference-transaction %9s ##\n" "\$@"
+ while read -r line
+ do
+ echo "\$line"
+ done
+ EOF
+'
+
+test_expect_success "setup base repository" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-A> HEAD
+ <ZERO-OID> <COMMIT-A> refs/heads/main
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-A> HEAD
+ <ZERO-OID> <COMMIT-A> refs/heads/main
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-A> <COMMIT-B> HEAD
+ <COMMIT-A> <COMMIT-B> refs/heads/main
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-A> <COMMIT-B> HEAD
+ <COMMIT-A> <COMMIT-B> refs/heads/main
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-B> <COMMIT-C> HEAD
+ <COMMIT-B> <COMMIT-C> refs/heads/main
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-B> <COMMIT-C> HEAD
+ <COMMIT-B> <COMMIT-C> refs/heads/main
+ EOF
+
+ git init base &&
+ create_commits_in base A B C &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ EOF
+ test_cmp_heads_and_tags -C base expect
+'
+
+test_expect_success "update-ref: setup workdir using git-clone" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-C> refs/remotes/origin/main
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-C> refs/remotes/origin/main
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-C> HEAD
+ <ZERO-OID> <COMMIT-C> refs/heads/main
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-C> HEAD
+ <ZERO-OID> <COMMIT-C> refs/heads/main
+ EOF
+
+ git clone base workdir &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+test_expect_success "update-ref: create new refs" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-A> refs/heads/topic1
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-A> refs/heads/topic1
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-A> refs/heads/topic2
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-A> refs/heads/topic2
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-A> refs/heads/topic3
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-A> refs/heads/topic3
+ EOF
+
+ (
+ cd workdir &&
+ git update-ref refs/heads/topic1 $A &&
+ git update-ref refs/heads/topic2 $A &&
+ git update-ref refs/heads/topic3 $A
+ ) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-A> refs/heads/topic1
+ <COMMIT-A> refs/heads/topic2
+ <COMMIT-A> refs/heads/topic3
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+# Failed because the old-oids for the default branch and
+# HEAD which points to the default branch were not the
+# expected old-oids, but <ZERO-OID>.
+#
+# The differences are as follows:
+#
+# @@ -5,8 +5,8 @@
+# <COMMIT-A> <COMMIT-B> refs/heads/topic1
+# <COMMIT-A> <COMMIT-B> HEAD
+# ## Call hook: reference-transaction prepared ##
+# -<COMMIT-B> <COMMIT-A> refs/heads/topic1
+# -<COMMIT-B> <COMMIT-A> HEAD
+# +<ZERO-OID> <COMMIT-A> refs/heads/topic1
+# +<ZERO-OID> <COMMIT-A> HEAD
+# ## Call hook: reference-transaction committed ##
+# -<COMMIT-B> <COMMIT-A> refs/heads/topic1
+# -<COMMIT-B> <COMMIT-A> HEAD
+# +<ZERO-OID> <COMMIT-A> refs/heads/topic1
+# +<ZERO-OID> <COMMIT-A> HEAD
+test_expect_failure "update-ref: update default branch" '
+ test_when_finished "git switch main; rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-A> <COMMIT-B> refs/heads/topic1
+ <COMMIT-A> <COMMIT-B> HEAD
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-A> <COMMIT-B> refs/heads/topic1
+ <COMMIT-A> <COMMIT-B> HEAD
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-B> <COMMIT-A> refs/heads/topic1
+ <COMMIT-B> <COMMIT-A> HEAD
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-B> <COMMIT-A> refs/heads/topic1
+ <COMMIT-B> <COMMIT-A> HEAD
+ EOF
+
+ (
+ cd workdir &&
+ git switch topic1 &&
+ git update-ref refs/heads/topic1 $B $A &&
+ git update-ref refs/heads/topic1 $A
+ ) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-A> refs/heads/topic1
+ <COMMIT-A> refs/heads/topic2
+ <COMMIT-A> refs/heads/topic3
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+# Failed because the old-oids for HEAD and the ref that the HEAD points
+# to were not the expected old-oids, but <ZERO-OID>.
+#
+# The differences are as follows:
+#
+# @@ -5,8 +5,8 @@
+# <COMMIT-A> <COMMIT-B> HEAD
+# <COMMIT-A> <COMMIT-B> refs/heads/topic1
+# ## Call hook: reference-transaction prepared ##
+# -<COMMIT-B> <COMMIT-A> HEAD
+# -<COMMIT-B> <COMMIT-A> refs/heads/topic1
+# +<ZERO-OID> <COMMIT-A> HEAD
+# +<ZERO-OID> <COMMIT-A> refs/heads/topic1
+# ## Call hook: reference-transaction committed ##
+# -<COMMIT-B> <COMMIT-A> HEAD
+# -<COMMIT-B> <COMMIT-A> refs/heads/topic1
+# +<ZERO-OID> <COMMIT-A> HEAD
+# +<ZERO-OID> <COMMIT-A> refs/heads/topic1
+test_expect_failure "update-ref: update HEAD" '
+ test_when_finished "git switch main; rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-A> <COMMIT-B> HEAD
+ <COMMIT-A> <COMMIT-B> refs/heads/topic1
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-A> <COMMIT-B> HEAD
+ <COMMIT-A> <COMMIT-B> refs/heads/topic1
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-B> <COMMIT-A> HEAD
+ <COMMIT-B> <COMMIT-A> refs/heads/topic1
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-B> <COMMIT-A> HEAD
+ <COMMIT-B> <COMMIT-A> refs/heads/topic1
+ EOF
+
+ (
+ cd workdir &&
+ git switch topic1 &&
+ git update-ref HEAD $B $A &&
+ git update-ref HEAD $A
+ ) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-A> refs/heads/topic1
+ <COMMIT-A> refs/heads/topic2
+ <COMMIT-A> refs/heads/topic3
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+# Failed because the reference-transaction hook was executed even
+# though no refs were changed by running git-pack-refs.
+test_expect_failure "update-ref: prepare packed_ref_store using pack-refs" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+ git -C workdir pack-refs --all &&
+ test_path_is_file workdir/.git/packed-refs &&
+ test_path_is_missing $HOOK_OUTPUT
+'
+
+# Failed because the old-oid was not the expected old-oid, but
+# <ZERO-OID> for updating a reference using git-update-refs
+# command without providing the old-oid parameter.
+#
+# The differences are as follows:
+#
+# @@ -3,14 +3,14 @@
+# ## Call hook: reference-transaction committed ##
+# <COMMIT-A> <COMMIT-B> refs/heads/topic2
+# ## Call hook: reference-transaction prepared ##
+# -<COMMIT-A> <COMMIT-C> refs/heads/topic3
+# +<ZERO-OID> <COMMIT-C> refs/heads/topic3
+# ## Call hook: reference-transaction committed ##
+# -<COMMIT-A> <COMMIT-C> refs/heads/topic3
+# +<ZERO-OID> <COMMIT-C> refs/heads/topic3
+# ## Call hook: reference-transaction prepared ##
+# <ZERO-OID> <COMMIT-A> refs/heads/topic4
+# ## Call hook: reference-transaction committed ##
+# <ZERO-OID> <COMMIT-A> refs/heads/topic4
+# ## Call hook: reference-transaction prepared ##
+# -<COMMIT-A> <COMMIT-C> refs/heads/topic4
+# +<ZERO-OID> <COMMIT-C> refs/heads/topic4
+# ## Call hook: reference-transaction committed ##
+# -<COMMIT-A> <COMMIT-C> refs/heads/topic4
+# +<ZERO-OID> <COMMIT-C> refs/heads/topic4
+test_expect_failure "update-ref: update refs already in packed_ref_store" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-A> <COMMIT-B> refs/heads/topic2
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-A> <COMMIT-B> refs/heads/topic2
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-A> <COMMIT-C> refs/heads/topic3
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-A> <COMMIT-C> refs/heads/topic3
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-A> refs/heads/topic4
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-A> refs/heads/topic4
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-A> <COMMIT-C> refs/heads/topic4
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-A> <COMMIT-C> refs/heads/topic4
+ EOF
+
+ (
+ cd workdir &&
+ git update-ref refs/heads/topic2 $B $A &&
+ git update-ref refs/heads/topic3 $C &&
+ git update-ref refs/heads/topic4 $A &&
+ git update-ref refs/heads/topic4 $C
+ ) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-A> refs/heads/topic1
+ <COMMIT-B> refs/heads/topic2
+ <COMMIT-C> refs/heads/topic3
+ <COMMIT-C> refs/heads/topic4
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+# Mismatched hook output when deleting refs using "git update-refs -d":
+#
+# * The "reference-transaction committed" command was executed twice,
+# once for packed ref-store, and once for loose ref-store.
+#
+# * The old-oid was not the expected old-oid, but <ZERO-OID> when
+# deleting a reference without providing the old-oid parameter.
+#
+# * Unexpected execution of the "reference-transaction abort" command.
+#
+# The differences are as follows:
+#
+# @@ -4,6 +4,8 @@
+# <COMMIT-A> <ZERO-OID> refs/heads/topic1
+# <COMMIT-A> <ZERO-OID> HEAD
+# ## Call hook: reference-transaction committed ##
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic1
+# +## Call hook: reference-transaction committed ##
+# <COMMIT-A> <ZERO-OID> refs/heads/topic1
+# <COMMIT-A> <ZERO-OID> HEAD
+# ## Call hook: reference-transaction prepared ##
+# @@ -11,14 +13,20 @@
+# ## Call hook: reference-transaction prepared ##
+# <COMMIT-B> <ZERO-OID> refs/heads/topic2
+# ## Call hook: reference-transaction committed ##
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic2
+# +## Call hook: reference-transaction committed ##
+# <COMMIT-B> <ZERO-OID> refs/heads/topic2
+# ## Call hook: reference-transaction prepared ##
+# <ZERO-OID> <ZERO-OID> refs/heads/topic3
+# ## Call hook: reference-transaction prepared ##
+# -<COMMIT-C> <ZERO-OID> refs/heads/topic3
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic3
+# ## Call hook: reference-transaction committed ##
+# -<COMMIT-C> <ZERO-OID> refs/heads/topic3
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic3
+# +## Call hook: reference-transaction committed ##
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic3
+# +## Call hook: reference-transaction aborted ##
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic4
+# ## Call hook: reference-transaction prepared ##
+# -<COMMIT-C> <ZERO-OID> refs/heads/topic4
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic4
+# ## Call hook: reference-transaction committed ##
+# -<COMMIT-C> <ZERO-OID> refs/heads/topic4
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic4
+test_expect_failure "update-ref: remove refs with mixed ref_stores" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <ZERO-OID> refs/heads/topic1
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-A> <ZERO-OID> refs/heads/topic1
+ <COMMIT-A> <ZERO-OID> HEAD
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-A> <ZERO-OID> refs/heads/topic1
+ <COMMIT-A> <ZERO-OID> HEAD
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <ZERO-OID> refs/heads/topic2
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-B> <ZERO-OID> refs/heads/topic2
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-B> <ZERO-OID> refs/heads/topic2
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <ZERO-OID> refs/heads/topic3
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-C> <ZERO-OID> refs/heads/topic3
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-C> <ZERO-OID> refs/heads/topic3
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-C> <ZERO-OID> refs/heads/topic4
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-C> <ZERO-OID> refs/heads/topic4
+ EOF
+
+ (
+ cd workdir &&
+ git update-ref -d refs/heads/topic1 $A &&
+ git update-ref -d refs/heads/topic2 $B &&
+ git update-ref -d refs/heads/topic3 &&
+ git update-ref -d refs/heads/topic4
+ ) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+test_expect_success "update-ref --stdin: create new refs" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-A> refs/heads/topic1
+ <ZERO-OID> <COMMIT-A> refs/heads/topic2
+ <ZERO-OID> <COMMIT-A> refs/heads/topic3
+ <ZERO-OID> <COMMIT-A> HEAD
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-A> refs/heads/topic1
+ <ZERO-OID> <COMMIT-A> refs/heads/topic2
+ <ZERO-OID> <COMMIT-A> refs/heads/topic3
+ <ZERO-OID> <COMMIT-A> HEAD
+ EOF
+
+ (
+ cd workdir &&
+ git update-ref --stdin <<-EOF
+ create refs/heads/topic1 $A
+ create refs/heads/topic2 $A
+ create refs/heads/topic3 $A
+ EOF
+ ) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-A> refs/heads/topic1
+ <COMMIT-A> refs/heads/topic2
+ <COMMIT-A> refs/heads/topic3
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+test_expect_success "update-ref --stdin: prepare packed_ref_store using pack-refs" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+ git -C workdir pack-refs --all
+'
+
+# Failed because the old-oid was not the expected old-oid, but
+# <ZERO-OID> when running "git update-ref --stdin" to update a
+# reference without providing an old-oid.
+#
+# The differences are as follows:
+#
+# @@ -1,8 +1,8 @@
+# ## Call hook: reference-transaction prepared ##
+# <COMMIT-A> <COMMIT-B> refs/heads/topic2
+# -<COMMIT-A> <COMMIT-C> refs/heads/topic3
+# +<ZERO-OID> <COMMIT-C> refs/heads/topic3
+# <ZERO-OID> <COMMIT-C> refs/heads/topic4
+# ## Call hook: reference-transaction committed ##
+# <COMMIT-A> <COMMIT-B> refs/heads/topic2
+# -<COMMIT-A> <COMMIT-C> refs/heads/topic3
+# +<ZERO-OID> <COMMIT-C> refs/heads/topic3
+# <ZERO-OID> <COMMIT-C> refs/heads/topic4
+test_expect_failure "update-ref --stdin: update refs" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-A> <COMMIT-B> refs/heads/topic2
+ <COMMIT-A> <COMMIT-C> refs/heads/topic3
+ <ZERO-OID> <COMMIT-C> refs/heads/topic4
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-A> <COMMIT-B> refs/heads/topic2
+ <COMMIT-A> <COMMIT-C> refs/heads/topic3
+ <ZERO-OID> <COMMIT-C> refs/heads/topic4
+ EOF
+
+ (
+ cd workdir &&
+ git update-ref --stdin <<-EOF
+ start
+ update refs/heads/topic2 $B $A
+ update refs/heads/topic3 $C
+ create refs/heads/topic4 $C
+ prepare
+ commit
+ EOF
+ ) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-A> refs/heads/topic1
+ <COMMIT-B> refs/heads/topic2
+ <COMMIT-C> refs/heads/topic3
+ <COMMIT-C> refs/heads/topic4
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+# Mismatched hook output when deleting refs using "git update-refs
+# --stdin":
+#
+# * The "reference-transaction committed" command was executed twice,
+# once for packed ref-store, and once for loose ref-store.
+#
+# * The old-oid was not the expected old-oid, but <ZERO-OID> when
+# deleting a ref without providing the old-oid parameter.
+#
+# The differences are as follows:
+#
+# @@ -4,14 +4,19 @@
+# <ZERO-OID> <ZERO-OID> refs/heads/topic3
+# <ZERO-OID> <ZERO-OID> refs/heads/topic4
+# ## Call hook: reference-transaction prepared ##
+# -<COMMIT-A> <ZERO-OID> refs/heads/topic1
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic1
+# <COMMIT-B> <ZERO-OID> refs/heads/topic2
+# -<COMMIT-C> <ZERO-OID> refs/heads/topic3
+# -<COMMIT-C> <ZERO-OID> refs/heads/topic4
+# -<COMMIT-A> <ZERO-OID> HEAD
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic3
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic4
+# +<ZERO-OID> <ZERO-OID> HEAD
+# ## Call hook: reference-transaction committed ##
+# -<COMMIT-A> <ZERO-OID> refs/heads/topic1
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic1
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic2
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic3
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic4
+# +## Call hook: reference-transaction committed ##
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic1
+# <COMMIT-B> <ZERO-OID> refs/heads/topic2
+# -<COMMIT-C> <ZERO-OID> refs/heads/topic3
+# -<COMMIT-C> <ZERO-OID> refs/heads/topic4
+# -<COMMIT-A> <ZERO-OID> HEAD
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic3
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic4
+# +<ZERO-OID> <ZERO-OID> HEAD
+test_expect_failure "update-ref --stdin: delete refs" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <ZERO-OID> refs/heads/topic1
+ <ZERO-OID> <ZERO-OID> refs/heads/topic2
+ <ZERO-OID> <ZERO-OID> refs/heads/topic3
+ <ZERO-OID> <ZERO-OID> refs/heads/topic4
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-A> <ZERO-OID> refs/heads/topic1
+ <COMMIT-B> <ZERO-OID> refs/heads/topic2
+ <COMMIT-C> <ZERO-OID> refs/heads/topic3
+ <COMMIT-C> <ZERO-OID> refs/heads/topic4
+ <COMMIT-A> <ZERO-OID> HEAD
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-A> <ZERO-OID> refs/heads/topic1
+ <COMMIT-B> <ZERO-OID> refs/heads/topic2
+ <COMMIT-C> <ZERO-OID> refs/heads/topic3
+ <COMMIT-C> <ZERO-OID> refs/heads/topic4
+ <COMMIT-A> <ZERO-OID> HEAD
+ EOF
+
+ (
+ cd workdir &&
+ git update-ref --stdin <<-EOF
+ start
+ delete refs/heads/topic1
+ delete refs/heads/topic2 $B
+ delete refs/heads/topic3
+ delete refs/heads/topic4
+ prepare
+ commit
+ EOF
+ ) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+test_expect_success "branch: setup workdir using git-fetch" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-C> refs/remotes/origin/main
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-C> refs/remotes/origin/main
+ EOF
+
+ rm -rf workdir &&
+ git init workdir &&
+ git -C workdir remote add origin ../base &&
+ git -C workdir fetch origin &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-C> refs/heads/main
+ <ZERO-OID> <COMMIT-C> HEAD
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-C> refs/heads/main
+ <ZERO-OID> <COMMIT-C> HEAD
+ EOF
+
+ rm $HOOK_OUTPUT &&
+ git -C workdir switch -c main origin/main &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+test_expect_success "branch: create new branches" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-A> refs/heads/topic1
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-A> refs/heads/topic1
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-A> refs/heads/topic2
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-A> refs/heads/topic2
+ EOF
+
+ (
+ cd workdir &&
+ git branch topic1 $A &&
+ git branch topic2 $A
+ ) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-A> refs/heads/topic1
+ <COMMIT-A> refs/heads/topic2
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+# Failed because the reference-transaction hook was executed even
+# though no refs were changed by running git-gc.
+test_expect_failure "branch: prepare packed_ref_store using gc" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+ git -C workdir gc &&
+ test_path_is_file workdir/.git/packed-refs &&
+ test_path_is_missing $HOOK_OUTPUT
+'
+
+# Failed because the old-oid was not the expected old-oid, but
+# <ZERO-OID> when running git-branch to update a branch without
+# providing an old-oid.
+#
+# The differences are as follows:
+#
+# @@ -1,7 +1,7 @@
+# ## Call hook: reference-transaction prepared ##
+# -<COMMIT-A> <COMMIT-B> refs/heads/topic2
+# +<ZERO-OID> <COMMIT-B> refs/heads/topic2
+# ## Call hook: reference-transaction committed ##
+# -<COMMIT-A> <COMMIT-B> refs/heads/topic2
+# +<ZERO-OID> <COMMIT-B> refs/heads/topic2
+# ## Call hook: reference-transaction prepared ##
+# <ZERO-OID> <COMMIT-C> refs/heads/topic3
+# ## Call hook: reference-transaction committed ##
+test_expect_failure "branch: update branch without old-oid" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-A> <COMMIT-B> refs/heads/topic2
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-A> <COMMIT-B> refs/heads/topic2
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-C> refs/heads/topic3
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-C> refs/heads/topic3
+ EOF
+
+ (
+ cd workdir &&
+ git branch -f topic2 $B &&
+ git branch topic3 $C
+ ) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-A> refs/heads/topic1
+ <COMMIT-B> refs/heads/topic2
+ <COMMIT-C> refs/heads/topic3
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+# Failed because the reference-transaction hook was not executed at all
+# when copying a branch using "git branch -c".
+test_expect_failure "branch: copy branches" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-B> refs/heads/topic4
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-B> refs/heads/topic4
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-C> refs/heads/topic5
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-C> refs/heads/topic5
+ EOF
+
+ (
+ cd workdir &&
+ git branch -c topic2 topic4 &&
+ git branch -c topic3 topic5
+ ) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-A> refs/heads/topic1
+ <COMMIT-B> refs/heads/topic2
+ <COMMIT-C> refs/heads/topic3
+ <COMMIT-B> refs/heads/topic4
+ <COMMIT-C> refs/heads/topic5
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+# Mismatched hook output for "git branch -m":
+#
+# * The "reference-transaction committed" command was not executed
+# for the target branch.
+#
+# * Unexpected execution of the "reference-transaction abort" command.
+#
+# The differences are as follows:
+#
+# @@ -1,16 +1,12 @@
+# +## Call hook: reference-transaction aborted ##
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic4
+# ## Call hook: reference-transaction prepared ##
+# <COMMIT-B> <ZERO-OID> refs/heads/topic4
+# ## Call hook: reference-transaction committed ##
+# <COMMIT-B> <ZERO-OID> refs/heads/topic4
+# -## Call hook: reference-transaction prepared ##
+# -<ZERO-OID> <COMMIT-B> refs/heads/topic6
+# -## Call hook: reference-transaction committed ##
+# -<ZERO-OID> <COMMIT-B> refs/heads/topic6
+# +## Call hook: reference-transaction aborted ##
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic5
+# ## Call hook: reference-transaction prepared ##
+# <COMMIT-C> <ZERO-OID> refs/heads/topic5
+# ## Call hook: reference-transaction committed ##
+# <COMMIT-C> <ZERO-OID> refs/heads/topic5
+# -## Call hook: reference-transaction prepared ##
+# -<ZERO-OID> <COMMIT-C> refs/heads/topic7
+# -## Call hook: reference-transaction committed ##
+# -<ZERO-OID> <COMMIT-C> refs/heads/topic7
+test_expect_failure "branch: rename branches" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-B> <ZERO-OID> refs/heads/topic4
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-B> <ZERO-OID> refs/heads/topic4
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-B> refs/heads/topic6
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-B> refs/heads/topic6
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-C> <ZERO-OID> refs/heads/topic5
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-C> <ZERO-OID> refs/heads/topic5
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-C> refs/heads/topic7
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-C> refs/heads/topic7
+ EOF
+
+ (
+ cd workdir &&
+ git branch -m topic4 topic6 &&
+ git branch -m topic5 topic7
+ ) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-A> refs/heads/topic1
+ <COMMIT-B> refs/heads/topic2
+ <COMMIT-C> refs/heads/topic3
+ <COMMIT-B> refs/heads/topic6
+ <COMMIT-C> refs/heads/topic7
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+# Mismatched hook output for "git branch -d":
+#
+# * The old-oid was not the expected old-oid, but <ZERO-OID> when
+# deleting a branch without providing the old-oid parameter.
+#
+# * The delete branches operation should be treated as one transaction,
+# but was splitted into several transactions on loose references,
+# and the "reference-transaction committed" command was executed
+# redundantly on the packed-ref-store.
+#
+# * Unexpected execution of the "reference-transaction abort" command.
+#
+# The differences are as follows:
+#
+# @@ -2,11 +2,25 @@
+# <ZERO-OID> <ZERO-OID> refs/heads/topic1
+# <ZERO-OID> <ZERO-OID> refs/heads/topic2
+# <ZERO-OID> <ZERO-OID> refs/heads/topic3
+# +## Call hook: reference-transaction committed ##
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic1
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic2
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic3
+# +## Call hook: reference-transaction aborted ##
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic1
+# ## Call hook: reference-transaction prepared ##
+# -<COMMIT-A> <ZERO-OID> refs/heads/topic1
+# -<COMMIT-B> <ZERO-OID> refs/heads/topic2
+# -<COMMIT-C> <ZERO-OID> refs/heads/topic3
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic1
+# ## Call hook: reference-transaction committed ##
+# -<COMMIT-A> <ZERO-OID> refs/heads/topic1
+# -<COMMIT-B> <ZERO-OID> refs/heads/topic2
+# -<COMMIT-C> <ZERO-OID> refs/heads/topic3
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic1
+# +## Call hook: reference-transaction aborted ##
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic2
+# +## Call hook: reference-transaction prepared ##
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic2
+# +## Call hook: reference-transaction committed ##
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic2
+# +## Call hook: reference-transaction aborted ##
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic3
+# +## Call hook: reference-transaction prepared ##
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic3
+# +## Call hook: reference-transaction committed ##
+# +<ZERO-OID> <ZERO-OID> refs/heads/topic3
+test_expect_failure "branch: remove branches" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <ZERO-OID> refs/heads/topic1
+ <ZERO-OID> <ZERO-OID> refs/heads/topic2
+ <ZERO-OID> <ZERO-OID> refs/heads/topic3
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-A> <ZERO-OID> refs/heads/topic1
+ <COMMIT-B> <ZERO-OID> refs/heads/topic2
+ <COMMIT-C> <ZERO-OID> refs/heads/topic3
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-A> <ZERO-OID> refs/heads/topic1
+ <COMMIT-B> <ZERO-OID> refs/heads/topic2
+ <COMMIT-C> <ZERO-OID> refs/heads/topic3
+ EOF
+
+ (
+ cd workdir &&
+ git branch -d topic1 topic2 topic3
+ ) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-B> refs/heads/topic6
+ <COMMIT-C> refs/heads/topic7
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+test_expect_success "tag: setup workdir using git-push" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-C> refs/heads/main
+ <ZERO-OID> <COMMIT-C> HEAD
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-C> refs/heads/main
+ <ZERO-OID> <COMMIT-C> HEAD
+ EOF
+
+ rm -rf workdir &&
+ git init workdir &&
+ git -C workdir config receive.denyCurrentBranch ignore &&
+ git -C base push ../workdir "+refs/heads/*:refs/heads/*" &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ EOF
+ test_cmp_heads_and_tags -C workdir expect &&
+
+ git -C workdir restore --staged -- . &&
+ git -C workdir restore -- .
+'
+
+test_expect_success "tag: create new tags" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-A> refs/tags/v1
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-A> refs/tags/v1
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-A> refs/tags/v2
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-A> refs/tags/v2
+ EOF
+
+ (
+ cd workdir &&
+ git tag v1 $A &&
+ git tag v2 $A
+ ) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-A> refs/tags/v1
+ <COMMIT-A> refs/tags/v2
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+# Failed because the reference-transaction hook was executed even
+# though no refs were changed by running git-pack-refs.
+test_expect_failure "tag: prepare packed_ref_store using pack-refs" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+ git -C workdir pack-refs --all &&
+ test_path_is_file workdir/.git/packed-refs &&
+ test_path_is_missing $HOOK_OUTPUT
+'
+
+test_expect_success "tag: update refs to create loose refs" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-A> <COMMIT-B> refs/tags/v2
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-A> <COMMIT-B> refs/tags/v2
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-C> refs/tags/v3
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-C> refs/tags/v3
+ EOF
+
+ (
+ cd workdir &&
+ git tag -f v2 $B &&
+ git tag v3 $C
+ ) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-A> refs/tags/v1
+ <COMMIT-B> refs/tags/v2
+ <COMMIT-C> refs/tags/v3
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+# Mismatched hook output for "git tag -d":
+#
+# * The old-oid was not the expected old-oid, but <ZERO-OID> when
+# deleting a tag without providing the old-oid parameter.
+#
+# * The delete tags operation should be treated as one transaction,
+# but was splitted into several transactions on loose references,
+# and the "reference-transaction committed" command was executed
+# redundantly on the packed-ref-store.
+#
+# * Unexpected execution of the "reference-transaction abort" command.
+#
+# The differences are as follows:
+#
+# @@ -2,11 +2,25 @@
+# <ZERO-OID> <ZERO-OID> refs/tags/v1
+# <ZERO-OID> <ZERO-OID> refs/tags/v2
+# <ZERO-OID> <ZERO-OID> refs/tags/v3
+# +## Call hook: reference-transaction committed ##
+# +<ZERO-OID> <ZERO-OID> refs/tags/v1
+# +<ZERO-OID> <ZERO-OID> refs/tags/v2
+# +<ZERO-OID> <ZERO-OID> refs/tags/v3
+# +## Call hook: reference-transaction aborted ##
+# +<ZERO-OID> <ZERO-OID> refs/tags/v1
+# ## Call hook: reference-transaction prepared ##
+# -<COMMIT-A> <ZERO-OID> refs/tags/v1
+# -<COMMIT-B> <ZERO-OID> refs/tags/v2
+# -<COMMIT-C> <ZERO-OID> refs/tags/v3
+# +<ZERO-OID> <ZERO-OID> refs/tags/v1
+# ## Call hook: reference-transaction committed ##
+# -<COMMIT-A> <ZERO-OID> refs/tags/v1
+# -<COMMIT-B> <ZERO-OID> refs/tags/v2
+# -<COMMIT-C> <ZERO-OID> refs/tags/v3
+# +<ZERO-OID> <ZERO-OID> refs/tags/v1
+# +## Call hook: reference-transaction aborted ##
+# +<ZERO-OID> <ZERO-OID> refs/tags/v2
+# +## Call hook: reference-transaction prepared ##
+# +<ZERO-OID> <ZERO-OID> refs/tags/v2
+# +## Call hook: reference-transaction committed ##
+# +<ZERO-OID> <ZERO-OID> refs/tags/v2
+# +## Call hook: reference-transaction aborted ##
+# +<ZERO-OID> <ZERO-OID> refs/tags/v3
+# +## Call hook: reference-transaction prepared ##
+# +<ZERO-OID> <ZERO-OID> refs/tags/v3
+# +## Call hook: reference-transaction committed ##
+# +<ZERO-OID> <ZERO-OID> refs/tags/v3
+test_expect_failure "tag: remove tags with mixed ref_stores" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <ZERO-OID> refs/tags/v1
+ <ZERO-OID> <ZERO-OID> refs/tags/v2
+ <ZERO-OID> <ZERO-OID> refs/tags/v3
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-A> <ZERO-OID> refs/tags/v1
+ <COMMIT-B> <ZERO-OID> refs/tags/v2
+ <COMMIT-C> <ZERO-OID> refs/tags/v3
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-A> <ZERO-OID> refs/tags/v1
+ <COMMIT-B> <ZERO-OID> refs/tags/v2
+ <COMMIT-C> <ZERO-OID> refs/tags/v3
+ EOF
+
+ (
+ cd workdir &&
+ git tag -d v1 v2 v3
+ ) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+test_expect_success "worktree: setup workdir using push --atomic" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-C> refs/heads/main
+ <ZERO-OID> <COMMIT-C> HEAD
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-C> refs/heads/main
+ <ZERO-OID> <COMMIT-C> HEAD
+ EOF
+
+ rm -rf workdir &&
+ git init --bare repo.git &&
+ git -C base push --atomic --mirror ../repo.git &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+ rm $HOOK_OUTPUT &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-C> refs/remotes/origin/main
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-C> refs/remotes/origin/main
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-C> HEAD
+ <ZERO-OID> <COMMIT-C> refs/heads/main
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-C> HEAD
+ <ZERO-OID> <COMMIT-C> refs/heads/main
+ EOF
+
+ git clone --no-local repo.git workdir &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+test_expect_success "worktree: topic1: commit --amend" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-C> refs/heads/topic1
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-C> refs/heads/topic1
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-C> <COMMIT-D> HEAD
+ <COMMIT-C> <COMMIT-D> refs/heads/topic1
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-C> <COMMIT-D> HEAD
+ <COMMIT-C> <COMMIT-D> refs/heads/topic1
+ EOF
+
+ (
+ cd workdir &&
+ git checkout -b topic1 &&
+ git commit --amend -m "C (amend)"
+ ) &&
+ D=$(git -C workdir rev-parse HEAD) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-D> refs/heads/topic1
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+test_expect_success "worktree: topic2: merge" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-A> refs/heads/topic2
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-A> refs/heads/topic2
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-A> ORIG_HEAD
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-A> ORIG_HEAD
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-A> <COMMIT-E> HEAD
+ <COMMIT-A> <COMMIT-E> refs/heads/topic2
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-A> <COMMIT-E> HEAD
+ <COMMIT-A> <COMMIT-E> refs/heads/topic2
+ EOF
+
+ (
+ cd workdir &&
+ git checkout -b topic2 $A &&
+ git merge --no-ff main &&
+ test_path_is_file B.t &&
+ test_path_is_file C.t
+ ) &&
+ E=$(git -C workdir rev-parse HEAD) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-D> refs/heads/topic1
+ <COMMIT-E> refs/heads/topic2
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+# Mismatched hook output for git-cherry-pick:
+#
+# * The old-oid was not the expected old-oid, but <ZERO-OID>.
+#
+# * Unexpected execution of the "reference-transaction abort" command.
+#
+# The differences are as follows:
+#
+# @@ -12,7 +12,9 @@
+# ## Call hook: reference-transaction committed ##
+# <COMMIT-A> <COMMIT-F> HEAD
+# <COMMIT-A> <COMMIT-F> refs/heads/topic3
+# +## Call hook: reference-transaction aborted ##
+# +<ZERO-OID> <ZERO-OID> CHERRY_PICK_HEAD
+# ## Call hook: reference-transaction prepared ##
+# -<COMMIT-C> <ZERO-OID> CHERRY_PICK_HEAD
+# +<ZERO-OID> <ZERO-OID> CHERRY_PICK_HEAD
+# ## Call hook: reference-transaction committed ##
+# -<COMMIT-C> <ZERO-OID> CHERRY_PICK_HEAD
+# +<ZERO-OID> <ZERO-OID> CHERRY_PICK_HEAD
+test_expect_failure "worktree: topic3: cherry-pick" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-A> refs/heads/topic3
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-A> refs/heads/topic3
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-C> CHERRY_PICK_HEAD
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-C> CHERRY_PICK_HEAD
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-A> <COMMIT-F> HEAD
+ <COMMIT-A> <COMMIT-F> refs/heads/topic3
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-A> <COMMIT-F> HEAD
+ <COMMIT-A> <COMMIT-F> refs/heads/topic3
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-C> <ZERO-OID> CHERRY_PICK_HEAD
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-C> <ZERO-OID> CHERRY_PICK_HEAD
+ EOF
+
+ (
+ cd workdir &&
+ git checkout -b topic3 $A &&
+ git cherry-pick $C &&
+ test_path_is_file C.t &&
+ test_path_is_missing B.t
+ ) &&
+ F=$(git -C workdir rev-parse HEAD) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-D> refs/heads/topic1
+ <COMMIT-E> refs/heads/topic2
+ <COMMIT-F> refs/heads/topic3
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+# Mismatched hook output for git-rebase:
+#
+# * The old-oid was not the expected old-oid, but <ZERO-OID>.
+#
+# * Unexpected execution of the "reference-transaction abort" command.
+#
+# The differences are as follows:
+#
+# @@ -6,6 +6,8 @@
+# <COMMIT-G> <COMMIT-C> HEAD
+# ## Call hook: reference-transaction committed ##
+# <COMMIT-G> <COMMIT-C> HEAD
+# +## Call hook: reference-transaction aborted ##
+# +<ZERO-OID> <ZERO-OID> REBASE_HEAD
+# ## Call hook: reference-transaction prepared ##
+# <ZERO-OID> <ZERO-OID> REBASE_HEAD
+# ## Call hook: reference-transaction committed ##
+# @@ -18,10 +20,12 @@
+# <COMMIT-C> <COMMIT-H> HEAD
+# ## Call hook: reference-transaction committed ##
+# <COMMIT-C> <COMMIT-H> HEAD
+# +## Call hook: reference-transaction aborted ##
+# +<ZERO-OID> <ZERO-OID> CHERRY_PICK_HEAD
+# ## Call hook: reference-transaction prepared ##
+# -<COMMIT-G> <ZERO-OID> CHERRY_PICK_HEAD
+# +<ZERO-OID> <ZERO-OID> CHERRY_PICK_HEAD
+# ## Call hook: reference-transaction committed ##
+# -<COMMIT-G> <ZERO-OID> CHERRY_PICK_HEAD
+# +<ZERO-OID> <ZERO-OID> CHERRY_PICK_HEAD
+# ## Call hook: reference-transaction prepared ##
+# <COMMIT-G> <COMMIT-H> refs/heads/topic4
+# ## Call hook: reference-transaction committed ##
+test_expect_failure "worktree: topic4: rebase" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-A> <COMMIT-G> ORIG_HEAD
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-A> <COMMIT-G> ORIG_HEAD
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-G> <COMMIT-C> HEAD
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-G> <COMMIT-C> HEAD
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <ZERO-OID> REBASE_HEAD
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <ZERO-OID> REBASE_HEAD
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-G> CHERRY_PICK_HEAD
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-G> CHERRY_PICK_HEAD
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-C> <COMMIT-H> HEAD
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-C> <COMMIT-H> HEAD
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-G> <ZERO-OID> CHERRY_PICK_HEAD
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-G> <ZERO-OID> CHERRY_PICK_HEAD
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-G> <COMMIT-H> refs/heads/topic4
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-G> <COMMIT-H> refs/heads/topic4
+ EOF
+
+ git -C workdir checkout -b topic4 $A &&
+ create_commits_in workdir G &&
+ rm $HOOK_OUTPUT &&
+ git -C workdir rebase main &&
+ H=$(git -C workdir rev-parse HEAD) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-D> refs/heads/topic1
+ <COMMIT-E> refs/heads/topic2
+ <COMMIT-F> refs/heads/topic3
+ <COMMIT-H> refs/heads/topic4
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+# Mismatched hook output for git-revert:
+#
+# * Unexpected execution of the "reference-transaction abort" command.
+#
+# The differences are as follows:
+#
+# @@ -8,6 +8,8 @@
+# ## Call hook: reference-transaction committed ##
+# <COMMIT-C> <COMMIT-I> HEAD
+# <COMMIT-C> <COMMIT-I> refs/heads/topic5
+# +## Call hook: reference-transaction aborted ##
+# +<ZERO-OID> <ZERO-OID> CHERRY_PICK_HEAD
+# ## Call hook: reference-transaction prepared ##
+# <ZERO-OID> <ZERO-OID> CHERRY_PICK_HEAD
+# ## Call hook: reference-transaction committed ##
+test_expect_failure "worktree: topic5: revert" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-C> refs/heads/topic5
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-C> refs/heads/topic5
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-C> <COMMIT-I> HEAD
+ <COMMIT-C> <COMMIT-I> refs/heads/topic5
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-C> <COMMIT-I> HEAD
+ <COMMIT-C> <COMMIT-I> refs/heads/topic5
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <ZERO-OID> CHERRY_PICK_HEAD
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <ZERO-OID> CHERRY_PICK_HEAD
+ EOF
+
+ (
+ cd workdir &&
+ git checkout -b topic5 $C &&
+ git revert HEAD &&
+ test_path_is_file B.t &&
+ test_path_is_missing C.t
+ ) &&
+ I=$(git -C workdir rev-parse HEAD) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-D> refs/heads/topic1
+ <COMMIT-E> refs/heads/topic2
+ <COMMIT-F> refs/heads/topic3
+ <COMMIT-H> refs/heads/topic4
+ <COMMIT-I> refs/heads/topic5
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
+test_expect_success "worktree: topic6: reset" '
+ test_when_finished "rm -f $HOOK_OUTPUT" &&
+
+ cat >expect <<-\EOF &&
+ ## Call hook: reference-transaction prepared ##
+ <ZERO-OID> <COMMIT-C> refs/heads/topic6
+ ## Call hook: reference-transaction committed ##
+ <ZERO-OID> <COMMIT-C> refs/heads/topic6
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-G> <COMMIT-C> ORIG_HEAD
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-G> <COMMIT-C> ORIG_HEAD
+ ## Call hook: reference-transaction prepared ##
+ <COMMIT-C> <COMMIT-B> HEAD
+ <COMMIT-C> <COMMIT-B> refs/heads/topic6
+ ## Call hook: reference-transaction committed ##
+ <COMMIT-C> <COMMIT-B> HEAD
+ <COMMIT-C> <COMMIT-B> refs/heads/topic6
+ EOF
+
+ (
+ cd workdir &&
+ git checkout -b topic6 $C &&
+ git reset --hard $B
+ ) &&
+ make_user_friendly_and_stable_output <$HOOK_OUTPUT >actual &&
+ test_cmp expect actual &&
+
+ cat >expect <<-\EOF &&
+ <COMMIT-C> refs/heads/main
+ <COMMIT-D> refs/heads/topic1
+ <COMMIT-E> refs/heads/topic2
+ <COMMIT-F> refs/heads/topic3
+ <COMMIT-H> refs/heads/topic4
+ <COMMIT-I> refs/heads/topic5
+ <COMMIT-B> refs/heads/topic6
+ EOF
+ test_cmp_heads_and_tags -C workdir expect
+'
+
test_done
--
2.36.1.25.gc87d5ad63a.dirty
next prev parent reply other threads:[~2022-08-19 3:22 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-29 10:12 [PATCH 0/9] Fix issues of reference-transaction hook for various git commands Jiang Xin
2022-07-29 10:12 ` [PATCH 1/9] t1416: more testcases for reference-transaction hook Jiang Xin
2022-07-30 6:44 ` Eric Sunshine
2022-07-31 3:25 ` Jiang Xin
2022-07-29 10:12 ` [PATCH 2/9] refs: update missing old-oid in transaction from lockfile Jiang Xin
2022-07-29 10:12 ` [PATCH 3/9] refs: add new field in transaction for running transaction hook Jiang Xin
2022-07-29 10:12 ` [PATCH 4/9] refs: do not run transaction hook for git-pack-refs Jiang Xin
2022-07-29 10:12 ` [PATCH 5/9] refs: avoid duplicate running of the reference-transaction hook Jiang Xin
2022-08-02 12:18 ` Michael Heemskerk
2022-08-05 1:41 ` Jiang Xin
2022-08-19 3:21 ` [PATCH v2 0/9] Fix issues of refx-txn hook for various git commands Jiang Xin
2022-08-19 3:21 ` Jiang Xin [this message]
2022-08-19 3:21 ` [PATCH v2 2/9] refs: update missing old-oid in transaction from lockfile Jiang Xin
2022-08-19 3:21 ` [PATCH v2 3/9] refs: add new field in transaction for running transaction hook Jiang Xin
2022-08-19 3:21 ` [PATCH v2 4/9] refs: do not run transaction hook for git-pack-refs Jiang Xin
2022-08-19 3:21 ` [PATCH v2 5/9] refs: avoid duplicate running of the reference-transaction hook Jiang Xin
2022-08-19 3:21 ` [PATCH v2 6/9] refs: add reflog_info to hold more fields for reflog entry Jiang Xin
2022-08-19 3:21 ` [PATCH v2 7/9] refs: get error message via refs_update_ref_extended() Jiang Xin
2022-08-19 3:21 ` [PATCH v2 8/9] refs: reimplement files_copy_or_rename_ref() to run refs-txn hook Jiang Xin
2022-08-19 3:21 ` [PATCH v2 9/9] refs: reimplement refs_delete_refs() and run hook once Jiang Xin
2022-07-29 10:12 ` [PATCH 6/9] refs: add reflog_info to hold more fields for reflog entry Jiang Xin
2022-08-01 11:32 ` Jiang Xin
2022-07-29 10:12 ` [PATCH 7/9] refs: get error message via refs_update_ref_extended() Jiang Xin
2022-07-29 10:12 ` [PATCH 8/9] refs: reimplement files_copy_or_rename_ref() to run hook Jiang Xin
2022-07-29 10:12 ` [PATCH 9/9] refs: reimplement refs_delete_refs() and run hook once Jiang Xin
2022-08-02 12:42 ` Michael Heemskerk
2022-08-09 11:05 ` Patrick Steinhardt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220819032147.28841-2-worldhello.net@gmail.com \
--to=worldhello.net@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=mheemskerk@atlassian.com \
--cc=ps@pks.im \
--cc=sunshine@sunshineco.com \
--cc=zhiyou.jx@alibaba-inc.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.