Re: [PATCH 08/11] streaming_write_entry(): support files with holes
On Sun, May 15, 2011 at 9:30 PM, Junio C Hamano <gitster@pobox.com> wrote:
Show 49 quoted lines
> One typical use of a large binary file is to hold a sparse on-disk hash
> table with a lot of holes. Help preserving the holes with lseek().
>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> ---
> entry.c | 18 +++++++++++++++++-
> 1 files changed, 17 insertions(+), 1 deletions(-)
>
> diff --git a/entry.c b/entry.c
> index 7733a6b..d50e388 100644
> --- a/entry.c
> +++ b/entry.c
> @@ -123,6 +123,7 @@ static int streaming_write_entry(struct cache_entry *ce, char *path,
> enum object_type type;
> unsigned long sz;
> int result = -1;
> + ssize_t kept = 0;
> int fd = -1;
>
> st = open_istream(ce->sha1, &type, &sz);
> @@ -137,17 +138,32 @@ static int streaming_write_entry(struct cache_entry *ce, char *path,
>
> for (;;) {
> char buf[10240];
> - ssize_t wrote;
> + ssize_t wrote, holeto;
> ssize_t readlen = read_istream(st, buf, sizeof(buf));
>
> if (!readlen)
> break;
> + for (holeto = 0; holeto < readlen; holeto++)
> + if (buf[holeto])
> + break;
> + if (readlen == holeto) {
> + kept += holeto;
> + continue;
> + }
>
> + if (kept && lseek(fd, kept, SEEK_CUR) == (off_t) -1)
> + goto close_and_exit;
> + else
> + kept = 0;
> wrote = write_in_full(fd, buf, readlen);
>
> if (wrote != readlen)
> goto close_and_exit;
> }
> + if (kept &&
> + (( lseek(fd, kept - 1, SEEK_CUR) == (off_t) -1)There is an extra whitespace after ((
Show 13 quoted lines
> + || write(fd, "", 1) != 1))
> + goto close_and_exit;
> *fstat_done = fstat_output(fd, state, statbuf);
>
> close_and_exit:
> --
> 1.7.5.1.365.g32b65
>
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>