Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to