Code

do not stream large files to pack when filters are in use
authorJeff King <peff@peff.net>
Fri, 24 Feb 2012 22:10:17 +0000 (17:10 -0500)
committerJunio C Hamano <gitster@pobox.com>
Fri, 24 Feb 2012 22:18:20 +0000 (14:18 -0800)
commit4f22b1015d4203ccdf2b66f27ee5946504342ace
treef9d35c08590a1cac42e16466b110acaf9d1c7dfe
parent4c3b57b98bccfdb740b8f1d0ca574dd51deacfad
do not stream large files to pack when filters are in use

Because git's object format requires us to specify the
number of bytes in the object in its header, we must know
the size before streaming a blob into the object database.
This is not a problem when adding a regular file, as we can
get the size from stat(). However, when filters are in use
(such as autocrlf, or the ident, filter, or eol
gitattributes), we have no idea what the ultimate size will
be.

The current code just punts on the whole issue and ignores
filter configuration entirely for files larger than
core.bigfilethreshold. This can generate confusing results
if you use filters for large binary files, as the filter
will suddenly stop working as the file goes over a certain
size.  Rather than try to handle unknown input sizes with
streaming, this patch just turns off the streaming
optimization when filters are in use.

This has a slight performance regression in a very specific
case: if you have autocrlf on, but no gitattributes, a large
binary file will avoid the streaming code path because we
don't know beforehand whether it will need conversion or
not. But if you are handling large binary files, you should
be marking them as such via attributes (or at least not
using autocrlf, and instead marking your text files as
such). And the flip side is that if you have a large
_non_-binary file, there is a correctness improvement;
before we did not apply the conversion at all.

The first half of the new t1051 script covers these failures
on input. The second half tests the matching output code
paths. These already work correctly, and do not need any
adjustment.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
sha1_file.c
t/t1051-large-conversion.sh [new file with mode: 0755]