Modernize a less often used command.
* jk/show-index:
show-index: update documentation for index v2
make show-index a builtin
DESCRIPTION
-----------
-Read the idx file for a Git packfile created with
-'git pack-objects' command from the standard input, and
-dump its contents.
+Read the `.idx` file for a Git packfile (created with
+linkgit:git-pack-objects[1] or linkgit:git-index-pack[1]) from the
+standard input, and dump its contents. The output consists of one object
+per line, with each line containing two or three space-separated
+columns:
-The information it outputs is subset of what you can get from
-'git verify-pack -v'; this command only shows the packfile
-offset and SHA-1 of each object.
+ - the first column is the offset in bytes of the object within the
+ corresponding packfile
+
+ - the second column is the object id of the object
+
+ - if the index version is 2 or higher, the third column contains the
+ CRC32 of the object data
+
+The objects are output in the order in which they are found in the index
+file, which should be (in a correctly constructed file) sorted by object
+id.
+
+Note that you can get more information on a packfile by calling
+linkgit:git-verify-pack[1]. However, as this command considers only the
+index file itself, it's both faster and more flexible.
GIT
---
PROGRAM_OBJS += imap-send.o
PROGRAM_OBJS += sh-i18n--envsubst.o
PROGRAM_OBJS += shell.o
-PROGRAM_OBJS += show-index.o
PROGRAM_OBJS += remote-testsvn.o
# Binary suffix, set to .exe for Windows builds
BUILTIN_OBJS += builtin/serve.o
BUILTIN_OBJS += builtin/shortlog.o
BUILTIN_OBJS += builtin/show-branch.o
+BUILTIN_OBJS += builtin/show-index.o
BUILTIN_OBJS += builtin/show-ref.o
BUILTIN_OBJS += builtin/stripspace.o
BUILTIN_OBJS += builtin/submodule--helper.o
extern int cmd_shortlog(int argc, const char **argv, const char *prefix);
extern int cmd_show(int argc, const char **argv, const char *prefix);
extern int cmd_show_branch(int argc, const char **argv, const char *prefix);
+extern int cmd_show_index(int argc, const char **argv, const char *prefix);
extern int cmd_status(int argc, const char **argv, const char *prefix);
extern int cmd_stripspace(int argc, const char **argv, const char *prefix);
extern int cmd_submodule__helper(int argc, const char **argv, const char *prefix);
--- /dev/null
+#include "builtin.h"
+#include "cache.h"
+#include "pack.h"
+
+static const char show_index_usage[] =
+"git show-index";
+
+int cmd_show_index(int argc, const char **argv, const char *prefix)
+{
+ int i;
+ unsigned nr;
+ unsigned int version;
+ static unsigned int top_index[256];
+
+ 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;
+ ALLOC_ARRAY(entries, nr);
+ 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;
+}
{ "shortlog", cmd_shortlog, RUN_SETUP_GENTLY | USE_PAGER },
{ "show", cmd_show, RUN_SETUP },
{ "show-branch", cmd_show_branch, RUN_SETUP },
+ { "show-index", cmd_show_index },
{ "show-ref", cmd_show_ref, RUN_SETUP },
{ "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE },
{ "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },
+++ /dev/null
-#include "cache.h"
-#include "pack.h"
-
-static const char show_index_usage[] =
-"git show-index";
-
-int cmd_main(int argc, const char **argv)
-{
- int i;
- unsigned nr;
- unsigned int version;
- static unsigned int top_index[256];
-
- 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;
- ALLOC_ARRAY(entries, nr);
- 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;
-}