refs: demonstrate excessive execution of the reference-transaction hook
Add tests which demonstate that we're executing the reference-transaction hook too often in some cases, which thus leaks implementation details about the reference store's implementation itself. Behaviour will be fixed in follow-up commits. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Patrick Steinhardt committed
Jan 17, 2022 at 09:12 UTC
2ce825436268d6409bee8ebb5f5500b7ff172b1e
1 file changed
+64
t/t1416-ref-transaction-hooks.sh
+64
@@ -136,4 +136,68 @@ test_expect_success 'interleaving hook calls succeed' '
136
test_cmp expect target-repo.git/actual
137
'
138
139
+test_expect_success 'hook does not get called on packing refs' '
140
+ # Pack references first such that we are in a known state.
141
+ git pack-refs --all &&
142
+
143
+ write_script .git/hooks/reference-transaction <<-\EOF &&
144
+ echo "$@" >>actual
145
+ cat >>actual
146
+ EOF
147
+ rm -f actual &&
148
+
149
+ git update-ref refs/heads/unpacked-ref $POST_OID &&
150
+ git pack-refs --all &&
151
+
152
+ # We only expect a single hook invocation, which is the call to
153
+ # git-update-ref(1). But currently, packing refs will also trigger the
154
+ # hook.
155
+ cat >expect <<-EOF &&
156
+ prepared
157
+ $ZERO_OID $POST_OID refs/heads/unpacked-ref
158
+ committed
159
+ $ZERO_OID $POST_OID refs/heads/unpacked-ref
160
+ prepared
161
+ $ZERO_OID $POST_OID refs/heads/unpacked-ref
162
+ committed
163
+ $ZERO_OID $POST_OID refs/heads/unpacked-ref
164
+ prepared
165
+ $POST_OID $ZERO_OID refs/heads/unpacked-ref
166
+ committed
167
+ $POST_OID $ZERO_OID refs/heads/unpacked-ref
168
+ EOF
169
+
170
+ test_cmp expect actual
171
+'
172
+
173
+test_expect_success 'deleting packed ref calls hook once' '
174
+ # Create a reference and pack it.
175
+ git update-ref refs/heads/to-be-deleted $POST_OID &&
176
+ git pack-refs --all &&
177
+
178
+ write_script .git/hooks/reference-transaction <<-\EOF &&
179
+ echo "$@" >>actual
180
+ cat >>actual
181
+ EOF
182
+ rm -f actual &&
183
+
184
+ git update-ref -d refs/heads/to-be-deleted $POST_OID &&
185
+
186
+ # We only expect a single hook invocation, which is the logical
187
+ # deletion. But currently, we see two interleaving transactions, once
188
+ # for deleting the loose refs and once for deleting the packed ref.
189
+ cat >expect <<-EOF &&
190
+ prepared
191
+ $ZERO_OID $ZERO_OID refs/heads/to-be-deleted
192
+ prepared
193
+ $POST_OID $ZERO_OID refs/heads/to-be-deleted
194
+ committed
195
+ $ZERO_OID $ZERO_OID refs/heads/to-be-deleted
196
+ committed
197
+ $POST_OID $ZERO_OID refs/heads/to-be-deleted
198
+ EOF
199
+
200
+ test_cmp expect actual
201
+'
202
+
203
test_done