diff options
author | Junio C Hamano <gitster@pobox.com> | 2011-05-20 14:33:31 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-05-26 16:47:15 -0700 |
commit | b6691092d707860019bbab80eaaf9173ada10586 (patch) | |
tree | b9e7e80502085bb9237a4d1726afb38a36fb5ba8 /entry.c | |
parent | d1bf0e08313927c269846476f99f59d878807371 (diff) | |
download | git-b6691092d707860019bbab80eaaf9173ada10586.tar.gz |
Add streaming filter API
This introduces an API to plug custom filters to an input stream.
The caller gets get_stream_filter("path") to obtain an appropriate
filter for the path, and then uses it when opening an input stream
via open_istream(). After that, the caller can read from the stream
with read_istream(), and close it with close_istream(), just like an
unfiltered stream.
This only adds a "null" filter that is a pass-thru filter, but later
changes can add LF-to-CRLF and other filters, and the callers of the
streaming API do not have to change.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'entry.c')
-rw-r--r-- | entry.c | 16 |
1 files changed, 10 insertions, 6 deletions
@@ -116,6 +116,7 @@ static int fstat_output(int fd, const struct checkout *state, struct stat *st) } static int streaming_write_entry(struct cache_entry *ce, char *path, + struct stream_filter *filter, const struct checkout *state, int to_tempfile, int *fstat_done, struct stat *statbuf) { @@ -126,7 +127,7 @@ static int streaming_write_entry(struct cache_entry *ce, char *path, ssize_t kept = 0; int fd = -1; - st = open_istream(ce->sha1, &type, &sz); + st = open_istream(ce->sha1, &type, &sz, filter); if (!st) return -1; if (type != OBJ_BLOB) @@ -186,11 +187,14 @@ static int write_entry(struct cache_entry *ce, char *path, const struct checkout size_t wrote, newsize = 0; struct stat st; - if ((ce_mode_s_ifmt == S_IFREG) && - can_bypass_conversion(path) && - !streaming_write_entry(ce, path, state, to_tempfile, - &fstat_done, &st)) - goto finish; + 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; + } switch (ce_mode_s_ifmt) { case S_IFREG: |