show-index.con commit init: kill set_git_dir_init() (1bd1907)
   1#include "cache.h"
   2#include "pack.h"
   3
   4static const char show_index_usage[] =
   5"git show-index";
   6
   7int main(int argc, char **argv)
   8{
   9        int i;
  10        unsigned nr;
  11        unsigned int version;
  12        static unsigned int top_index[256];
  13
  14        git_setup_gettext();
  15
  16        if (argc != 1)
  17                usage(show_index_usage);
  18        if (fread(top_index, 2 * 4, 1, stdin) != 1)
  19                die("unable to read header");
  20        if (top_index[0] == htonl(PACK_IDX_SIGNATURE)) {
  21                version = ntohl(top_index[1]);
  22                if (version < 2 || version > 2)
  23                        die("unknown index version");
  24                if (fread(top_index, 256 * 4, 1, stdin) != 1)
  25                        die("unable to read index");
  26        } else {
  27                version = 1;
  28                if (fread(&top_index[2], 254 * 4, 1, stdin) != 1)
  29                        die("unable to read index");
  30        }
  31        nr = 0;
  32        for (i = 0; i < 256; i++) {
  33                unsigned n = ntohl(top_index[i]);
  34                if (n < nr)
  35                        die("corrupt index file");
  36                nr = n;
  37        }
  38        if (version == 1) {
  39                for (i = 0; i < nr; i++) {
  40                        unsigned int offset, entry[6];
  41
  42                        if (fread(entry, 4 + 20, 1, stdin) != 1)
  43                                die("unable to read entry %u/%u", i, nr);
  44                        offset = ntohl(entry[0]);
  45                        printf("%u %s\n", offset, sha1_to_hex((void *)(entry+1)));
  46                }
  47        } else {
  48                unsigned off64_nr = 0;
  49                struct {
  50                        unsigned char sha1[20];
  51                        uint32_t crc;
  52                        uint32_t off;
  53                } *entries;
  54                ALLOC_ARRAY(entries, nr);
  55                for (i = 0; i < nr; i++)
  56                        if (fread(entries[i].sha1, 20, 1, stdin) != 1)
  57                                die("unable to read sha1 %u/%u", i, nr);
  58                for (i = 0; i < nr; i++)
  59                        if (fread(&entries[i].crc, 4, 1, stdin) != 1)
  60                                die("unable to read crc %u/%u", i, nr);
  61                for (i = 0; i < nr; i++)
  62                        if (fread(&entries[i].off, 4, 1, stdin) != 1)
  63                                die("unable to read 32b offset %u/%u", i, nr);
  64                for (i = 0; i < nr; i++) {
  65                        uint64_t offset;
  66                        uint32_t off = ntohl(entries[i].off);
  67                        if (!(off & 0x80000000)) {
  68                                offset = off;
  69                        } else {
  70                                uint32_t off64[2];
  71                                if ((off & 0x7fffffff) != off64_nr)
  72                                        die("inconsistent 64b offset index");
  73                                if (fread(off64, 8, 1, stdin) != 1)
  74                                        die("unable to read 64b offset %u", off64_nr);
  75                                offset = (((uint64_t)ntohl(off64[0])) << 32) |
  76                                                     ntohl(off64[1]);
  77                                off64_nr++;
  78                        }
  79                        printf("%" PRIuMAX " %s (%08"PRIx32")\n",
  80                               (uintmax_t) offset,
  81                               sha1_to_hex(entries[i].sha1),
  82                               ntohl(entries[i].crc));
  83                }
  84                free(entries);
  85        }
  86        return 0;
  87}