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>

Patrick Steinhardt committed Nov 13, 2020 at 09:12 UTC 8c4417f1cf3c78955a7ea942cc0c8a97e7c77e77
2 files changed +13
builtin/update-ref.c
+2
@@ -436,6 +436,8 @@ static void update_refs_stdin(void)
436 switch (state) {
437 case UPDATE_REFS_OPEN:
438 case UPDATE_REFS_STARTED:
439 + if (state == UPDATE_REFS_STARTED && cmd->state == UPDATE_REFS_STARTED)
440 + die("cannot restart ongoing transaction");
441 /* Do not downgrade a transaction to a non-transaction. */
442 if (cmd->state >= state)
443 state = cmd->state;
t/t1400-update-ref.sh
+11
@@ -1583,4 +1583,15 @@ test_expect_success 'transaction can commit after abort' '
1583 test_cmp expect actual
1584 '
1585
1586 +test_expect_success 'transaction cannot restart ongoing transaction' '
1587 + cat >stdin <<-EOF &&
1588 + start
1589 + create refs/heads/restart $A
1590 + start
1591 + commit
1592 + EOF
1593 + test_must_fail git update-ref --stdin <stdin >actual &&
1594 + test_must_fail git show-ref --verify refs/heads/restart
1595 +'
1596 +
1597 test_done