sha1_name: add get_sha1_with_context()
[gitweb.git] / pack-check.c
index 90c33b1b84ef793bf017927026863de41e31fa2c..395fb9527a3bc6dd8ca648233911a1c35604440d 100644 (file)
@@ -49,7 +49,7 @@ static int verify_packfile(struct packed_git *p,
        const unsigned char *index_base = p->index_data;
        git_SHA_CTX ctx;
        unsigned char sha1[20], *pack_sig;
-       off_t offset = 0, pack_sig_ofs = p->pack_size - 20;
+       off_t offset = 0, pack_sig_ofs = 0;
        uint32_t nr_objects, i;
        int err = 0;
        struct idx_entry *entries;
@@ -61,14 +61,16 @@ static int verify_packfile(struct packed_git *p,
         */
 
        git_SHA1_Init(&ctx);
-       while (offset < pack_sig_ofs) {
+       do {
                unsigned int remaining;
                unsigned char *in = use_pack(p, w_curs, offset, &remaining);
                offset += remaining;
+               if (!pack_sig_ofs)
+                       pack_sig_ofs = p->pack_size - 20;
                if (offset > pack_sig_ofs)
                        remaining -= (unsigned int)(offset - pack_sig_ofs);
                git_SHA1_Update(&ctx, in, remaining);
-       }
+       } while (offset < pack_sig_ofs);
        git_SHA1_Final(sha1, &ctx);
        pack_sig = use_pack(p, w_curs, pack_sig_ofs, NULL);
        if (hashcmp(sha1, pack_sig))
@@ -131,14 +133,13 @@ static int verify_packfile(struct packed_git *p,
        return err;
 }
 
-int verify_pack(struct packed_git *p)
+int verify_pack_index(struct packed_git *p)
 {
        off_t index_size;
        const unsigned char *index_base;
        git_SHA_CTX ctx;
        unsigned char sha1[20];
        int err = 0;
-       struct pack_window *w_curs = NULL;
 
        if (open_pack_index(p))
                return error("packfile %s index not opened", p->pack_name);
@@ -152,8 +153,18 @@ int verify_pack(struct packed_git *p)
        if (hashcmp(sha1, index_base + index_size - 20))
                err = error("Packfile index for %s SHA1 mismatch",
                            p->pack_name);
+       return err;
+}
+
+int verify_pack(struct packed_git *p)
+{
+       int err = 0;
+       struct pack_window *w_curs = NULL;
+
+       err |= verify_pack_index(p);
+       if (!p->index_data)
+               return -1;
 
-       /* Verify pack file */
        err |= verify_packfile(p, &w_curs);
        unuse_pack(&w_curs);