builtin/show-index: provide options to determine hash algo

show-index is capable of reading any possible index file whether or not
the index is inside a repository.  However, because our index files lack
metadata about the hash algorithm in use, it's not possible to
autodetect the algorithm that a particular index file is using.

In order to allow us to read index files of any algorithm, let's set up
the .git directory gently so that we default to the algorithm for the
current repository, and add an --object-format option to allow users to
override this setting and continue to run show-index outside of a
repository altogether.  Let's also document this new option so that
people can find it and use it.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
brian m. carlson 2020-05-25 19:59:12 +00:00 коммит произвёл Junio C Hamano
Родитель 1610dda8ae
Коммит 88a09a557c
3 изменённых файлов: 35 добавлений и 7 удалений

Просмотреть файл

@ -9,7 +9,7 @@ git-show-index - Show packed archive index
SYNOPSIS SYNOPSIS
-------- --------
[verse] [verse]
'git show-index' 'git show-index' [--object-format=<hash-algorithm>]
DESCRIPTION DESCRIPTION
@ -36,6 +36,15 @@ Note that you can get more information on a packfile by calling
linkgit:git-verify-pack[1]. However, as this command considers only the linkgit:git-verify-pack[1]. However, as this command considers only the
index file itself, it's both faster and more flexible. index file itself, it's both faster and more flexible.
OPTIONS
-------
--object-format=<hash-algorithm>::
Specify the given object format (hash algorithm) for the index file. The
valid values are 'sha1' and (if enabled) 'sha256'. The default is the
algorithm for the current repository (set by `extensions.objectFormat`), or
'sha1' if no value is set or outside a repository..
GIT GIT
--- ---
Part of the linkgit:git[1] suite Part of the linkgit:git[1] suite

Просмотреть файл

@ -1,9 +1,12 @@
#include "builtin.h" #include "builtin.h"
#include "cache.h" #include "cache.h"
#include "pack.h" #include "pack.h"
#include "parse-options.h"
static const char show_index_usage[] = static const char *const show_index_usage[] = {
"git show-index"; "git show-index [--object-format=<hash-algorithm>]",
NULL
};
int cmd_show_index(int argc, const char **argv, const char *prefix) int cmd_show_index(int argc, const char **argv, const char *prefix)
{ {
@ -11,10 +14,26 @@ int cmd_show_index(int argc, const char **argv, const char *prefix)
unsigned nr; unsigned nr;
unsigned int version; unsigned int version;
static unsigned int top_index[256]; static unsigned int top_index[256];
const unsigned hashsz = the_hash_algo->rawsz; unsigned hashsz;
const char *hash_name = NULL;
int hash_algo;
const struct option show_index_options[] = {
OPT_STRING(0, "object-format", &hash_name, N_("hash-algorithm"),
N_("specify the hash algorithm to use")),
OPT_END()
};
argc = parse_options(argc, argv, prefix, show_index_options, show_index_usage, 0);
if (hash_name) {
hash_algo = hash_algo_by_name(hash_name);
if (hash_algo == GIT_HASH_UNKNOWN)
die(_("Unknown hash algorithm"));
repo_set_hash_algo(the_repository, hash_algo);
}
hashsz = the_hash_algo->rawsz;
if (argc != 1)
usage(show_index_usage);
if (fread(top_index, 2 * 4, 1, stdin) != 1) if (fread(top_index, 2 * 4, 1, stdin) != 1)
die("unable to read header"); die("unable to read header");
if (top_index[0] == htonl(PACK_IDX_SIGNATURE)) { if (top_index[0] == htonl(PACK_IDX_SIGNATURE)) {

2
git.c
Просмотреть файл

@ -573,7 +573,7 @@ static struct cmd_struct commands[] = {
{ "shortlog", cmd_shortlog, RUN_SETUP_GENTLY | USE_PAGER }, { "shortlog", cmd_shortlog, RUN_SETUP_GENTLY | USE_PAGER },
{ "show", cmd_show, RUN_SETUP }, { "show", cmd_show, RUN_SETUP },
{ "show-branch", cmd_show_branch, RUN_SETUP }, { "show-branch", cmd_show_branch, RUN_SETUP },
{ "show-index", cmd_show_index }, { "show-index", cmd_show_index, RUN_SETUP_GENTLY },
{ "show-ref", cmd_show_ref, RUN_SETUP }, { "show-ref", cmd_show_ref, RUN_SETUP },
{ "sparse-checkout", cmd_sparse_checkout, RUN_SETUP | NEED_WORK_TREE }, { "sparse-checkout", cmd_sparse_checkout, RUN_SETUP | NEED_WORK_TREE },
{ "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE }, { "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE },