From: Jeff King Date: Mon, 28 May 2018 09:38:53 +0000 (-0400) Subject: make show-index a builtin X-Git-Tag: v2.19.0-rc0~189^2~1 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/ff417260cf36a73b7cb39b40e6c81e5313e28b9b make show-index a builtin The git-show-index command is built as its own separate program. There's really no good reason for this, and it means we waste extra space on disk (and CPU time running the linker). Let's fold it in to the main binary as a builtin. The history here is actually a bit amusing. The program itself is mostly self-contained, and doesn't even use our normal pack index code. In a5031214c4 (slim down "git show-index", 2010-01-21), we even stopped using xmalloc() so that it could avoid libgit.a entirely. But then 040a655116 (cleanup: use internal memory allocation wrapper functions everywhere, 2011-10-06) switched that back to xmalloc, which later become ALLOC_ARRAY(). Making it a builtin should give us the best of both worlds: no wasted space and no need to avoid the usual patterns. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- diff --git a/Makefile b/Makefile index a1d8775adb..ebc1a57cd4 100644 --- a/Makefile +++ b/Makefile @@ -642,7 +642,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 += upload-pack.o PROGRAM_OBJS += remote-testsvn.o @@ -1019,6 +1018,7 @@ BUILTIN_OBJS += builtin/rm.o BUILTIN_OBJS += builtin/send-pack.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 diff --git a/builtin.h b/builtin.h index 42378f3aa4..feb559e582 100644 --- a/builtin.h +++ b/builtin.h @@ -218,6 +218,7 @@ extern int cmd_send_pack(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 index 0000000000..a6e678809e --- /dev/null +++ b/builtin/show-index.c @@ -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 ceaa58ef40..1a10c96375 100644 --- a/git.c +++ b/git.c @@ -464,6 +464,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 index 1ead41e211..0000000000 --- a/show-index.c +++ /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; -}