[PATCH] Add git-pack-ls-objects tool
From: Petr Baudis <hidden>
Date: 2016-06-15 22:42:17
Subsystem:
documentation, kernel build + files below scripts/ (unless maintained elsewhere), the rest · Maintainers:
Jonathan Corbet, Nathan Chancellor, Nicolas Schier, Linus Torvalds
This tool takes pack index on stdin and produces the list of indexed objects on stdout. Very simple, but I've been always somewhat nervous that I cannot list all (even unreferenced) objects in a repository, and in a given pack in particular. The immediate use will be in the git-count-objects script, but I can imagine it being useful also in various troubleshooting situations. Signed-off-by: Petr Baudis <redacted> --- Documentation/git-pack-ls-objects.txt | 32 ++++++++++++++++++++++++++++++++ Makefile | 2 +- pack-ls-objects.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletions(-)
diff --git a/Documentation/git-pack-ls-objects.txt b/Documentation/git-pack-ls-objects.txt
new file mode 100644
index 0000000..bf2a4a4
--- /dev/null
+++ b/Documentation/git-pack-ls-objects.txt@@ -0,0 +1,32 @@ +git-pack-ls-objects(1) +====================== + +NAME +---- +git-pack-ls-objects - List objects in a pack based on its index + + +SYNOPSIS +-------- +'git-pack-ls-objects' < pack-index + + +DESCRIPTION +----------- +Reads a packed archive index (.idx) from its standard input and +produces the list of indexed objects (that is, the objects packed +in the corresponding .pack file) on its standard output. + + +Author +------ +Written by Petr Baudis <pasky@suse.cz> + +Documentation +------------- +Documentation by Petr Baudis + +GIT +--- +Part of the gitlink:git[7] suite +
diff --git a/Makefile b/Makefile
index a291bb1..7c54507 100644
--- a/Makefile
+++ b/Makefile@@ -143,7 +143,7 @@ PROGRAMS = \ git-upload-pack$X git-verify-pack$X git-write-tree$X \ git-update-ref$X git-symbolic-ref$X git-check-ref-format$X \ git-name-rev$X git-pack-redundant$X git-repo-config$X git-var$X \ - git-describe$X + git-describe$X git-pack-ls-objects$X # what 'all' will build and 'install' will install, in gitexecdir ALL_PROGRAMS = $(PROGRAMS) $(SIMPLE_PROGRAMS) $(SCRIPTS)
diff --git a/pack-ls-objects.c b/pack-ls-objects.c
new file mode 100644
index 0000000..caee59c
--- /dev/null
+++ b/pack-ls-objects.c@@ -0,0 +1,31 @@ +/* + * GIT - The information manager from hell + * + * Copyright (C) Petr Baudis, 2006 + */ + +#include <stdio.h> +#include "cache.h" + +static const char pack_usage[] = "git-pack-ls-objects < pack-idx"; + +int main(int argc, char **argv) +{ + unsigned char buf[1024]; + unsigned char entry[24]; + + if (argc > 1) + usage(pack_usage); + + /* We are doing these charades because we do not want to print + * the last sha1. */ + + if (!fread(buf, 256 * 4, 1, stdin) || !fread(entry, 24, 1, stdin)) + die("invalid pack index"); + + while (fread(buf, 24, 1, stdin)) { + printf("%s\n", sha1_to_hex(entry + 4)); + memcpy(entry, buf, 24); + } + return 0; +}