On Sun, May 15, 2011 at 9:30 PM, Junio C Hamano <gitster@xxxxxxxxx> 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 <gitster@xxxxxxxxx> > --- > Â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@xxxxxxxxxxxxxxx > More majordomo info at Âhttp://vger.kernel.org/majordomo-info.html > ÿô.nÇ·®+%˱é¥wÿº{.nÇ· ßØnr¡öë¨è&£ûz¹Þúzf£¢·h§~Ûÿÿïÿê_èæ+v¨þ)ßø