cat-file: fix error and warning message formatting
PATCH 1/1 cat-file: fix error and warning message formatting
From: mdferdousalam <[email protected]>
The CodingGuidelines state that error messages should not begin with a capital letter and should not end with a full stop. Fix the die(), error() and warning() messages in builtin/cat-file.c that violate these rules, and update the corresponding test expectations in t1006 and t8007.
---
cat-file: fix error and warning message formatting
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2052%2Fmdferdousalam%2Ffix-error-messages-cat-file-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2052/mdferdousalam/fix-error-messages-cat-file-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/2052
builtin/cat-file.c | 8 ++++---- t/t1006-cat-file.sh | 6 +++--- t/t8007-cat-file-textconv.sh | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-)
builtin/cat-file.c +4 -4
@@ -121,7 +121,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name)if (get_oid_with_context (the_repository, obj_name, get_oid_flags, &oid, &obj_context)) -die ("Not a valid object name %s" , obj_name); +die ("not a valid object name %s" , obj_name);if (!path) path = obj_context.path;
@@ -182,7 +182,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name)case 'p' : type =odb_read_object_info (the_repository->objects, &oid,NULL );if (type <0 ) -die ("Not a valid object name %s" , obj_name); +die ("not a valid object name %s" , obj_name);/* custom pretty-print here */ if (type ==OBJ_TREE ) {
@@ -200,7 +200,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name) buf =odb_read_object (the_repository->objects, &oid, &type, &size);if (!buf) -die ("Cannot read object %s" , obj_name); +die ("cannot read object %s" , obj_name);if (use_mailmap) {size_t s = size;
@@ -910,7 +910,7 @@ static int batch_objects(struct batch_options *opt) data.skip_object_info =1 ;if (repo_has_promisor_remote (the_repository)) -warning ("This repository uses promisor remotes. Some objects may not be loaded." ); +warning ("this repository uses promisor remotes; some objects may not be loaded" );disable_replace_refs ();
t/t1006-cat-file.sh +3 -3
@@ -705,7 +705,7 @@ do then cat >expect <<-EOF error: header for $bogus_long_oid too long, exceeds 32 bytes - fatal: Not a valid object name $bogus_long_oid + fatal: not a valid object name $bogus_long_oid EOF else cat >expect <<-EOF
@@ -721,7 +721,7 @@ do test_expect_success "cat-file $arg1 error on missing short OID" ' cat >expect.err <<-EOF && - fatal: Not a valid object name $(test_oid deadbeef_short) + fatal: not a valid object name $(test_oid deadbeef_short) EOF test_must_fail git cat-file $arg1 $(test_oid deadbeef_short) >out 2>err.actual && test_must_be_empty out &&
@@ -732,7 +732,7 @@ do if test "$arg1" = "-p" then cat >expect.err <<-EOF - fatal: Not a valid object name $(test_oid deadbeef) + fatal: not a valid object name $(test_oid deadbeef) EOF else cat >expect.err <<-\EOF
t/t8007-cat-file-textconv.sh +1 -1
@@ -22,7 +22,7 @@ test_expect_success 'setup ' ' test_expect_success 'usage: <bad rev>' ' cat >expect <<-\EOF && - fatal: Not a valid object name HEAD2 + fatal: not a valid object name HEAD2 EOF test_must_fail git cat-file --textconv HEAD2 2>actual && test_cmp expect actual
base-commit: 7c02d39fc2ed2702223c7674f73150d9a7e61ba4
Signature · 1 line
gitgitgadget
Quoted 8 lines · Md Ferdous Alam via GitGitGadget
From: mdferdousalam <[email protected]>
The CodingGuidelines state that error messages should not begin with a capital letter and should not end with a full stop. Fix the
die(),error()andwarning()messages inbuiltin/cat-file.cthat violate these rules, and update the corresponding test expectations in t1006 and t8007.
Quoted 7 lines
Signed-off-by mdferdousalam <[email protected]>---
cat-file: fix error and warning message formattingPublished-As: https://github.com/gitgitgadget/git/releases/tag/pr-2052%2Fmdferdousalam%2Ffix-error-messages-cat-file-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2052/mdferdousalam/fix-error-messages-cat-file-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/2052
It may be cleaner to deal with "Not a valid object name %s" that appear in 5 other .c files in addition to cat-file.c in a single patch (touching no other messages, just the "Not a valid object name" one), and do the rest of cat-file.c in a second patch.
Have you audited third-party software that use Git plumbing commands like "git cat-file" to make sure that they do not expect the current and historical spelling to make sure this change will not break them?
Other than that, looking good. Thanks for working on it.
Quoted 92 lines
builtin/cat-file.c | 8 ++++---- t/t1006-cat-file.sh | 6 +++--- t/t8007-cat-file-textconv.sh | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-)builtin/cat-file.c +4
-4@@ -121,7 +121,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name)if (get_oid_with_context (the_repository, obj_name, get_oid_flags, &oid, &obj_context)) -die ("Not a valid object name %s" , obj_name); +die ("not a valid object name %s" , obj_name);if (!path) path = obj_context.path;@@ -182,7 +182,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name)case 'p' : type =odb_read_object_info (the_repository->objects, &oid,NULL );if (type <0 ) -die ("Not a valid object name %s" , obj_name); +die ("not a valid object name %s" , obj_name);/* custom pretty-print here */ if (type ==OBJ_TREE ) {@@ -200,7 +200,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name) buf =odb_read_object (the_repository->objects, &oid, &type, &size);if (!buf) -die ("Cannot read object %s" , obj_name); +die ("cannot read object %s" , obj_name);if (use_mailmap) {size_t s = size;@@ -910,7 +910,7 @@ static int batch_objects(struct batch_options *opt) data.skip_object_info =1 ;if (repo_has_promisor_remote (the_repository)) -warning ("This repository uses promisor remotes. Some objects may not be loaded." ); +warning ("this repository uses promisor remotes; some objects may not be loaded" );disable_replace_refs ();t/t1006-cat-file.sh +3
-3@@ -705,7 +705,7 @@ do then cat >expect <<-EOF error: header for $bogus_long_oid too long, exceeds 32 bytes - fatal: Not a valid object name $bogus_long_oid + fatal: not a valid object name $bogus_long_oid EOF else cat >expect <<-EOF@@ -721,7 +721,7 @@ do test_expect_success "cat-file $arg1 error on missing short OID" ' cat >expect.err <<-EOF && - fatal: Not a valid object name $(test_oid deadbeef_short) + fatal: not a valid object name $(test_oid deadbeef_short) EOF test_must_fail git cat-file $arg1 $(test_oid deadbeef_short) >out 2>err.actual && test_must_be_empty out &&@@ -732,7 +732,7 @@ do if test "$arg1" = "-p" then cat >expect.err <<-EOF - fatal: Not a valid object name $(test_oid deadbeef) + fatal: not a valid object name $(test_oid deadbeef) EOF else cat >expect.err <<-\EOFt/t8007-cat-file-textconv.sh +1
-1@@ -22,7 +22,7 @@ test_expect_success 'setup ' ' test_expect_success 'usage: <bad rev>' ' cat >expect <<-\EOF && - fatal: Not a valid object name HEAD2 + fatal: not a valid object name HEAD2 EOF test_must_fail git cat-file --textconv HEAD2 2>actual && test_cmp expect actualbase-commit:
7c02d39fc2ed2702223c7674f73150d9a7e61ba4
Quoted 4 lines · Junio C Hamano
It may be cleaner to deal with "Not a valid object name %s" that appear in 5 other .c files in addition to
cat-file.cin a single patch (touching no other messages, just the "Not a valid object name" one), and do the rest ofcat-file.cin a second patch.
Done in v2. The series is now split into two patches:
[1/2] die: lowercase "Not a valid object name" messages (cat-file.c, describe.c, ls-tree.c, merge-base.c, read-tree.c, unpack-file.c and their test expectations) [2/2] cat-file: fix remaining error and warning message formatting ("Cannot read object" and the promisor remotes warning)
Quoted 3 lines
Have you audited third-party software that use Git plumbing commands like "git cat-file" to make sure that they do not expect the current and historical spelling to make sure this change will not break them?
I did a broad search across GitHub. Here is what I found:
Several widely-used projects do case-sensitive string matching on "fatal: Not a valid object name" in stderr output from Git commands:
- Gitea (go-gitea/gitea) -- strings.Contains() in Go
- Gogs (gogs/gogs) -- strings.Contains() in Go
- GitLab Gitaly -- strings.HasPrefix() in Go
- JetBrains IntelliJ -- startsWith() in Java
- Harness CI/CD -- strings.HasPrefix() in Go (3 locations)
- Review Board -- startswith() in Python
- Tencent CodeAnalysis -- regex match in Python
- DataLad -- "in" string check in Python
- elastic/docs tooling -- .includes() in JavaScript
- prettier-standard -- exact === equality in JavaScript
On the other hand, these are NOT affected:
- Pure Git reimplementations (libgit2, JGit, go-git, Dulwich, isomorphic-git, GitPython) generate their own messages.
- GitKraken GitLens already uses case-insensitive matching (/i).
- VS Code Git extension and GitHub Desktop do not match this specific message.
- Many CI/CD tools (Nx, BuildKit, Skaffold, Flutter) rely on exit codes rather than message text.
A handful of projects already check for the lowercase form "not a valid object name", suggesting the ecosystem is in transition, but the majority still expect the capitalized form.
Given the risk of silently breaking error detection in projects like Gitea, Gogs, Gitaly, and IntelliJ, I am not sure whether it is worth proceeding with patch [1/2]. Patch [2/2] changes messages that are far less likely to be parsed by external tools ("Cannot read object" and the promisor remotes warning).
How would you like to proceed? Should we:
(a) keep both patches as-is and let downstream projects adapt,
(b) drop patch [1/2] and only ship [2/2], or
(c) take a different approach?
Thanks,
Md Ferdous Alam
On Monday, February 23, 2026 at 09:54:52 PM GMT+6, Junio C Hamano <[email protected]> wrote:
Quoted 8 lines · Md Ferdous Alam via GitGitGadget
From: mdferdousalam <[email protected]>
The CodingGuidelines state that error messages should not begin with a capital letter and should not end with a full stop. Fix the
die(),error()andwarning()messages inbuiltin/cat-file.cthat violate these rules, and update the corresponding test expectations in t1006 and t8007.
Quoted 7 lines
Signed-off-by mdferdousalam <[email protected]>---
cat-file: fix error and warning message formattingPublished-As: https://github.com/gitgitgadget/git/releases/tag/pr-2052%2Fmdferdousalam%2Ffix-error-messages-cat-file-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2052/mdferdousalam/fix-error-messages-cat-file-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/2052
It may be cleaner to deal with "Not a valid object name %s" that appear in 5 other .c files in addition to cat-file.c in a single patch (touching no other messages, just the "Not a valid object name" one), and do the rest of cat-file.c in a second patch.
Have you audited third-party software that use Git plumbing commands like "git cat-file" to make sure that they do not expect the current and historical spelling to make sure this change will not break them?
Other than that, looking good. Thanks for working on it.
Quoted 92 lines
builtin/cat-file.c | 8 ++++----
t/t1006-cat-file.sh | 6 +++---
t/t8007-cat-file-textconv.sh| 2 +-3 files changed, 8 insertions(+), 8 deletions(-)builtin/cat-file.c +0
-0@@ -121,7 +121,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name)
if (get_oid_with_context(the_repository, obj_name, get_oid_flags, &oid, &obj_context))
-die("Not a valid object name %s", obj_name);
+die("not a valid object name %s", obj_name);
if (!path)
path = obj_context.path;builtin/cat-file.c +0
-0@@ -182,7 +182,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name)case 'p':
type =odb_read_object_info(the_repository->objects, &oid, NULL); if (type < 0)
-die("Not a valid object name %s", obj_name);
+die("not a valid object name %s", obj_name);
/* custom pretty-print here */
if (type ==OBJ_TREE) {builtin/cat-file.c +1
-1@@ -200,7 +200,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name) buf = odb_read_object(the_repository->objects, &oid, &type, &size); if (!buf) - die("Cannot read object %s", obj_name); + die("cannot read object %s", obj_name);
if (use_mailmap) {
size_ts = size;builtin/cat-file.c +0
-0@@ -910,7 +910,7 @@ static int batch_objects(struct batch_options *opt) data.skip_object_info = 1;
if (repo_has_promisor_remote(the_repository))
- warning("This repository uses promisor remotes. Some objects may not be loaded."); +warning("this repository uses promisor remotes; some objects may not be loaded");
disable_replace_refs();t/t1006-cat-file.sh +0
-0@@ -705,7 +705,7 @@ dothen
cat >expect <<-EOF
error: header for $bogus_long_oid too long, exceeds 32 bytes - fatal: Not a valid object name $bogus_long_oid
+ fatal: not a valid object name $bogus_long_oid EOF
else
cat >expect <<-EOFt/t1006-cat-file.sh +0
-0@@ -721,7 +721,7 @@ do
test_expect_success"cat-file $arg1 error on missing short OID" '
cat >expect.err <<-EOF&&
- fatal: Not a valid object name $(test_oiddeadbeef_short)
+ fatal: not a valid object name $(test_oiddeadbeef_short)
EOF
test_must_failgit cat-file $arg1 $(test_oiddeadbeef_short) >out 2>err.actual &&test_must_be_emptyout &&t/t1006-cat-file.sh +0
-0@@ -732,7 +732,7 @@ doif test "$arg1" = "-p"
then
cat >expect.err <<-EOF
- fatal: Not a valid object name $(test_oid deadbeef) + fatal: not a valid object name $(test_oid deadbeef) EOF
else
cat >expect.err <<-\EOFt/t8007-cat-file-textconv.sh +0
-0@@ -22,7 +22,7 @@ test_expect_success 'setup ' '
test_expect_success'usage: <bad rev>' '
cat >expect <<-\EOF &&
- fatal: Not a valid object name HEAD2
+ fatal: not a valid object name HEAD2
EOF
test_must_failgit cat-file --textconv HEAD2 2>actual &&test_cmpexpect actualbase-commit:
7c02d39fc2ed2702223c7674f73150d9a7e61ba4
Quoted 5 lines · Engr Md Ferdous Alam
Given the risk of silently breaking error detection in projects like Gitea, Gogs, Gitaly, and IntelliJ, I am not sure whether it is worth proceeding with patch [1/2].
...
How would you like to proceed?
It is prudent to treat any and all messages from plumbing commands like cat-file as sleeping dogs and keep them undisturbed. Even for human end-user facing messages from Porcelain commands, we may want to be careful, but if I recall correctly, the commands your recent set of patches covered were all plumbing?
Thanks.