quickfetch(): Prevent overflow of the rev-list command line
authorJohan Herland <johan@herland.net>
Thu, 9 Jul 2009 23:52:30 +0000 (01:52 +0200)
committerJunio C Hamano <gitster@pobox.com>
Sat, 11 Jul 2009 06:53:17 +0000 (23:53 -0700)
commitd9eb0205a217984f3e70bf18ae66c02a22d3d475
tree5c8b9b3ffdea99b34ee6f1ef3f9eeed7eafe0f3e
parent7c74ff50626faca2fd302d83610494dd9106896d
quickfetch(): Prevent overflow of the rev-list command line

quickfetch() calls rev-list to check whether the objects we are about to
fetch are already present in the repo (if so, we can skip the object fetch).
However, when there are many (~1000) refs to be fetched, the rev-list
command line grows larger than the maximum command line size on some systems
(32K in Windows). This causes rev-list to fail, making quickfetch() return
non-zero, which unnecessarily triggers the transport machinery. This somehow
causes fetch to fail with an exit code.

By using the --stdin option to rev-list (and feeding the object list to its
standard input), we prevent the overflow of the rev-list command line,
which causes quickfetch(), and subsequently the overall fetch, to succeed.

However, using rev-list --stdin is not entirely straightforward: rev-list
terminates immediately when encountering an unknown object, which can
trigger SIGPIPE if we are still writing object's to its standard input.
We therefore temporarily ignore SIGPIPE so that the fetch process is not
terminated.

The patch also contains a testcase to verify the fix (note that before
the patch, the testcase would only fail on msysGit).

Signed-off-by: Johan Herland <johan@herland.net>
Improved-by: Johannes Sixt <j6t@kdbg.org>
Improved-by: Alex Riesen <raa.lkml@gmail.com>
Tested-by: Peter Krefting <peter@softwolves.pp.se>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin-fetch.c
t/t5502-quickfetch.sh