summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Jeff King <peff@peff.net>2009-09-02 02:36:47 -0400
committerLibravatar Junio C Hamano <gitster@pobox.com>2009-09-02 18:39:02 -0700
commit12d4996622f524e61cbf855b32600150a8c94c02 (patch)
treea4370304dd770fb01e7673b2d98d35052268b476
parentFix overridable written with an extra 'e' (diff)
downloadtgif-12d4996622f524e61cbf855b32600150a8c94c02.tar.xz
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 <peff@peff.net> Acked-by: Daniel Barkalow <barkalow@iabervon.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin-clone.c4
-rwxr-xr-xt/t5601-clone.sh6
2 files changed, 7 insertions, 3 deletions
diff --git a/builtin-clone.c b/builtin-clone.c
index c338910b1c..1c1d729117 100644
--- a/builtin-clone.c
+++ b/builtin-clone.c
@@ -600,8 +600,10 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
option_no_checkout = 1;
}
- if (transport)
+ if (transport) {
transport_unlock_pack(transport);
+ transport_disconnect(transport);
+ }
if (!option_no_checkout) {
struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh
index 44793f2eee..c3ffc8f15c 100755
--- a/t/t5601-clone.sh
+++ b/t/t5601-clone.sh
@@ -149,11 +149,13 @@ test_expect_success 'clone a void' '
(
cd src-0 && git init
) &&
- git clone src-0 target-6 &&
+ git clone "file://$(pwd)/src-0" target-6 2>err-6 &&
+ ! grep "fatal:" err-6 &&
(
cd src-0 && test_commit A
) &&
- git clone src-0 target-7 &&
+ git clone "file://$(pwd)/src-0" target-7 2>err-7 &&
+ ! grep "fatal:" err-7 &&
# There is no reason to insist they are bit-for-bit
# identical, but this test should suffice for now.
test_cmp target-6/.git/config target-7/.git/config