Merge branch 'jk/show-index'
authorJunio C Hamano <gitster@pobox.com>
Mon, 25 Jun 2018 20:22:37 +0000 (13:22 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 25 Jun 2018 20:22:37 +0000 (13:22 -0700)
Modernize a less often used command.

* jk/show-index:
show-index: update documentation for index v2
make show-index a builtin

Documentation/git-show-index.txt
Makefile
builtin.h
builtin/show-index.c [new file with mode: 0644]
git.c
show-index.c [deleted file]
index a8a9509e0eb0bb416ce0a32f76c964a505da8f61..424e4ba84cf9b0444a41f0a163de0a58a6ac378a 100644 (file)
@@ -14,13 +14,27 @@ SYNOPSIS
 
 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
 ---
index e4b503d259906d60a65204248aeb54962b12c062..edba22955271fec370d9eba4bcb85069c8de39a6 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -689,7 +689,6 @@ PROGRAM_OBJS += http-backend.o
 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
@@ -1077,6 +1076,7 @@ BUILTIN_OBJS += builtin/send-pack.o
 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
index 4e0f64723ed8dde9c97827cc688535b2dda73025..0362f1ce25fb64631e28f00eafa46f35bc94c7eb 100644 (file)
--- a/builtin.h
+++ b/builtin.h
@@ -220,6 +220,7 @@ extern int cmd_serve(int argc, const char **argv, const char *prefix);
 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);
diff --git a/builtin/show-index.c b/builtin/show-index.c
new file mode 100644 (file)
index 0000000..a6e6788
--- /dev/null
@@ -0,0 +1,86 @@
+#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;
+}
diff --git a/git.c b/git.c
index c2f48d53dd4aaba0752aa5f2e6633242d320b248..9dbe6ffaa7f04ceba22b215a221b9a389d0cad97 100644 (file)
--- a/git.c
+++ b/git.c
@@ -537,6 +537,7 @@ static struct cmd_struct commands[] = {
        { "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 },
diff --git a/show-index.c b/show-index.c
deleted file mode 100644 (file)
index 1ead41e..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-#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;
-}