Am 30.04.2012 06:57, schrieb Nguyễn Thái Ngọc Duy: > > Signed-off-by: Nguyễn Thái Ngọc Duy<pclouds@xxxxxxxxx> > --- > archive-tar.c | 38 +++++++++++++++++++++++++++++++++++--- > t/t1050-large.sh | 4 ++++ > 2 files changed, 39 insertions(+), 3 deletions(-) > > diff --git a/archive-tar.c b/archive-tar.c > index 61821f4..865ef6d 100644 > --- a/archive-tar.c > +++ b/archive-tar.c > @@ -4,6 +4,7 @@ > #include "cache.h" > #include "tar.h" > #include "archive.h" > +#include "streaming.h" > #include "run-command.h" > > #define RECORDSIZE (512) > @@ -62,6 +63,29 @@ static void write_blocked(const void *data, unsigned long size) > write_if_needed(); > } > > +static int stream_blob_to_file(const unsigned char *sha1) > +{ > + struct git_istream *st; > + enum object_type type; > + unsigned long sz; > + > + st = open_istream(sha1,&type,&sz, NULL); > + if (!st) > + return error("cannot stream blob %s", sha1_to_hex(sha1)); > + for (;;) { > + char buf[BLOCKSIZE]; > + ssize_t readlen; > + > + readlen = read_istream(st, buf, sizeof(buf)); > + > + if (readlen <= 0) > + return readlen; > + write_blocked(buf, readlen); > + } > + close_istream(st); > + return 0; > +} The stream is never closed. Perhaps squash this in? diff --git a/archive-tar.c b/archive-tar.c index 506c8cb..6109fd3 100644 --- a/archive-tar.c +++ b/archive-tar.c @@ -66,6 +66,7 @@ static void write_blocked(const void *data, unsigned long size) static int stream_blob_to_file(const unsigned char *sha1) { struct git_istream *st; + ssize_t readlen; enum object_type type; unsigned long sz; @@ -74,16 +75,15 @@ static int stream_blob_to_file(const unsigned char *sha1) return error("cannot stream blob %s", sha1_to_hex(sha1)); for (;;) { char buf[BLOCKSIZE]; - ssize_t readlen; readlen = read_istream(st, buf, sizeof(buf)); if (readlen <= 0) - return readlen; + break; write_blocked(buf, readlen); } close_istream(st); - return 0; + return readlen; } /* -- 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