Re: [PATCH 4/5] archive-tar: stream large blobs to tar file
Am 30.04.2012 06:57, schrieb Nguyễn Thái Ngọc Duy:
Show 45 quoted lines
>
> Signed-off-by: Nguyễn Thái Ngọc Duy<pclouds@gmail.com>
> ---
> 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;
}
/*