index-pack: --fsck-objects to take an optional argument for fsck msgs

git-index-pack has a --strict option that can take an optional argument
to provide a list of fsck issues to change their severity.
--fsck-objects does not have such a utility, which would be useful if
one would like to be more lenient or strict on data integrity in a
repository.

Like --strict, allow --fsck-objects to also take a list of fsck msgs to
change the severity.

Remove the "For internal use only" note for --fsck-objects, and document
the option. This won't often be used by the normal end user, but it
turns out it is useful for Git forges like GitLab.

Reviewed-by: Christian Couder <christian.couder@gmail.com>
Signed-off-by: John Cai <johncai86@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
John Cai 2024-02-01 01:38:02 +00:00 committed by Junio C Hamano
parent 2811019f47
commit 0f8edf7317
3 changed files with 38 additions and 13 deletions

View file

@ -96,13 +96,18 @@ default and "Indexing objects" when `--stdin` is specified.
--check-self-contained-and-connected:: --check-self-contained-and-connected::
Die if the pack contains broken links. For internal use only. Die if the pack contains broken links. For internal use only.
--fsck-objects:: --fsck-objects[=<msg-id>=<severity>...]::
For internal use only. Die if the pack contains broken objects, but unlike `--strict`, don't
choke on broken links. If the pack contains a tree pointing to a
.gitmodules blob that does not exist, prints the hash of that blob
(for the caller to check) after the hash that goes into the name of the
pack/idx file (see "Notes").
+ +
Die if the pack contains broken objects. If the pack contains a tree An optional comma-separated list of `<msg-id>=<severity>` can be passed to
pointing to a .gitmodules blob that does not exist, prints the hash of change the severity of some possible issues, e.g.,
that blob (for the caller to check) after the hash that goes into the `--fsck-objects="missingEmail=ignore,badTagName=ignore"`. See the entry for the
name of the pack/idx file (see "Notes"). `fsck.<msg-id>` configuration options in linkgit:git-fsck[1] for more
information on the possible values of `<msg-id>` and `<severity>`.
--threads=<n>:: --threads=<n>::
Specifies the number of threads to spawn when resolving Specifies the number of threads to spawn when resolving

View file

@ -26,7 +26,7 @@
#include "setup.h" #include "setup.h"
static const char index_pack_usage[] = static const char index_pack_usage[] =
"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict[=<msg-id>=<severity>...]] (<pack-file> | --stdin [--fix-thin] [<pack-file>])"; "git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict[=<msg-id>=<severity>...]] [--fsck-objects[=<msg-id>=<severity>...]] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
struct object_entry { struct object_entry {
struct pack_idx_entry idx; struct pack_idx_entry idx;
@ -1785,8 +1785,9 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
} else if (!strcmp(arg, "--check-self-contained-and-connected")) { } else if (!strcmp(arg, "--check-self-contained-and-connected")) {
strict = 1; strict = 1;
check_self_contained_and_connected = 1; check_self_contained_and_connected = 1;
} else if (!strcmp(arg, "--fsck-objects")) { } else if (skip_to_optional_arg(arg, "--fsck-objects", &arg)) {
do_fsck_object = 1; do_fsck_object = 1;
fsck_set_msg_types(&fsck_options, arg);
} else if (!strcmp(arg, "--verify")) { } else if (!strcmp(arg, "--verify")) {
verify = 1; verify = 1;
} else if (!strcmp(arg, "--verify-stat")) { } else if (!strcmp(arg, "--verify-stat")) {

View file

@ -441,8 +441,7 @@ test_expect_success 'index-pack with --strict' '
) )
' '
test_expect_success 'index-pack with --strict downgrading fsck msgs' ' test_expect_success 'setup for --strict and --fsck-objects downgrading fsck msgs' '
test_when_finished rm -rf strict &&
git init strict && git init strict &&
( (
cd strict && cd strict &&
@ -457,12 +456,32 @@ test_expect_success 'index-pack with --strict downgrading fsck msgs' '
EOF EOF
git hash-object --literally -t commit -w --stdin <commit >commit_list && git hash-object --literally -t commit -w --stdin <commit >commit_list &&
PACK=$(git pack-objects test <commit_list) && git pack-objects test <commit_list >pack-name
test_must_fail git index-pack --strict "test-$PACK.pack" &&
git index-pack --strict="missingEmail=ignore" "test-$PACK.pack"
) )
' '
test_with_bad_commit () {
must_fail_arg="$1" &&
must_pass_arg="$2" &&
(
cd strict &&
test_expect_fail git index-pack "$must_fail_arg" "test-$(cat pack-name).pack"
git index-pack "$must_pass_arg" "test-$(cat pack-name).pack"
)
}
test_expect_success 'index-pack with --strict downgrading fsck msgs' '
test_with_bad_commit --strict --strict="missingEmail=ignore"
'
test_expect_success 'index-pack with --fsck-objects downgrading fsck msgs' '
test_with_bad_commit --fsck-objects --fsck-objects="missingEmail=ignore"
'
test_expect_success 'cleanup for --strict and --fsck-objects downgrading fsck msgs' '
rm -rf strict
'
test_expect_success 'honor pack.packSizeLimit' ' test_expect_success 'honor pack.packSizeLimit' '
git config pack.packSizeLimit 3m && git config pack.packSizeLimit 3m &&
packname_10=$(git pack-objects test-10 <obj-list) && packname_10=$(git pack-objects test-10 <obj-list) &&