diff options
author | Patrick Steinhardt <ps@pks.im> | 2021-09-03 09:06:37 (GMT) |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2021-09-03 18:35:15 (GMT) |
commit | efa3d64ce86a600563c8bf909c46dd0985ee6c11 (patch) | |
tree | ad4c6667386cccdacad27ee6adddae0cb4ddf43c /t/t1400-update-ref.sh | |
parent | 225bc32a989d7a22fa6addafd4ce7dcd04675dbf (diff) | |
download | git-efa3d64ce86a600563c8bf909c46dd0985ee6c11.zip git-efa3d64ce86a600563c8bf909c46dd0985ee6c11.tar.gz git-efa3d64ce86a600563c8bf909c46dd0985ee6c11.tar.bz2 |
update-ref: fix streaming of status updates
When executing git-update-ref(1) with the `--stdin` flag, then the user
can queue updates and, since e48cf33b61 (update-ref: implement
interactive transaction handling, 2020-04-02), interactively drive the
transaction's state via a set of transactional verbs. This interactivity
is somewhat broken though: while the caller can use these verbs to drive
the transaction's state, the status messages which confirm that a verb
has been processed is not flushed. The caller may thus be left hanging
waiting for the acknowledgement.
Fix the bug by flushing stdout after writing the status update. Add a
test which catches this bug.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 't/t1400-update-ref.sh')
-rwxr-xr-x | t/t1400-update-ref.sh | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh index 4506cd4..1e754e2 100755 --- a/t/t1400-update-ref.sh +++ b/t/t1400-update-ref.sh @@ -1598,6 +1598,38 @@ test_expect_success 'transaction cannot restart ongoing transaction' ' test_must_fail git show-ref --verify refs/heads/restart ' +test_expect_success PIPE 'transaction flushes status updates' ' + mkfifo in out && + (git update-ref --stdin <in >out &) && + + exec 9>in && + test_when_finished "exec 9>&-" && + + echo "start" >&9 && + echo "start: ok" >expected && + read line <out && + echo "$line" >actual && + test_cmp expected actual && + + echo "create refs/heads/flush $A" >&9 && + + echo prepare >&9 && + echo "prepare: ok" >expected && + read line <out && + echo "$line" >actual && + test_cmp expected actual && + + # This must now fail given that we have locked the ref. + test_must_fail git update-ref refs/heads/flush $B 2>stderr && + grep "fatal: update_ref failed for ref ${SQ}refs/heads/flush${SQ}: cannot lock ref" stderr && + + echo commit >&9 && + echo "commit: ok" >expected && + read line <out && + echo "$line" >actual && + test_cmp expected actual +' + test_expect_success 'directory not created deleting packed ref' ' git branch d1/d2/r1 HEAD && git pack-refs --all && |