Skip to content

Commit 12d4996

Browse files
peffgitster
authored andcommitted
clone: disconnect transport after fetching
The current code just leaves the transport in whatever state it was in after performing the fetch. For a non-empty clone over the git protocol, the transport code already disconnects at the end of the fetch. But for an empty clone, we leave the connection hanging, and eventually close the socket when clone exits. This causes the remote upload-pack to complain "the remote end hung up unexpectedly". While this message is harmless to the clone itself, it is unnecessarily scary for a user to see and may pollute git-daemon logs. This patch just explicitly calls disconnect after we are done with the remote end, which sends a flush packet to upload-pack and cleanly disconnects, avoiding the error message. Other transports are unaffected or slightly improved: - for a non-empty repo over the git protocol, the second disconnect is a no-op (since we are no longer connected) - for "walker" transports (like HTTP or FTP), we actually free some used memory (which previously just sat until the clone process exits) - for "rsync", disconnect is always a no-op anyway Signed-off-by: Jeff King <[email protected]> Acked-by: Daniel Barkalow <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 9319789 commit 12d4996

File tree

2 files changed

+7
-3
lines changed

2 files changed

+7
-3
lines changed

builtin-clone.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -600,8 +600,10 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
600600
option_no_checkout = 1;
601601
}
602602

603-
if (transport)
603+
if (transport) {
604604
transport_unlock_pack(transport);
605+
transport_disconnect(transport);
606+
}
605607

606608
if (!option_no_checkout) {
607609
struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));

t/t5601-clone.sh

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,13 @@ test_expect_success 'clone a void' '
149149
(
150150
cd src-0 && git init
151151
) &&
152-
git clone src-0 target-6 &&
152+
git clone "file://$(pwd)/src-0" target-6 2>err-6 &&
153+
! grep "fatal:" err-6 &&
153154
(
154155
cd src-0 && test_commit A
155156
) &&
156-
git clone src-0 target-7 &&
157+
git clone "file://$(pwd)/src-0" target-7 2>err-7 &&
158+
! grep "fatal:" err-7 &&
157159
# There is no reason to insist they are bit-for-bit
158160
# identical, but this test should suffice for now.
159161
test_cmp target-6/.git/config target-7/.git/config

0 commit comments

Comments
 (0)