summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Patrick Steinhardt <ps@pks.im>2020-11-13 09:12:45 +0100
committerLibravatar Junio C Hamano <gitster@pobox.com>2020-11-16 13:44:01 -0800
commit8c4417f1cf3c78955a7ea942cc0c8a97e7c77e77 (patch)
tree08794784cbef00a92c0d2189ef4fac24d573a98e
parentp1400: use `git-update-ref --stdin` to test multiple transactions (diff)
downloadtgif-8c4417f1cf3c78955a7ea942cc0c8a97e7c77e77.tar.xz
update-ref: disallow "start" for ongoing transactions
It is currently possible to write multiple "start" commands into git-update-ref(1) for a single session, but none of them except for the first one actually have any effect. Using such nested "start"s may eventually have a sensible effect. One may imagine that it restarts the current transaction, effectively emptying it and creating a new one. It may also allow for creation of nested transactions. But currently, none of these are implemented. Silently ignoring this misuse is making it hard to iterate in the future if "start" is ever going to have meaningful semantics in such a context. This commit thus makes sure to error out in case we see such use. Signed-off-by: Patrick Steinhardt <ps@pks.im> Reviewed-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin/update-ref.c2
-rwxr-xr-xt/t1400-update-ref.sh11
2 files changed, 13 insertions, 0 deletions
diff --git a/builtin/update-ref.c b/builtin/update-ref.c
index bb65129012..6029a80544 100644
--- a/builtin/update-ref.c
+++ b/builtin/update-ref.c
@@ -436,6 +436,8 @@ static void update_refs_stdin(void)
switch (state) {
case UPDATE_REFS_OPEN:
case UPDATE_REFS_STARTED:
+ if (state == UPDATE_REFS_STARTED && cmd->state == UPDATE_REFS_STARTED)
+ die("cannot restart ongoing transaction");
/* Do not downgrade a transaction to a non-transaction. */
if (cmd->state >= state)
state = cmd->state;
diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh
index 3144e98b31..31b64be521 100755
--- a/t/t1400-update-ref.sh
+++ b/t/t1400-update-ref.sh
@@ -1583,4 +1583,15 @@ test_expect_success 'transaction can commit after abort' '
test_cmp expect actual
'
+test_expect_success 'transaction cannot restart ongoing transaction' '
+ cat >stdin <<-EOF &&
+ start
+ create refs/heads/restart $A
+ start
+ commit
+ EOF
+ test_must_fail git update-ref --stdin <stdin >actual &&
+ test_must_fail git show-ref --verify refs/heads/restart
+'
+
test_done