Skip to contentSkip to conversation

index-pack: fsck honor checks

PATCH Superseded John Cai via GitGitGadget 7 participants 29 messages Jan 25, 2024 – Mar 9, 2024 Documentation

lore
Share & tools
lore
#0 lore raw

cover index-pack: fsck honor checks

git-index-pack has a --strict mode 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.

John Cai (2):
index-pack: test and document --strict=<msg>
index-pack: --fsck-objects to take an optional argument for fsck msgs

 Documentation/git-index-pack.txt | 19 +++++++++++----
 builtin/index-pack.c             |  5 ++--
 t/t5300-pack-object.sh           | 41 ++++++++++++++++++++++++++++++++
 3 files changed, 59 insertions(+), 6 deletions(-)

base-commit: 186b115d3062e6230ee296d1ddaa0c4b72a464b5
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1658%2Fjohn-cai%2Fjc%2Findex-pack-fsck-honor-checks-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1658/john-cai/jc/index-pack-fsck-honor-checks-v1
Pull-Request: https://github.com/git/git/pull/1658

Signature · 1 line
gitgitgadget
#1 lore raw

PATCH 1/2 index-pack: test and document --strict=<msg>

From: John Cai <[email protected]>

5d477a334a (fsck (receive-pack): allow demoting errors to warnings, 2015-06-22) allowed a list of fsck msg to downgrade to be passed to --strict. However this is a hidden argument that was not documented nor tested. Though true that most users would not call this option direction, (nor use index-pack for that matter) it is still useful to document and test this feature.

---
 Documentation/git-index-pack.txt |  9 +++++++--
 builtin/index-pack.c             |  2 +-
 t/t5300-pack-object.sh           | 22 ++++++++++++++++++++++
 3 files changed, 30 insertions(+), 3 deletions(-)
Documentation/git-index-pack.txt +7 -2
index 6486620c3d8..14f806d07d1 100644
@@ -79,8 +79,13 @@ OPTIONS
 	to force the version for the generated pack index, and to force
 	64-bit index entries on objects located above the given offset.
 
---strict::
-	Die, if the pack contains broken objects or links.
+--strict[=<msg-ids>]::
+	Die, if the pack contains broken objects or links. If `<msg-ids>` is passed,
+	it should be a comma-separated list of `<msg-id>=<severity>` elements where
+	`<msg-id>` and `<severity>` are used to change the severity of some possible
+	issues, eg: `--strict="missingEmail=ignore,badTagName=error"`. See the entry
+	for the `fsck.<msg-id>` configuration options in `linkgit:git-fsck[1] for
+	more information on the possible values of `<msg-id>` and `<severity>`.
 
 --progress-title::
 	For internal use only.
builtin/index-pack.c +1 -1
index 1ea87e01f29..1e53ca23775 100644
@@ -24,7 +24,7 @@
 #include "setup.h"
 
 static const char index_pack_usage[] =
-"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
+"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict[=<msg-ids>]] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
 
 struct object_entry {
 	struct pack_idx_entry idx;
t/t5300-pack-object.sh +22 -0
index d402ec18b79..9563372ae27 100755
@@ -441,6 +441,28 @@ test_expect_success 'index-pack with --strict' '
 	)
 '
 
+test_expect_success 'index-pack with --strict downgrading fsck msgs' '
+	test_when_finished rm -rf strict &&
+	git init strict &&
+	(
+		cd strict &&
+		test_commit first hello &&
+		cat >commit <<-EOF &&
+		tree $(git rev-parse HEAD^{tree})
+		parent $(git rev-parse HEAD)
+		author A U Thor
+		committer A U Thor
+
+		commit: this is a commit wit bad emails
+
+		EOF
+		git hash-object --literally -t commit -w --stdin <commit >commit_list &&
+		PACK=$(git pack-objects test <commit_list) &&
+		test_must_fail git index-pack --strict "test-$PACK.pack" &&
+		git index-pack --strict="missingEmail=ignore" "test-$PACK.pack"
+	)
+'
+
 test_expect_success 'honor pack.packSizeLimit' '
 	git config pack.packSizeLimit 3m &&
 	packname_10=$(git pack-objects test-10 <obj-list) &&
Signature · 1 line
gitgitgadget
#2 lore raw

Re: [PATCH 1/2] index-pack: test and document --strict=<msg>

Quoted 7 lines · John Cai via GitGitGadget

From: John Cai <[email protected]>

5d477a334a (fsck (receive-pack): allow demoting errors to warnings, 2015-06-22) allowed a list of fsck msg to downgrade to be passed to --strict. However this is a hidden argument that was not documented nor tested. Though true that most users would not call this option direction, (nor use index-pack for that matter) it is still useful to

Though it is true that ... call this option directly (nor use index-pack, for that matter), it is still ...

or something like that, probably.

Quoted 1 line

document and test this feature.

And I agree with that. Thanks for adding the necessary doc.

Quoted 1 line

+--strict[=<msg-ids>]::

<msg-id> in the context of "git fsck --help" seems to refer to the left hand side of <msg-id>=<severity>. <msg-ids> sounds as if it is just the list of <msg-id> without saying anything about their severity, which is not what we want to imply.

Either use a made-up word that is clearly different and can not be mistaken as a list of <msg-id>, or spell it out a bit more explicitly, may make it easier to follow?

	--strict[=<fsck-config>]
	--strict[=<msg-id>=<severity>...]

I dunno.

Use of <msg-id> and <severity> below looks good in the body of the paragraph here.

Documentation/git-index-pack.txt OPTIONS · line 88

Quoted 6 lines
Documentation/git-index-pack.txt +6 -0
+	Die, if the pack contains broken objects or links. If `<msg-ids>` is passed,
+	it should be a comma-separated list of `<msg-id>=<severity>` elements where
+	`<msg-id>` and `<severity>` are used to change the severity of some possible
+	issues, eg: `--strict="missingEmail=ignore,badTagName=error"`. See the entry
+	for the `fsck.<msg-id>` configuration options in `linkgit:git-fsck[1] for
+	more information on the possible values of `<msg-id>` and `<severity>`.

"eg:" -> "e.g.," probably.

Quoted 11 lines
t/t5300-pack-object.sh +3 -0
index d402ec18b79..9563372ae27 100755
@@ -441,6 +441,28 @@ test_expect_success 'index-pack with --strict' '
 	)
 '
 
+test_expect_success 'index-pack with --strict downgrading fsck msgs' '
+	test_when_finished rm -rf strict &&
+	git init strict &&

t/t5300-pack-object.sh test_expect_success 'index-pack with --strict' ' · line 456

Quoted 10 lines
t/t5300-pack-object.sh +10 -0
+	(
+		cd strict &&
+		test_commit first hello &&
+		cat >commit <<-EOF &&
+		tree $(git rev-parse HEAD^{tree})
+		parent $(git rev-parse HEAD)
+		author A U Thor
+		committer A U Thor
+
+		commit: this is a commit wit bad emails

"wit" -> "with"; as this typo does not contribute anything to the badness we expect index-pack to notice, it would pay to make sure we do not have it, to avoid distracting readers.

Quoted 11 lines
t/t5300-pack-object.sh +8 -0
+		EOF
+		git hash-object --literally -t commit -w --stdin <commit >commit_list &&
+		PACK=$(git pack-objects test <commit_list) &&
+		test_must_fail git index-pack --strict "test-$PACK.pack" &&
+		git index-pack --strict="missingEmail=ignore" "test-$PACK.pack"
+	)
+'
+
 test_expect_success 'honor pack.packSizeLimit' '
 	git config pack.packSizeLimit 3m &&
 	packname_10=$(git pack-objects test-10 <obj-list) &&
#3 lore raw

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

In reply to John Cai via GitGitGadget

From: John Cai <[email protected]>

git-index-pack has a --strict mode 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.

This commit also removes the "For internal use only" note for --fsck-objects, and documents 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.

---
 Documentation/git-index-pack.txt | 10 ++++++++--
 builtin/index-pack.c             |  5 +++--
 t/t5300-pack-object.sh           | 29 ++++++++++++++++++++++++-----
 3 files changed, 35 insertions(+), 9 deletions(-)
Documentation/git-index-pack.txt +8 -2
index 14f806d07d1..37709b13c88 100644
@@ -96,8 +96,14 @@ default and "Indexing objects" when `--stdin` is specified.
 --check-self-contained-and-connected::
 	Die if the pack contains broken links. For internal use only.
 
---fsck-objects::
-	For internal use only.
+--fsck-objects[=<msg-ids>]::
+	Instructs index-pack to check for broken objects instead of broken
+	links. If `<msg-ids>` is passed, it should be  a comma-separated list of
+	`<msg-id>=<severity>` where `<msg-id>` and `<severity>` are used to
+	change the severity of `fsck` errors, eg: `--strict="missingEmail=ignore,badTagName=ignore"`.
+	See the entry for the `fsck.<msg-id>` configuration options in
+	`linkgit:git-fsck[1] for more information on the possible values of
+	`<msg-id>` and `<severity>`.
 +
 Die if the pack contains broken objects. If the pack contains a tree
 pointing to a .gitmodules blob that does not exist, prints the hash of
builtin/index-pack.c +3 -2
index 1e53ca23775..519162f5b91 100644
@@ -24,7 +24,7 @@
 #include "setup.h"
 
 static const char index_pack_usage[] =
-"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict[=<msg-ids>]] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
+"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict[=<msg-ids>]] [--fsck-objects[=<msg-ids>]] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
 
 struct object_entry {
 	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")) {
 				strict = 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;
+				fsck_set_msg_types(&fsck_options, arg);
 			} else if (!strcmp(arg, "--verify")) {
 				verify = 1;
 			} else if (!strcmp(arg, "--verify-stat")) {
t/t5300-pack-object.sh +24 -5
index 9563372ae27..916cf939beb 100755
@@ -441,8 +441,7 @@ test_expect_success 'index-pack with --strict' '
 	)
 '
 
-test_expect_success 'index-pack with --strict downgrading fsck msgs' '
-	test_when_finished rm -rf strict &&
+test_expect_success 'setup for --strict and --fsck-objects downgrading fsck msgs' '
 	git init strict &&
 	(
 		cd strict &&
@@ -457,12 +456,32 @@ test_expect_success 'index-pack with --strict downgrading fsck msgs' '
 
 		EOF
 		git hash-object --literally -t commit -w --stdin <commit >commit_list &&
-		PACK=$(git pack-objects test <commit_list) &&
-		test_must_fail git index-pack --strict "test-$PACK.pack" &&
-		git index-pack --strict="missingEmail=ignore" "test-$PACK.pack"
+		git pack-objects test <commit_list >pack-name
 	)
 '
 
+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' '
 	git config pack.packSizeLimit 3m &&
 	packname_10=$(git pack-objects test-10 <obj-list) &&
Signature · 1 line
gitgitgadget
#4 lore raw

Re: [PATCH 2/2] index-pack: --fsck-objects to take an optional argument for fsck msgs

Quoted 3 lines · John Cai via GitGitGadget

From: John Cai <[email protected]>

git-index-pack has a --strict mode that can take an optional argument to

"mode" -> "option", probably.

Quoted 6 lines

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.

"Allow" -> "allow".

Quoted 4 lines

This commit also removes the "For internal use only" note for --fsck-objects, and documents 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.

"This commit also removes", "documents" -> "Remove", "document".

Documentation/git-index-pack.txt default and "Indexing objects" when `--stdin` is specified. · line 101

Quoted 5 lines

---fsck-objects::

Documentation/git-index-pack.txt +3 -1
-	For internal use only.
+--fsck-objects[=<msg-ids>]::
+	Instructs index-pack to check for broken objects instead of broken
+	links. If `<msg-ids>` is passed, it should be  a comma-separated list of

Very much pleased to see an additional description that is written to clarify the difference between this option and the other --strict option. The original was totally unclear on this point, and it is very much appreciated.

The other option notices and dies upon seeing either a broken object or a dangling link. This one only diagnoses broken objects and does not care if the objects are connected. However, saying "instead of" here tempts readers to mistakenly think that the other one only checks links and this one only checks contents, which is not what we want to say. Perhaps "to check for broken objects, but unlike --strict, do not choke on broken links" or something?

Same comment on <msg-ids> as the previous step.

Documentation/git-index-pack.txt default and "Indexing objects" when `--stdin` is specified. · line 103

Quoted 2 lines
Documentation/git-index-pack.txt +2 -0
+	`<msg-id>=<severity>` where `<msg-id>` and `<severity>` are used to
+	change the severity of `fsck` errors, eg: `--strict="missingEmail=ignore,badTagName=ignore"`.

Same comment for "eg:" as before.

builtin/index-pack.c int cmd_index_pack(int argc, const char **argv, const char *prefix) · line 1793

Quoted 11 lines
builtin/index-pack.c +2 -1
@@ -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")) {
 				strict = 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;
+				fsck_set_msg_types(&fsck_options, arg);
 			} else if (!strcmp(arg, "--verify")) {
 				verify = 1;
 			} else if (!strcmp(arg, "--verify-stat")) {

The implementation of this part looks quite obvious, once you see how "--strict[=<msgid>=<level>]" is implemented.

Looking good.

Thanks.

#5 lore raw

v2 cover index-pack: fsck honor checks

In reply to John Cai via GitGitGadget

git-index-pack has a --strict mode 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.

Change since V1:

* edited commit messages
* clarified formatting in documentation for --strict= and --fsck-objects=

John Cai (2):
index-pack: test and document --strict=<msg>
index-pack: --fsck-objects to take an optional argument for fsck msgs

 Documentation/git-index-pack.txt | 19 +++++++++++----
 builtin/index-pack.c             |  5 ++--
 t/t5300-pack-object.sh           | 41 ++++++++++++++++++++++++++++++++
 3 files changed, 59 insertions(+), 6 deletions(-)

base-commit: 186b115d3062e6230ee296d1ddaa0c4b72a464b5
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1658%2Fjohn-cai%2Fjc%2Findex-pack-fsck-honor-checks-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1658/john-cai/jc/index-pack-fsck-honor-checks-v2
Pull-Request: https://github.com/git/git/pull/1658

Range-diff vs v1:

1: 9b353aff73d ! 1: b3b3e8bd0bf index-pack: test and document --strict=<msg>
@@ Commit message
5d477a334a (fsck (receive-pack): allow demoting errors to warnings, 2015-06-22) allowed a list of fsck msg to downgrade to be passed to --strict. However this is a hidden argument that was not documented nor
- tested. Though true that most users would not call this option
- direction, (nor use index-pack for that matter) it is still useful to
+ tested. Though it is true that most users would not call this option
+ directly, (nor use index-pack for that matter) it is still useful to
document and test this feature.

@@ Documentation/git-index-pack.txt: OPTIONS

---strict::
- Die, if the pack contains broken objects or links.
-+--strict[=<msg-ids>]::
++--strict[=<msg-id>=<severity>...]::
+ Die, if the pack contains broken objects or links. If <msg-ids> is passed,
+ it should be a comma-separated list of <msg-id>=<severity> elements where
+ <msg-id> and <severity> are used to change the severity of some possible
-+ issues, eg: --strict="missingEmail=ignore,badTagName=error". See the entry
++ issues, e.g., --strict="missingEmail=ignore,badTagName=error". See the entry
+ for the fsck.<msg-id> configuration options in `linkgit:git-fsck[1] for
+ more information on the possible values of <msg-id> and <severity>.

@@ t/t5300-pack-object.sh: test_expect_success 'index-pack with --strict' '
+ author A U Thor
+ committer A U Thor
+
-+ commit: this is a commit wit bad emails
++ commit: this is a commit with bad emails
+
+ EOF
+ git hash-object --literally -t commit -w --stdin <commit >commit_list &&
2: 074e0c7ab92 ! 2: cce63c6465f index-pack: --fsck-objects to take an optional argument for fsck msgs
@@ Metadata
## Commit message ##
index-pack: --fsck-objects to take an optional argument for fsck msgs

- git-index-pack has a --strict mode 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.
+ 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
+ Like --strict, allow --fsck-objects to also take a list of fsck msgs to
change the severity.

- This commit also removes the "For internal use only" note for
- --fsck-objects, and documents 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.
+ 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.

@@ Documentation/git-index-pack.txt: default and "Indexing objects" when --stdin

---fsck-objects::
- For internal use only.
-+--fsck-objects[=<msg-ids>]::
-+ Instructs index-pack to check for broken objects instead of broken
-+ links. If <msg-ids> is passed, it should be a comma-separated list of
-+ <msg-id>=<severity> where <msg-id> and <severity> are used to
-+ change the severity of fsck errors, eg: --strict="missingEmail=ignore,badTagName=ignore".
-+ See the entry for the fsck.<msg-id> configuration options in
-+ `linkgit:git-fsck[1] for more information on the possible values of
-+ <msg-id> and <severity>.
++--fsck-objects[=<msg-ids>=<severity>...]::
++ Instructs index-pack to check for broken objects, but unlike --strict,
++ does not choke on broken links. If <msg-ids> is passed, it should be
++ a comma-separated list of <msg-id>=<severity> where <msg-id> and
++ <severity> are used to change the severity of fsck errors e.g.,
++ --strict="missingEmail=ignore,badTagName=ignore". See the entry for
++ the fsck.<msg-id> configuration options in `linkgit:git-fsck[1] for
++ more information on the possible values of <msg-id> and <severity>.
+
Die if the pack contains broken objects. If the pack contains a tree pointing to a .gitmodules blob that does not exist, prints the hash of

Signature · 1 line
gitgitgadget
#6 lore raw

PATCH v2 1/2 index-pack: test and document --strict=<msg>

From: John Cai <[email protected]>

5d477a334a (fsck (receive-pack): allow demoting errors to warnings, 2015-06-22) allowed a list of fsck msg to downgrade to be passed to --strict. However this is a hidden argument that was not documented nor tested. Though it is true that most users would not call this option directly, (nor use index-pack for that matter) it is still useful to document and test this feature.

---
 Documentation/git-index-pack.txt |  9 +++++++--
 builtin/index-pack.c             |  2 +-
 t/t5300-pack-object.sh           | 22 ++++++++++++++++++++++
 3 files changed, 30 insertions(+), 3 deletions(-)
Documentation/git-index-pack.txt +7 -2
index 6486620c3d8..f7a98bbf9c8 100644
@@ -79,8 +79,13 @@ OPTIONS
 	to force the version for the generated pack index, and to force
 	64-bit index entries on objects located above the given offset.
 
---strict::
-	Die, if the pack contains broken objects or links.
+--strict[=<msg-id>=<severity>...]::
+	Die, if the pack contains broken objects or links. If `<msg-ids>` is passed,
+	it should be a comma-separated list of `<msg-id>=<severity>` elements where
+	`<msg-id>` and `<severity>` are used to change the severity of some possible
+	issues, e.g., `--strict="missingEmail=ignore,badTagName=error"`. See the entry
+	for the `fsck.<msg-id>` configuration options in `linkgit:git-fsck[1] for
+	more information on the possible values of `<msg-id>` and `<severity>`.
 
 --progress-title::
 	For internal use only.
builtin/index-pack.c +1 -1
index 1ea87e01f29..1e53ca23775 100644
@@ -24,7 +24,7 @@
 #include "setup.h"
 
 static const char index_pack_usage[] =
-"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
+"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict[=<msg-ids>]] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
 
 struct object_entry {
 	struct pack_idx_entry idx;
t/t5300-pack-object.sh +22 -0
index d402ec18b79..496fffa0f8a 100755
@@ -441,6 +441,28 @@ test_expect_success 'index-pack with --strict' '
 	)
 '
 
+test_expect_success 'index-pack with --strict downgrading fsck msgs' '
+	test_when_finished rm -rf strict &&
+	git init strict &&
+	(
+		cd strict &&
+		test_commit first hello &&
+		cat >commit <<-EOF &&
+		tree $(git rev-parse HEAD^{tree})
+		parent $(git rev-parse HEAD)
+		author A U Thor
+		committer A U Thor
+
+		commit: this is a commit with bad emails
+
+		EOF
+		git hash-object --literally -t commit -w --stdin <commit >commit_list &&
+		PACK=$(git pack-objects test <commit_list) &&
+		test_must_fail git index-pack --strict "test-$PACK.pack" &&
+		git index-pack --strict="missingEmail=ignore" "test-$PACK.pack"
+	)
+'
+
 test_expect_success 'honor pack.packSizeLimit' '
 	git config pack.packSizeLimit 3m &&
 	packname_10=$(git pack-objects test-10 <obj-list) &&
Signature · 1 line
gitgitgadget
#7 lore raw

Re: [PATCH v2 1/2] index-pack: test and document --strict=<msg>

Quoted 21 lines · John Cai via GitGitGadget

From: John Cai <[email protected]>

5d477a334a (fsck (receive-pack): allow demoting errors to warnings, 2015-06-22) allowed a list of fsck msg to downgrade to be passed to --strict. However this is a hidden argument that was not documented nor tested. Though it is true that most users would not call this option directly, (nor use index-pack for that matter) it is still useful to document and test this feature.

---
 Documentation/git-index-pack.txt |  9 +++++++--
 builtin/index-pack.c             |  2 +-
 t/t5300-pack-object.sh           | 22 ++++++++++++++++++++++
 3 files changed, 30 insertions(+), 3 deletions(-)
Documentation/git-index-pack.txt +0 -0
index 6486620c3d8..f7a98bbf9c8 100644

Documentation/git-index-pack.txt OPTIONS · line 86

Quoted 10 lines
Documentation/git-index-pack.txt +5 -2
@@ -79,8 +79,13 @@ OPTIONS
 	to force the version for the generated pack index, and to force
 	64-bit index entries on objects located above the given offset.
 
---strict::
-	Die, if the pack contains broken objects or links.
+--strict[=<msg-id>=<severity>...]::
+	Die, if the pack contains broken objects or links. If `<msg-ids>` is passed,
+	it should be a comma-separated list of `<msg-id>=<severity>` elements where
+	`<msg-id>` and `<severity>` are used to change the severity of some possible
+	issues, e.g., `--strict="missingEmail=ignore,badTagName=error"`. See the entry

There no longer is <msg-ids>, so I'll tweak the text perhaps like so:

An optional value that is a comma-separated list of '<msg-id>=<severity>' can be passed to change the severity of some possible issues, ...

while queueing. Will probably do the same for the --fsck-objects side in the next patch.

Other than that, thanks for a pleasant read.

Quoted 51 lines
Documentation/git-index-pack.txt +2 -0
+	for the `fsck.<msg-id>` configuration options in `linkgit:git-fsck[1] for
+	more information on the possible values of `<msg-id>` and `<severity>`.
 
 --progress-title::
 	For internal use only.
builtin/index-pack.c +1 -1
index 1ea87e01f29..1e53ca23775 100644
@@ -24,7 +24,7 @@
 #include "setup.h"
 
 static const char index_pack_usage[] =
-"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
+"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict[=<msg-ids>]] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
 
 struct object_entry {
 	struct pack_idx_entry idx;
t/t5300-pack-object.sh +22 -0
index d402ec18b79..496fffa0f8a 100755
@@ -441,6 +441,28 @@ test_expect_success 'index-pack with --strict' '
 	)
 '
 
+test_expect_success 'index-pack with --strict downgrading fsck msgs' '
+	test_when_finished rm -rf strict &&
+	git init strict &&
+	(
+		cd strict &&
+		test_commit first hello &&
+		cat >commit <<-EOF &&
+		tree $(git rev-parse HEAD^{tree})
+		parent $(git rev-parse HEAD)
+		author A U Thor
+		committer A U Thor
+
+		commit: this is a commit with bad emails
+
+		EOF
+		git hash-object --literally -t commit -w --stdin <commit >commit_list &&
+		PACK=$(git pack-objects test <commit_list) &&
+		test_must_fail git index-pack --strict "test-$PACK.pack" &&
+		git index-pack --strict="missingEmail=ignore" "test-$PACK.pack"
+	)
+'
+
 test_expect_success 'honor pack.packSizeLimit' '
 	git config pack.packSizeLimit 3m &&
 	packname_10=$(git pack-objects test-10 <obj-list) &&
#8 lore raw

PATCH v2 2/2 index-pack: --fsck-objects to take an optional argument for fsck msgs

In reply to John Cai via GitGitGadget

From: John Cai <[email protected]>

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.

---
 Documentation/git-index-pack.txt | 10 ++++++++--
 builtin/index-pack.c             |  5 +++--
 t/t5300-pack-object.sh           | 29 ++++++++++++++++++++++++-----
 3 files changed, 35 insertions(+), 9 deletions(-)
Documentation/git-index-pack.txt +8 -2
index f7a98bbf9c8..916652d3b1b 100644
@@ -96,8 +96,14 @@ default and "Indexing objects" when `--stdin` is specified.
 --check-self-contained-and-connected::
 	Die if the pack contains broken links. For internal use only.
 
---fsck-objects::
-	For internal use only.
+--fsck-objects[=<msg-ids>=<severity>...]::
+	Instructs index-pack to check for broken objects, but unlike `--strict`,
+	does not choke on broken links. If `<msg-ids>` is passed, it should be
+	a comma-separated list of `<msg-id>=<severity>` where `<msg-id>` and
+	`<severity>` are used to change the severity of `fsck` errors e.g.,
+	`--strict="missingEmail=ignore,badTagName=ignore"`. See the entry for
+	the `fsck.<msg-id>` configuration options in `linkgit:git-fsck[1] for
+	more information on the possible values of `<msg-id>` and `<severity>`.
 +
 Die if the pack contains broken objects. If the pack contains a tree
 pointing to a .gitmodules blob that does not exist, prints the hash of
builtin/index-pack.c +3 -2
index 1e53ca23775..519162f5b91 100644
@@ -24,7 +24,7 @@
 #include "setup.h"
 
 static const char index_pack_usage[] =
-"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict[=<msg-ids>]] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
+"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict[=<msg-ids>]] [--fsck-objects[=<msg-ids>]] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
 
 struct object_entry {
 	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")) {
 				strict = 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;
+				fsck_set_msg_types(&fsck_options, arg);
 			} else if (!strcmp(arg, "--verify")) {
 				verify = 1;
 			} else if (!strcmp(arg, "--verify-stat")) {
t/t5300-pack-object.sh +24 -5
index 496fffa0f8a..a58f91035d1 100755
@@ -441,8 +441,7 @@ test_expect_success 'index-pack with --strict' '
 	)
 '
 
-test_expect_success 'index-pack with --strict downgrading fsck msgs' '
-	test_when_finished rm -rf strict &&
+test_expect_success 'setup for --strict and --fsck-objects downgrading fsck msgs' '
 	git init strict &&
 	(
 		cd strict &&
@@ -457,12 +456,32 @@ test_expect_success 'index-pack with --strict downgrading fsck msgs' '
 
 		EOF
 		git hash-object --literally -t commit -w --stdin <commit >commit_list &&
-		PACK=$(git pack-objects test <commit_list) &&
-		test_must_fail git index-pack --strict "test-$PACK.pack" &&
-		git index-pack --strict="missingEmail=ignore" "test-$PACK.pack"
+		git pack-objects test <commit_list >pack-name
 	)
 '
 
+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' '
 	git config pack.packSizeLimit 3m &&
 	packname_10=$(git pack-objects test-10 <obj-list) &&
Signature · 1 line
gitgitgadget
#9 lore raw

Re: [PATCH v2 2/2] index-pack: --fsck-objects to take an optional argument for fsck msgs

Documentation/git-index-pack.txt default and "Indexing objects" when `--stdin` is specified. · line 104

Quoted 6 lines · John Cai via GitGitGadget

+--fsck-objects[=<msg-ids>=<severity>...]::

Documentation/git-index-pack.txt +5 -0
+	Instructs index-pack to check for broken objects, but unlike `--strict`,
+	does not choke on broken links. If `<msg-ids>` is passed, it should be
+	a comma-separated list of `<msg-id>=<severity>` where `<msg-id>` and
+	`<severity>` are used to change the severity of `fsck` errors e.g.,
+	`--strict="missingEmail=ignore,badTagName=ignore"`. See the entry for

In addition to the comment I made in my reply to 1/2, this should be --fsck-objects="missingEmail=ignore,badTagName=ignore", I think. Will treak locally.

Thanks.

#10 lore raw

Re: [PATCH v2 2/2] index-pack: --fsck-objects to take an optional argument for fsck msgs

Hi Junio,

Quoted 12 lines · Junio C Hamano

Documentation/git-index-pack.txt default and "Indexing objects" when `--stdin` is specified. · line 104

Quoted 6 lines · John Cai via GitGitGadget

+--fsck-objects[=<msg-ids>=<severity>...]::

Documentation/git-index-pack.txt +5 -0
+	Instructs index-pack to check for broken objects, but unlike `--strict`,
+	does not choke on broken links. If `<msg-ids>` is passed, it should be
+	a comma-separated list of `<msg-id>=<severity>` where `<msg-id>` and
+	`<severity>` are used to change the severity of `fsck` errors e.g.,
+	`--strict="missingEmail=ignore,badTagName=ignore"`. See the entry for

In addition to the comment I made in my reply to 1/2, this should be --fsck-objects="missingEmail=ignore,badTagName=ignore", I think. Will treak locally.

Good catch. I might as well re-roll this since I forgot to add a Reviewed-by:
Christian Couder <[email protected]> trailer to the commits.

Quoted 2 lines

Thanks.

#11 lore raw

v3 cover index-pack: fsck honor checks

In reply to John Cai via GitGitGadget

git-index-pack has a --strict mode 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.

Changes since V2:

* fixed some typos in the documentation
* added commit trailers

Change since V1:

* edited commit messages
* clarified formatting in documentation for --strict= and --fsck-objects=

John Cai (2):
index-pack: test and document --strict=<msg-id>=<severity>...
index-pack: --fsck-objects to take an optional argument for fsck msgs

 Documentation/git-index-pack.txt | 26 +++++++++++++-------
 builtin/index-pack.c             |  5 ++--
 t/t5300-pack-object.sh           | 41 ++++++++++++++++++++++++++++++++
 3 files changed, 62 insertions(+), 10 deletions(-)

base-commit: 186b115d3062e6230ee296d1ddaa0c4b72a464b5
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1658%2Fjohn-cai%2Fjc%2Findex-pack-fsck-honor-checks-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1658/john-cai/jc/index-pack-fsck-honor-checks-v3
Pull-Request: https://github.com/git/git/pull/1658

Range-diff vs v2:

1: b3b3e8bd0bf ! 1: cdf7fc7fe8a index-pack: test and document --strict=<msg>
@@ Metadata
Author: John Cai <[email protected]>

## Commit message ##
- index-pack: test and document --strict=<msg>
+ index-pack: test and document --strict=<msg-id>=<severity>...

5d477a334a (fsck (receive-pack): allow demoting errors to warnings, 2015-06-22) allowed a list of fsck msg to downgrade to be passed to
@@ Commit message
directly, (nor use index-pack for that matter) it is still useful to document and test this feature.

+ Reviewed-by: Christian Couder <[email protected]>

## Documentation/git-index-pack.txt ##
@@ Documentation/git-index-pack.txt: OPTIONS
---strict::
- Die, if the pack contains broken objects or links.
+--strict[=<msg-id>=<severity>...]::
-+ Die, if the pack contains broken objects or links. If <msg-ids> is passed,
-+ it should be a comma-separated list of <msg-id>=<severity> elements where
-+ <msg-id> and <severity> are used to change the severity of some possible
-+ issues, e.g., --strict="missingEmail=ignore,badTagName=error". See the entry
-+ for the fsck.<msg-id> configuration options in `linkgit:git-fsck[1] for
-+ more information on the possible values of <msg-id> and <severity>.
++ Die, if the pack contains broken objects or links. An optional
++ comma-separated list of <msg-id>=<severity> can be passed to change
++ the severity of some possible issues, e.g.,
++ --strict="missingEmail=ignore,badTagName=error". See the entry for the
++ fsck.<msg-id> configuration options in linkgit:git-fsck[1] for more
++ information on the possible values of <msg-id> and <severity>.

--progress-title::
For internal use only.
@@ builtin/index-pack.c

static const char index_pack_usage[] =
-"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
-+"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict[=<msg-ids>]] (<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>...]] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";

struct object_entry {
struct pack_idx_entry idx;
2: cce63c6465f ! 2: a2b9adb93d8 index-pack: --fsck-objects to take an optional argument for fsck msgs
@@ Commit message
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 <[email protected]>

## Documentation/git-index-pack.txt ##
@@ Documentation/git-index-pack.txt: default and "Indexing objects" when --stdin

---fsck-objects::
- For internal use only.
-+--fsck-objects[=<msg-ids>=<severity>...]::
-+ Instructs index-pack to check for broken objects, but unlike --strict,
-+ does not choke on broken links. If <msg-ids> is passed, it should be
-+ a comma-separated list of <msg-id>=<severity> where <msg-id> and
-+ <severity> are used to change the severity of fsck errors e.g.,
-+ --strict="missingEmail=ignore,badTagName=ignore". See the entry for
-+ the fsck.<msg-id> configuration options in `linkgit:git-fsck[1] for
-+ more information on the possible values of <msg-id> and <severity>.
++--fsck-objects[=<msg-id>=<severity>...]::
++ Die if the pack contains broken objects. 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
- pointing to a .gitmodules blob that does not exist, prints the hash of +-Die if the pack contains broken objects. 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").
++Unlike --strict however, don't choke on broken links. An optional ++comma-separated list of <msg-id>=<severity> can be passed to change the ++severity of some possible issues, e.g., ++--fsck-objects="missingEmail=ignore,badTagName=ignore". See the entry for the ++fsck.<msg-id> configuration options in linkgit:git-fsck[1] for more ++information on the possible values of <msg-id> and <severity>. +
+ --threads=<n>::
+ Specifies the number of threads to spawn when resolving

## builtin/index-pack.c ##
@@
#include "setup.h"

static const char index_pack_usage[] =
--"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict[=<msg-ids>]] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
-+"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict[=<msg-ids>]] [--fsck-objects[=<msg-ids>]] (<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>...]] (<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 pack_idx_entry idx;

Signature · 1 line
gitgitgadget
#12 lore raw

PATCH v3 1/2 index-pack: test and document --strict=<msg-id>=<severity>...

From: John Cai <[email protected]>

5d477a334a (fsck (receive-pack): allow demoting errors to warnings, 2015-06-22) allowed a list of fsck msg to downgrade to be passed to --strict. However this is a hidden argument that was not documented nor tested. Though it is true that most users would not call this option directly, (nor use index-pack for that matter) it is still useful to document and test this feature.

---
 Documentation/git-index-pack.txt |  9 +++++++--
 builtin/index-pack.c             |  2 +-
 t/t5300-pack-object.sh           | 22 ++++++++++++++++++++++
 3 files changed, 30 insertions(+), 3 deletions(-)
Documentation/git-index-pack.txt +7 -2
index 6486620c3d8..694bb9409bf 100644
@@ -79,8 +79,13 @@ OPTIONS
 	to force the version for the generated pack index, and to force
 	64-bit index entries on objects located above the given offset.
 
---strict::
-	Die, if the pack contains broken objects or links.
+--strict[=<msg-id>=<severity>...]::
+	Die, if the pack contains broken objects or links. An optional
+	comma-separated list of `<msg-id>=<severity>` can be passed to change
+	the severity of some possible issues, e.g.,
+	 `--strict="missingEmail=ignore,badTagName=error"`. See the entry for the
+	`fsck.<msg-id>` configuration options in linkgit:git-fsck[1] for more
+	information on the possible values of `<msg-id>` and `<severity>`.
 
 --progress-title::
 	For internal use only.
builtin/index-pack.c +1 -1
index 1ea87e01f29..240c7021168 100644
@@ -24,7 +24,7 @@
 #include "setup.h"
 
 static const char index_pack_usage[] =
-"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict] (<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>...]] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
 
 struct object_entry {
 	struct pack_idx_entry idx;
t/t5300-pack-object.sh +22 -0
index d402ec18b79..496fffa0f8a 100755
@@ -441,6 +441,28 @@ test_expect_success 'index-pack with --strict' '
 	)
 '
 
+test_expect_success 'index-pack with --strict downgrading fsck msgs' '
+	test_when_finished rm -rf strict &&
+	git init strict &&
+	(
+		cd strict &&
+		test_commit first hello &&
+		cat >commit <<-EOF &&
+		tree $(git rev-parse HEAD^{tree})
+		parent $(git rev-parse HEAD)
+		author A U Thor
+		committer A U Thor
+
+		commit: this is a commit with bad emails
+
+		EOF
+		git hash-object --literally -t commit -w --stdin <commit >commit_list &&
+		PACK=$(git pack-objects test <commit_list) &&
+		test_must_fail git index-pack --strict "test-$PACK.pack" &&
+		git index-pack --strict="missingEmail=ignore" "test-$PACK.pack"
+	)
+'
+
 test_expect_success 'honor pack.packSizeLimit' '
 	git config pack.packSizeLimit 3m &&
 	packname_10=$(git pack-objects test-10 <obj-list) &&
Signature · 1 line
gitgitgadget
#13 lore raw

PATCH v3 2/2 index-pack: --fsck-objects to take an optional argument for fsck msgs

In reply to John Cai via GitGitGadget

From: John Cai <[email protected]>

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.

---
 Documentation/git-index-pack.txt | 17 +++++++++++------
 builtin/index-pack.c             |  5 +++--
 t/t5300-pack-object.sh           | 29 ++++++++++++++++++++++++-----
 3 files changed, 38 insertions(+), 13 deletions(-)
Documentation/git-index-pack.txt +11 -6
index 694bb9409bf..3db1062d1e4 100644
@@ -96,13 +96,18 @@ default and "Indexing objects" when `--stdin` is specified.
 --check-self-contained-and-connected::
 	Die if the pack contains broken links. For internal use only.
 
---fsck-objects::
-	For internal use only.
+--fsck-objects[=<msg-id>=<severity>...]::
+	Die if the pack contains broken objects. 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
-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").
+Unlike `--strict` however, don't choke on broken links. An optional
+comma-separated list of `<msg-id>=<severity>` can be passed to change the
+severity of some possible issues, e.g.,
+`--fsck-objects="missingEmail=ignore,badTagName=ignore"`. See the entry for the
+`fsck.<msg-id>` configuration options in linkgit:git-fsck[1] for more
+information on the possible values of `<msg-id>` and `<severity>`.
 
 --threads=<n>::
 	Specifies the number of threads to spawn when resolving
builtin/index-pack.c +3 -2
index 240c7021168..a3a37bd215d 100644
@@ -24,7 +24,7 @@
 #include "setup.h"
 
 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 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")) {
 				strict = 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;
+				fsck_set_msg_types(&fsck_options, arg);
 			} else if (!strcmp(arg, "--verify")) {
 				verify = 1;
 			} else if (!strcmp(arg, "--verify-stat")) {
t/t5300-pack-object.sh +24 -5
index 496fffa0f8a..a58f91035d1 100755
@@ -441,8 +441,7 @@ test_expect_success 'index-pack with --strict' '
 	)
 '
 
-test_expect_success 'index-pack with --strict downgrading fsck msgs' '
-	test_when_finished rm -rf strict &&
+test_expect_success 'setup for --strict and --fsck-objects downgrading fsck msgs' '
 	git init strict &&
 	(
 		cd strict &&
@@ -457,12 +456,32 @@ test_expect_success 'index-pack with --strict downgrading fsck msgs' '
 
 		EOF
 		git hash-object --literally -t commit -w --stdin <commit >commit_list &&
-		PACK=$(git pack-objects test <commit_list) &&
-		test_must_fail git index-pack --strict "test-$PACK.pack" &&
-		git index-pack --strict="missingEmail=ignore" "test-$PACK.pack"
+		git pack-objects test <commit_list >pack-name
 	)
 '
 
+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' '
 	git config pack.packSizeLimit 3m &&
 	packname_10=$(git pack-objects test-10 <obj-list) &&
Signature · 1 line
gitgitgadget
#14 lore raw
In reply to John Cai via GitGitGadget
Quoted 7 lines · John Cai via GitGitGadget

1: b3b3e8bd0bf ! 1: cdf7fc7fe8a index-pack: test and document --strict=<msg>
@@ Metadata
Author: John Cai <[email protected]>

## Commit message ##
- index-pack: test and document --strict=<msg>
+ index-pack: test and document --strict=<msg-id>=<severity>...

Ah, I missed this one. Nice spotting.

Quoted 8 lines

5d477a334a (fsck (receive-pack): allow demoting errors to warnings, 2015-06-22) allowed a list of fsck msg to downgrade to be passed to
@@ Commit message
directly, (nor use index-pack for that matter) it is still useful to document and test this feature.

+ Reviewed-by: Christian Couder <[email protected]>

I haven't seen Christian involved (by getting Cc'ed these patches, sending out review comments, or giving his Reviewed-by:) during these three rounds of this topic. I'll wait until I hear from him before queuing this, just to be safe.

Quoted 6 lines

++ Die, if the pack contains broken objects or links. An optional
++ comma-separated list of <msg-id>=<severity> can be passed to change
++ the severity of some possible issues, e.g.,
++ --strict="missingEmail=ignore,badTagName=error". See the entry for the
++ fsck.<msg-id> configuration options in linkgit:git-fsck[1] for more
++ information on the possible values of <msg-id> and <severity>.

This is much better than the tentative text I tweaked. Nice.

Quoted 5 lines

++--fsck-objects[=<msg-id>=<severity>...]::
++ Die if the pack contains broken objects. 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").

Not a new problem bit I have to wonder what happens if the pack contains many trees that point at different blobs for ".gitmodules" path and many of these blobs are not included in the packfile? Will the caller receive all of these blob object names so that they can be verified? The reference to the "Notes" only refer to the fact that usually a single hash value that is used in constructing the name of the packfile "pack-<Hashvalue>.pack" is emitted to the standard output, which is not wrong per se, but does not help readers very much wrt to understanding this.

[jc: dragging JTan into the thread, as this comes from his 5476e1ef (fetch-pack: print and use dangling .gitmodules, 2021-02-22)].

Quoted 2 lines

+
++Unlike --strict however, don't choke on broken links. An optional

You'd need a comma on both sides of "however" used like this, I think.

In any case, I thought your original construction to have this "unlike" immediately after "die on broken objects" was far easier to follow.

Thanks.

#15 lore raw

Hi Junio,

Quoted 18 lines · Junio C Hamano
Quoted 7 lines · John Cai via GitGitGadget

1: b3b3e8bd0bf ! 1: cdf7fc7fe8a index-pack: test and document --strict=<msg>
@@ Metadata
Author: John Cai <[email protected]>

## Commit message ##
- index-pack: test and document --strict=<msg>
+ index-pack: test and document --strict=<msg-id>=<severity>...

Ah, I missed this one. Nice spotting.

Quoted 6 lines

5d477a334a (fsck (receive-pack): allow demoting errors to warnings, 2015-06-22) allowed a list of fsck msg to downgrade to be passed to
@@ Commit message
directly, (nor use index-pack for that matter) it is still useful to document and test this feature.

Quoted 7 lines
Quoted 2 lines

+ Reviewed-by: Christian Couder <[email protected]>

I haven't seen Christian involved (by getting Cc'ed these patches, sending out review comments, or giving his Reviewed-by:) during these three rounds of this topic. I'll wait until I hear from him before queuing this, just to be safe.

Christian was involved on an off-list review of this patch series. You can see it in [1].

1. https://gitlab.com/gitlab-org/git/-/merge_requests/88

Quoted 26 lines
Quoted 7 lines

++ Die, if the pack contains broken objects or links. An optional
++ comma-separated list of <msg-id>=<severity> can be passed to change
++ the severity of some possible issues, e.g.,
++ --strict="missingEmail=ignore,badTagName=error". See the entry for the
++ fsck.<msg-id> configuration options in linkgit:git-fsck[1] for more
++ information on the possible values of <msg-id> and <severity>.

This is much better than the tentative text I tweaked. Nice.

Quoted 5 lines

++--fsck-objects[=<msg-id>=<severity>...]::
++ Die if the pack contains broken objects. 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").

Not a new problem bit I have to wonder what happens if the pack contains many trees that point at different blobs for ".gitmodules" path and many of these blobs are not included in the packfile? Will the caller receive all of these blob object names so that they can be verified? The reference to the "Notes" only refer to the fact that usually a single hash value that is used in constructing the name of the packfile "pack-<Hashvalue>.pack" is emitted to the standard output, which is not wrong per se, but does not help readers very much wrt to understanding this.

Quoted 2 lines

[jc: dragging JTan into the thread, as this comes from his 5476e1ef (fetch-pack: print and use dangling .gitmodules, 2021-02-22)].

sounds good, will wait for some clarification here

Quoted 6 lines
Quoted 3 lines

+
++Unlike --strict however, don't choke on broken links. An optional

You'd need a comma on both sides of "however" used like this, I think.

good catch

Quoted 4 lines

In any case, I thought your original construction to have this "unlike" immediately after "die on broken objects" was far easier to follow.

I'll reformulate this to be clearer. From the previous version I realized I didn't take into account the pre-existing "Die if the pack contains broken objects" block so I put it at the beginning. But now I think you're right in that the "Unlike..." comes too late.

Quoted 2 lines

Thanks.

#16 lore raw
Quoted 30 lines · John Cai

Hi Junio,

Quoted 18 lines · Junio C Hamano
Quoted 7 lines · John Cai via GitGitGadget

1: b3b3e8bd0bf ! 1: cdf7fc7fe8a index-pack: test and document --strict=<msg>
@@ Metadata
Author: John Cai <[email protected]>

## Commit message ##
- index-pack: test and document --strict=<msg>
+ index-pack: test and document --strict=<msg-id>=<severity>...

Ah, I missed this one. Nice spotting.

Quoted 6 lines

5d477a334a (fsck (receive-pack): allow demoting errors to warnings, 2015-06-22) allowed a list of fsck msg to downgrade to be passed to
@@ Commit message
directly, (nor use index-pack for that matter) it is still useful to document and test this feature.

Quoted 7 lines
Quoted 2 lines

+ Reviewed-by: Christian Couder <[email protected]>

I haven't seen Christian involved (by getting Cc'ed these patches, sending out review comments, or giving his Reviewed-by:) during these three rounds of this topic. I'll wait until I hear from him before queuing this, just to be safe.

Quoted 4 lines

Christian was involved on an off-list review of this patch series. You can see it in [1].

1. https://gitlab.com/gitlab-org/git/-/merge_requests/88

I'm always a bit hesitant to add trailers referring to off-list reviews to commits. It's impossible for a future reader to discover how that trailer came to be by just using the mailing list archive, and expecting them to use third-party services to verify them feels wrong to me.

It's part of the reason why I'm pushing more into the direction of on-list reviews at GitLab. It makes it a lot more obvious how such a Reviewed-by came to be and keeps things self-contained on the mailing list. It also grows new contributors who are becoming more familiar with how the Git mailing list works. If such a review already happened internally due to whatever reason then I think it ought to be fine for that reviewer to chime in saying that they have already reviewed the patch series and that things look good to them.

Patrick

#17 lore raw
Quoted 5 lines · Patrick Steinhardt

I'm always a bit hesitant to add trailers referring to off-list reviews to commits. It's impossible for a future reader to discover how that trailer came to be by just using the mailing list archive, and expecting them to use third-party services to verify them feels wrong to me.

Quoted 8 lines

It's part of the reason why I'm pushing more into the direction of on-list reviews at GitLab. It makes it a lot more obvious how such a Reviewed-by came to be and keeps things self-contained on the mailing list. It also grows new contributors who are becoming more familiar with how the Git mailing list works. If such a review already happened internally due to whatever reason then I think it ought to be fine for that reviewer to chime in saying that they have already reviewed the patch series and that things look good to them.

Thanks. That would improve clarifying a situation like this one (eh, actually, once it is done this particular situation wouldn't need any clarification).

#18 lore raw
In reply to Junio C Hamano
Quoted 16 lines · Junio C Hamano
Quoted 5 lines

++--fsck-objects[=<msg-id>=<severity>...]::
++ Die if the pack contains broken objects. 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").

Not a new problem bit I have to wonder what happens if the pack contains many trees that point at different blobs for ".gitmodules" path and many of these blobs are not included in the packfile? Will the caller receive all of these blob object names so that they can be verified? The reference to the "Notes" only refer to the fact that usually a single hash value that is used in constructing the name of the packfile "pack-<Hashvalue>.pack" is emitted to the standard output, which is not wrong per se, but does not help readers very much wrt to understanding this.

Quoted 2 lines

[jc: dragging JTan into the thread, as this comes from his 5476e1ef (fetch-pack: print and use dangling .gitmodules, 2021-02-22)].

Ah...I can see how that documentation isn't clear. The intention of that commit is to check every link to a .gitmodules blob. The tests perhaps should have been written with 2 .gitmodules blobs (in separate commits), but I think the production code works: I tried changing the test to have 2 commits each with their own .gitmodules blob, and error messages were printed for both blobs.

(If someone changes that test, e.g. to have 2 blobs, the ">h" in the "configure_exclusion" invocations look superfluous and is perhaps a copy-and-paste error from other tests that needed the hash later.)

#19 lore raw

Hi Jonathan,

Quoted 20 lines · Jonathan Tan
Quoted 16 lines · Junio C Hamano
Quoted 5 lines

++--fsck-objects[=<msg-id>=<severity>...]::
++ Die if the pack contains broken objects. 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").

Not a new problem bit I have to wonder what happens if the pack contains many trees that point at different blobs for ".gitmodules" path and many of these blobs are not included in the packfile? Will the caller receive all of these blob object names so that they can be verified? The reference to the "Notes" only refer to the fact that usually a single hash value that is used in constructing the name of the packfile "pack-<Hashvalue>.pack" is emitted to the standard output, which is not wrong per se, but does not help readers very much wrt to understanding this.

Quoted 2 lines

[jc: dragging JTan into the thread, as this comes from his 5476e1ef (fetch-pack: print and use dangling .gitmodules, 2021-02-22)].

Quoted 6 lines

Ah...I can see how that documentation isn't clear. The intention of that commit is to check every link to a .gitmodules blob. The tests perhaps should have been written with 2 .gitmodules blobs (in separate commits), but I think the production code works: I tried changing the test to have 2 commits each with their own .gitmodules blob, and error messages were printed for both blobs.

Thanks for clarifying! Would you mind providing a patch to revise the wording here to make it clearer? I would try but I feel like I might get the wording wrong.

Quoted 4 lines

(If someone changes that test, e.g. to have 2 blobs, the ">h" in the "configure_exclusion" invocations look superfluous and is perhaps a copy-and-paste error from other tests that needed the hash later.)

thanks
John

#20 lore raw
Quoted 11 lines · John Cai

Hi Jonathan,

Quoted 6 lines · Jonathan Tan
Quoted 5 lines · Junio C Hamano
Quoted 5 lines

++--fsck-objects[=<msg-id>=<severity>...]::
++ Die if the pack contains broken objects. 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").

Quoted 3 lines

Thanks for clarifying! Would you mind providing a patch to revise the wording here to make it clearer? I would try but I feel like I might get the wording wrong.

I think the wording there is already mostly correct, except maybe make everything plural (a tree -> trees, a .gitmodules blob -> .gitmodules blobs, hash of that blob -> hashes of those blobs). We might also need to modify a test to show that the current code indeed handles the plural situation correctly. I don't have time right now to get to this, so hopefully someone could pick this up.

#21 lore raw

Hi Jonathan,

Quoted 16 lines · Jonathan Tan
Quoted 11 lines · John Cai

Hi Jonathan,

Quoted 6 lines · Jonathan Tan
Quoted 5 lines · Junio C Hamano
Quoted 5 lines

++--fsck-objects[=<msg-id>=<severity>...]::
++ Die if the pack contains broken objects. 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").

Quoted 3 lines

Thanks for clarifying! Would you mind providing a patch to revise the wording here to make it clearer? I would try but I feel like I might get the wording wrong.

Quoted 6 lines

I think the wording there is already mostly correct, except maybe make everything plural (a tree -> trees, a .gitmodules blob -> .gitmodules blobs, hash of that blob -> hashes of those blobs). We might also need to modify a test to show that the current code indeed handles the plural situation correctly. I don't have time right now to get to this, so hopefully someone could pick this up.

Thanks! It sounds like we may want to tackle this as part of another patch.

John

#22 lore raw
Quoted 4 lines · John Cai
Quoted 4 lines
Quoted 3 lines

Thanks for clarifying! Would you mind providing a patch to revise the wording here to make it clearer? I would try but I feel like I might get the wording wrong.

Quoted 8 lines
Quoted 6 lines

I think the wording there is already mostly correct, except maybe make everything plural (a tree -> trees, a .gitmodules blob -> .gitmodules blobs, hash of that blob -> hashes of those blobs). We might also need to modify a test to show that the current code indeed handles the plural situation correctly. I don't have time right now to get to this, so hopefully someone could pick this up.

Thanks! It sounds like we may want to tackle this as part of another patch.

Yeah, the existing documentation has been with our users for some time, and it is not ultra urgent to fix it in that sense. I'd say that it can even wait until JTan gets bored with what he's doing and needs some distraction himself ;-)

As long as our collective mind remembers it as #leftoverbits it would be sufficient.

Thanks, both.

#23 lore raw

v4 cover index-pack: fsck honor checks

In reply to John Cai via GitGitGadget

git-index-pack has a --strict mode 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.

Changes since V3:

* clarification of --fsck-objects documentation wording

Changes since V2:

* fixed some typos in the documentation
* added commit trailers

Change since V1:

* edited commit messages
* clarified formatting in documentation for --strict= and --fsck-objects=

John Cai (2):
index-pack: test and document --strict=<msg-id>=<severity>...
index-pack: --fsck-objects to take an optional argument for fsck msgs

 Documentation/git-index-pack.txt | 26 +++++++++++++-------
 builtin/index-pack.c             |  5 ++--
 t/t5300-pack-object.sh           | 41 ++++++++++++++++++++++++++++++++
 3 files changed, 62 insertions(+), 10 deletions(-)

base-commit: 186b115d3062e6230ee296d1ddaa0c4b72a464b5
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1658%2Fjohn-cai%2Fjc%2Findex-pack-fsck-honor-checks-v4
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1658/john-cai/jc/index-pack-fsck-honor-checks-v4
Pull-Request: https://github.com/git/git/pull/1658

Range-diff vs v3:

 1:  cdf7fc7fe8a = 1:  cdf7fc7fe8a index-pack: test and document --strict=<msg-id>=<severity>...
 2:  a2b9adb93d8 ! 2:  f29ab9136fb index-pack: --fsck-objects to take an optional argument for fsck msgs

@@ Documentation/git-index-pack.txt: default and "Indexing objects" when --stdin
---fsck-objects::
- For internal use only.
+--fsck-objects[=<msg-id>=<severity>...]::
-+ Die if the pack contains broken objects. 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, 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 -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").
-+Unlike --strict however, don't choke on broken links. An optional -+comma-separated list of <msg-id>=<severity> can be passed to change the -+severity of some possible issues, e.g.,
++An optional comma-separated list of <msg-id>=<severity> can be passed to ++change the severity of some possible issues, e.g.,
+--fsck-objects="missingEmail=ignore,badTagName=ignore". See the entry for the +fsck.<msg-id> configuration options in linkgit:git-fsck[1] for more +information on the possible values of <msg-id> and <severity>.

Signature · 1 line
gitgitgadget
#24 lore raw

PATCH v4 1/2 index-pack: test and document --strict=<msg-id>=<severity>...

From: John Cai <[email protected]>

5d477a334a (fsck (receive-pack): allow demoting errors to warnings, 2015-06-22) allowed a list of fsck msg to downgrade to be passed to --strict. However this is a hidden argument that was not documented nor tested. Though it is true that most users would not call this option directly, (nor use index-pack for that matter) it is still useful to document and test this feature.

---
 Documentation/git-index-pack.txt |  9 +++++++--
 builtin/index-pack.c             |  2 +-
 t/t5300-pack-object.sh           | 22 ++++++++++++++++++++++
 3 files changed, 30 insertions(+), 3 deletions(-)
Documentation/git-index-pack.txt +7 -2
index 6486620c3d8..694bb9409bf 100644
@@ -79,8 +79,13 @@ OPTIONS
 	to force the version for the generated pack index, and to force
 	64-bit index entries on objects located above the given offset.
 
---strict::
-	Die, if the pack contains broken objects or links.
+--strict[=<msg-id>=<severity>...]::
+	Die, if the pack contains broken objects or links. An optional
+	comma-separated list of `<msg-id>=<severity>` can be passed to change
+	the severity of some possible issues, e.g.,
+	 `--strict="missingEmail=ignore,badTagName=error"`. See the entry for the
+	`fsck.<msg-id>` configuration options in linkgit:git-fsck[1] for more
+	information on the possible values of `<msg-id>` and `<severity>`.
 
 --progress-title::
 	For internal use only.
builtin/index-pack.c +1 -1
index 1ea87e01f29..240c7021168 100644
@@ -24,7 +24,7 @@
 #include "setup.h"
 
 static const char index_pack_usage[] =
-"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [--verify] [--strict] (<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>...]] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
 
 struct object_entry {
 	struct pack_idx_entry idx;
t/t5300-pack-object.sh +22 -0
index d402ec18b79..496fffa0f8a 100755
@@ -441,6 +441,28 @@ test_expect_success 'index-pack with --strict' '
 	)
 '
 
+test_expect_success 'index-pack with --strict downgrading fsck msgs' '
+	test_when_finished rm -rf strict &&
+	git init strict &&
+	(
+		cd strict &&
+		test_commit first hello &&
+		cat >commit <<-EOF &&
+		tree $(git rev-parse HEAD^{tree})
+		parent $(git rev-parse HEAD)
+		author A U Thor
+		committer A U Thor
+
+		commit: this is a commit with bad emails
+
+		EOF
+		git hash-object --literally -t commit -w --stdin <commit >commit_list &&
+		PACK=$(git pack-objects test <commit_list) &&
+		test_must_fail git index-pack --strict "test-$PACK.pack" &&
+		git index-pack --strict="missingEmail=ignore" "test-$PACK.pack"
+	)
+'
+
 test_expect_success 'honor pack.packSizeLimit' '
 	git config pack.packSizeLimit 3m &&
 	packname_10=$(git pack-objects test-10 <obj-list) &&
Signature · 1 line
gitgitgadget
#25 lore raw

PATCH v4 2/2 index-pack: --fsck-objects to take an optional argument for fsck msgs

In reply to John Cai via GitGitGadget

From: John Cai <[email protected]>

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.

---
 Documentation/git-index-pack.txt | 17 +++++++++++------
 builtin/index-pack.c             |  5 +++--
 t/t5300-pack-object.sh           | 29 ++++++++++++++++++++++++-----
 3 files changed, 38 insertions(+), 13 deletions(-)
Documentation/git-index-pack.txt +11 -6
index 694bb9409bf..5a20deefd5f 100644
@@ -96,13 +96,18 @@ default and "Indexing objects" when `--stdin` is specified.
 --check-self-contained-and-connected::
 	Die if the pack contains broken links. For internal use only.
 
---fsck-objects::
-	For internal use only.
+--fsck-objects[=<msg-id>=<severity>...]::
+	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
-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").
+An optional comma-separated list of `<msg-id>=<severity>` can be passed to
+change the severity of some possible issues, e.g.,
+`--fsck-objects="missingEmail=ignore,badTagName=ignore"`. See the entry for the
+`fsck.<msg-id>` configuration options in linkgit:git-fsck[1] for more
+information on the possible values of `<msg-id>` and `<severity>`.
 
 --threads=<n>::
 	Specifies the number of threads to spawn when resolving
builtin/index-pack.c +3 -2
index 240c7021168..a3a37bd215d 100644
@@ -24,7 +24,7 @@
 #include "setup.h"
 
 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 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")) {
 				strict = 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;
+				fsck_set_msg_types(&fsck_options, arg);
 			} else if (!strcmp(arg, "--verify")) {
 				verify = 1;
 			} else if (!strcmp(arg, "--verify-stat")) {
t/t5300-pack-object.sh +24 -5
index 496fffa0f8a..a58f91035d1 100755
@@ -441,8 +441,7 @@ test_expect_success 'index-pack with --strict' '
 	)
 '
 
-test_expect_success 'index-pack with --strict downgrading fsck msgs' '
-	test_when_finished rm -rf strict &&
+test_expect_success 'setup for --strict and --fsck-objects downgrading fsck msgs' '
 	git init strict &&
 	(
 		cd strict &&
@@ -457,12 +456,32 @@ test_expect_success 'index-pack with --strict downgrading fsck msgs' '
 
 		EOF
 		git hash-object --literally -t commit -w --stdin <commit >commit_list &&
-		PACK=$(git pack-objects test <commit_list) &&
-		test_must_fail git index-pack --strict "test-$PACK.pack" &&
-		git index-pack --strict="missingEmail=ignore" "test-$PACK.pack"
+		git pack-objects test <commit_list >pack-name
 	)
 '
 
+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' '
 	git config pack.packSizeLimit 3m &&
 	packname_10=$(git pack-objects test-10 <obj-list) &&
Signature · 1 line
gitgitgadget
#26 lore raw

Re: [PATCH v4 2/2] index-pack: --fsck-objects to take an optional argument for fsck msgs

Quoted 21 lines · John Cai via GitGitGadget
t/t5300-pack-object.sh +1 -5
index 496fffa0f8a..a58f91035d1 100755
@@ -441,8 +441,7 @@ test_expect_success 'index-pack with --strict' '
 	)
 '
 
-test_expect_success 'index-pack with --strict downgrading fsck msgs' '
-	test_when_finished rm -rf strict &&
+test_expect_success 'setup for --strict and --fsck-objects downgrading fsck msgs' '
 	git init strict &&
 	(
 		cd strict &&
@@ -457,12 +456,32 @@ test_expect_success 'index-pack with --strict downgrading fsck msgs' '
 
 		EOF
 		git hash-object --literally -t commit -w --stdin <commit >commit_list &&
-		PACK=$(git pack-objects test <commit_list) &&
-		test_must_fail git index-pack --strict "test-$PACK.pack" &&
-		git index-pack --strict="missingEmail=ignore" "test-$PACK.pack"

t/t5300-pack-object.sh test_expect_success 'index-pack with --strict downgrading fsck msgs' ' · line 468

Quoted 10 lines
t/t5300-pack-object.sh +7 -0
+		git pack-objects test <commit_list >pack-name
 	)
 '
 
+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"

There is no such command as 'test_expect_fail', resulting in:

expecting success of 5300.34 'index-pack with --strict downgrading fsck msgs':

          test_with_bad_commit --strict --strict="missingEmail=ignore"

+ test_with_bad_commit --strict --strict=missingEmail=ignore
+ must_fail_arg=--strict
+ must_pass_arg=--strict=missingEmail=ignore
+ cd strict
+ cat pack-name
+ test_expect_fail git index-pack --strict test-e4e1649155bf444fbd9cd85e376628d6eaf3d3bd.pack ./t5300-pack-object.sh: 468: eval: test_expect_fail: not found
+ cat pack-name
+ git index-pack --strict=missingEmail=ignore test-e4e1649155bf444fbd9cd85e376628d6eaf3d3bd.pack e4e1649155bf444fbd9cd85e376628d6eaf3d3bd

  ok 34 - index-pack with --strict downgrading fsck msgs

The missing command should fail the test, but it doesn't, because the &&-chain is broken on this line as well.

#27 lore raw

Re: [PATCH v4 2/2] index-pack: --fsck-objects to take an optional argument for fsck msgs

Hi Szeder,

Quoted 26 lines · SZEDER Gábor
Quoted 25 lines · John Cai via GitGitGadget
t/t5300-pack-object.sh +2 -5
index 496fffa0f8a..a58f91035d1 100755
@@ -441,8 +441,7 @@ test_expect_success 'index-pack with --strict' '
 	)
 '
 
-test_expect_success 'index-pack with --strict downgrading fsck msgs' '
-	test_when_finished rm -rf strict &&
+test_expect_success 'setup for --strict and --fsck-objects downgrading fsck msgs' '
 	git init strict &&
 	(
 		cd strict &&
@@ -457,12 +456,32 @@ test_expect_success 'index-pack with --strict downgrading fsck msgs' '
 
 		EOF
 		git hash-object --literally -t commit -w --stdin <commit >commit_list &&
-		PACK=$(git pack-objects test <commit_list) &&
-		test_must_fail git index-pack --strict "test-$PACK.pack" &&
-		git index-pack --strict="missingEmail=ignore" "test-$PACK.pack"
+		git pack-objects test <commit_list >pack-name
 	)
 '
 
Quoted 8 lines

t/t5300-pack-object.sh test_expect_success 'index-pack with --strict downgrading fsck msgs' ' · line 468

Quoted 6 lines
t/t5300-pack-object.sh +6 -0
+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"

There is no such command as 'test_expect_fail', resulting in:

Indeed, thanks for catching this.

Quoted 15 lines

expecting success of 5300.34 'index-pack with --strict downgrading fsck msgs':

          test_with_bad_commit --strict --strict="missingEmail=ignore"

+ test_with_bad_commit --strict --strict=missingEmail=ignore
+ must_fail_arg=--strict
+ must_pass_arg=--strict=missingEmail=ignore
+ cd strict
+ cat pack-name
+ test_expect_fail git index-pack --strict test-e4e1649155bf444fbd9cd85e376628d6eaf3d3bd.pack ./t5300-pack-object.sh: 468: eval: test_expect_fail: not found
+ cat pack-name
+ git index-pack --strict=missingEmail=ignore test-e4e1649155bf444fbd9cd85e376628d6eaf3d3bd.pack e4e1649155bf444fbd9cd85e376628d6eaf3d3bd

Quoted 4 lines
  ok 34 - index-pack with --strict downgrading fsck msgs

The missing command should fail the test, but it doesn't, because the &&-chain is broken on this line as well.

yes will need to fix this as well

thanks
John

#28 lore raw
In reply to John Cai via GitGitGadget

(John, sorry for having already sent this only to you.)

Quoted 18 lines · John Cai via GitGitGadget

git-index-pack has a --strict mode 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.

Changes since V3:

* clarification of --fsck-objects documentation wording

Changes since V2:

* fixed some typos in the documentation
* added commit trailers

Quoted 8 lines

Change since V1:

* edited commit messages
* clarified formatting in documentation for --strict= and --fsck-objects=

John Cai (2):
index-pack: test and document --strict=<msg-id>=<severity>...
index-pack: --fsck-objects to take an optional argument for fsck msgs

I reviewed internally on GitLab the initial versions of this series and I reviewed this version 4. It looks great to me, so I am happy to give my "Reviewed-by:".

Thanks!