Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]>
---
builtin/index-pack.c | 62 +++++++++++++++++++++++++++++++---------------------
1 file changed, 37 insertions(+), 25 deletions(-)
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index a47cc34..0dd7193 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -429,33 +429,19 @@ static int is_delta_type(enum object_type type)
return (type == OBJ_REF_DELTA || type == OBJ_OFS_DELTA);
}
-static void *unpack_entry_data(unsigned long offset, unsigned long size,
- enum object_type type, unsigned char *sha1)
+static void read_and_inflate(unsigned long offset,
+ void *buf, unsigned long size,
+ unsigned long wraparound,
+ git_SHA_CTX *ctx,
+ unsigned char *sha1)
{
- static char fixed_buf[8192];
- int status;
git_zstream stream;
- void *buf;
- git_SHA_CTX c;
- char hdr[32];
- int hdrlen;
-
- if (!is_delta_type(type)) {
- hdrlen = sprintf(hdr, "%s %lu", typename(type), size) + 1;
- git_SHA1_Init(&c);
- git_SHA1_Update(&c, hdr, hdrlen);
- } else
- sha1 = NULL;
- if (is_delta_type(type) ||
- (type == OBJ_BLOB && size > big_file_threshold))
- buf = fixed_buf;
- else
- buf = xmalloc(size);
+ int status;
memset(&stream, 0, sizeof(stream));
git_inflate_init(&stream);
stream.next_out = buf;
- stream.avail_out = buf == fixed_buf ? sizeof(fixed_buf) : size;
+ stream.avail_out = wraparound ? wraparound : size;
do {
unsigned char *last_out = stream.next_out;
@@ -464,17 +450,43 @@ static void *unpack_entry_data(unsigned long offset,
unsigned long size,
status = git_inflate(&stream, 0);
use(input_len - stream.avail_in);
if (sha1)
- git_SHA1_Update(&c, last_out, stream.next_out -
last_out);
- if (buf == fixed_buf) {
+ git_SHA1_Update(ctx, last_out, stream.next_out -
last_out);
+ if (wraparound) {
stream.next_out = buf;
- stream.avail_out = sizeof(fixed_buf);
+ stream.avail_out = wraparound;
}
} while (status == Z_OK);
if (stream.total_out != size || status != Z_STREAM_END)
bad_object(offset, _("inflate returned %d"), status);
git_inflate_end(&stream);
if (sha1)
- git_SHA1_Final(sha1, &c);
+ git_SHA1_Final(sha1, ctx);
+}
+
+static void *unpack_entry_data(unsigned long offset, unsigned long size,
+ enum object_type type, unsigned char *sha1)
+{
+ static char fixed_buf[8192];
+ void *buf;
+ git_SHA_CTX c;
+ char hdr[32];
+ int hdrlen;
+
+ if (!is_delta_type(type)) {
+ hdrlen = sprintf(hdr, "%s %lu", typename(type), size) + 1;
+ git_SHA1_Init(&c);
+ git_SHA1_Update(&c, hdr, hdrlen);
+ } else
+ sha1 = NULL;
+ if (is_delta_type(type) ||
+ (type == OBJ_BLOB && size > big_file_threshold))
+ buf = fixed_buf;
+ else
+ buf = xmalloc(size);
+
+ read_and_inflate(offset, buf, size,
+ buf == fixed_buf ? sizeof(fixed_buf) : 0,
+ &c, sha1);
return buf == fixed_buf ? NULL : buf;
}
--
1.8.2.83.gc99314b
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html