Junio C Hamano [off-list ref] writes:
Jeff King [off-list ref] writes:
quoted
Thoughts? Was this intentional, or just overlooked?
It is a bit curious that anything filtered even goes to the streaming
codepath, given this piece of code in write_entry() in entry.c:
if (ce_mode_s_ifmt == S_IFREG) {
struct stream_filter *filter = get_stream_filter(path, ce->sha1);
if (filter &&
!streaming_write_entry(ce, path, filter,
state, to_tempfile,
&fstat_done, &st))
goto finish;
}
and get_stream_filter() in convert.c has an explicit exception for this
case at the very beginning:
struct stream_filter *get_stream_filter(const char *path, const unsigned char *sha1)
{
struct conv_attrs ca;
enum crlf_action crlf_action;
struct stream_filter *filter = NULL;
convert_attrs(&ca, path);
if (ca.drv && (ca.drv->smudge || ca.drv->clean))
return filter;
to make sure that it says "No streaming filtering is possible, do not even
attempt to call streaming_write_entry()".
On Thu, Feb 23, 2012 at 07:42:11PM -0800, Junio C Hamano wrote:
It is a bit curious that anything filtered even goes to the streaming
codepath, given this piece of code in write_entry() in entry.c:
if (ce_mode_s_ifmt == S_IFREG) {
struct stream_filter *filter = get_stream_filter(path, ce->sha1);
if (filter &&
!streaming_write_entry(ce, path, filter,
state, to_tempfile,
&fstat_done, &st))
goto finish;
}
and get_stream_filter() in convert.c has an explicit exception for this
case at the very beginning:
I think it is because we don't follow that code path at all. The stack trace
for "git add" looks on a large file looks like:
#0 stream_to_pack (...) at bulk-checkin.c:101
#1 deflate_to_pack (...) at bulk-checkin.c:219
#2 index_bulk_checkin (...) at bulk-checkin.c:258
#3 index_stream (...) at sha1_file.c:2712
#4 index_fd (...) at sha1_file.c:2726
#5 index_path (...) at sha1_file.c:2742
#6 add_to_index (...) at read-cache.c:644
#7 add_file_to_index (...) at read-cache.c:673
#8 add_files (...) at builtin/add.c:363
#9 cmd_add (...) at builtin/add.c:474
#10 run_builtin (...) at git.c:324
#11 handle_internal_command (...) at git.c:484
#12 run_argv (...) at git.c:530
#13 main (...) at git.c:605
Isn't write_entry the _other_ side of things. I.e., checking out, not
checking in? That side works fine (making the large file handling
for git-add even more odd. We will fail to apply the "clean" filter when
adding it, but we will apply the smudge filter when we write it out).
-Peff