root/show-index.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. main

#include "cache.h"
#include "pack.h"

static const char show_index_usage[] =
"git show-index";

int main(int argc, char **argv)
{
        int i;
        unsigned nr;
        unsigned int version;
        static unsigned int top_index[256];

        git_setup_gettext();

        if (argc != 1)
                usage(show_index_usage);
        if (fread(top_index, 2 * 4, 1, stdin) != 1)
                die("unable to read header");
        if (top_index[0] == htonl(PACK_IDX_SIGNATURE)) {
                version = ntohl(top_index[1]);
                if (version < 2 || version > 2)
                        die("unknown index version");
                if (fread(top_index, 256 * 4, 1, stdin) != 1)
                        die("unable to read index");
        } else {
                version = 1;
                if (fread(&top_index[2], 254 * 4, 1, stdin) != 1)
                        die("unable to read index");
        }
        nr = 0;
        for (i = 0; i < 256; i++) {
                unsigned n = ntohl(top_index[i]);
                if (n < nr)
                        die("corrupt index file");
                nr = n;
        }
        if (version == 1) {
                for (i = 0; i < nr; i++) {
                        unsigned int offset, entry[6];

                        if (fread(entry, 4 + 20, 1, stdin) != 1)
                                die("unable to read entry %u/%u", i, nr);
                        offset = ntohl(entry[0]);
                        printf("%u %s\n", offset, sha1_to_hex((void *)(entry+1)));
                }
        } else {
                unsigned off64_nr = 0;
                struct {
                        unsigned char sha1[20];
                        uint32_t crc;
                        uint32_t off;
                } *entries = xmalloc(nr * sizeof(entries[0]));
                for (i = 0; i < nr; i++)
                        if (fread(entries[i].sha1, 20, 1, stdin) != 1)
                                die("unable to read sha1 %u/%u", i, nr);
                for (i = 0; i < nr; i++)
                        if (fread(&entries[i].crc, 4, 1, stdin) != 1)
                                die("unable to read crc %u/%u", i, nr);
                for (i = 0; i < nr; i++)
                        if (fread(&entries[i].off, 4, 1, stdin) != 1)
                                die("unable to read 32b offset %u/%u", i, nr);
                for (i = 0; i < nr; i++) {
                        uint64_t offset;
                        uint32_t off = ntohl(entries[i].off);
                        if (!(off & 0x80000000)) {
                                offset = off;
                        } else {
                                uint32_t off64[2];
                                if ((off & 0x7fffffff) != off64_nr)
                                        die("inconsistent 64b offset index");
                                if (fread(off64, 8, 1, stdin) != 1)
                                        die("unable to read 64b offset %u", off64_nr);
                                offset = (((uint64_t)ntohl(off64[0])) << 32) |
                                                     ntohl(off64[1]);
                                off64_nr++;
                        }
                        printf("%" PRIuMAX " %s (%08"PRIx32")\n",
                               (uintmax_t) offset,
                               sha1_to_hex(entries[i].sha1),
                               ntohl(entries[i].crc));
                }
                free(entries);
        }
        return 0;
}

/* [<][>][^][v][top][bottom][index][help] */