From: Thiago Farina Date: Mon, 16 May 2011 13:03:46 GMT Subject: Re: [PATCH 08/11] streaming_write_entry(): support files with holes Message-ID: In-Reply-To: <1305505831-31587-9-git-send-email-gitster@pobox.com> On Sun, May 15, 2011 at 9:30 PM, Junio C Hamano wrote: > 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 > --- >  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 (( > +            || 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 >