Hi Toon
On 09/12/2022 15:00, Toon Claes wrote:
Since it's supported to have NUL-delimited input, introduced in
db9d67f2e9 (builtin/cat-file.c: support NUL-delimited input with `-z`,
2022-07-22), it's possible to pass paths that contain newlines. This
works great when the object is found, but when it's not, the input path
is returned in the error message. Because this can contain newlines, the
error message might get spread over multiple lines, making it harder to
machine-parse this error message.
With this change, the input is quote-formatted in the error message, if
needed. This ensures the error message is always on a single line and
makes parsing the error more straightforward.
Thanks for working on this. I'd previously suggested NUL terminating the
output of "git cat-file -z" to avoid this problem [1] but quoting the
object name is a better solution. The implementation looks good, thanks
for adding a test - are you sure we need the FUNNYNAMES guard on the
test even though it isn't creating files with funny names?
Best Wishes
Phillip
[1]
https://lore.kernel.org/git/66b71194-ad0e-18d0-e43b-71e5c47ba111@xxxxxxxxx/
Signed-off-by: Toon Claes <toon@xxxxxxxxx>
---
builtin/cat-file.c | 10 ++++++++++
t/t1006-cat-file.sh | 8 ++++++++
2 files changed, 18 insertions(+)
diff --git a/builtin/cat-file.c b/builtin/cat-file.c
index b3be58b1fb..67dd81238d 100644
--- a/builtin/cat-file.c
+++ b/builtin/cat-file.c
@@ -14,6 +14,7 @@
#include "tree-walk.h"
#include "oid-array.h"
#include "packfile.h"
+#include "quote.h"
#include "object-store.h"
#include "promisor-remote.h"
#include "mailmap.h"
@@ -475,6 +476,13 @@ static void batch_one_object(const char *obj_name,
result = get_oid_with_context(the_repository, obj_name,
flags, &data->oid, &ctx);
if (result != FOUND) {
+ struct strbuf quoted = STRBUF_INIT;
+
+ if (opt->nul_terminated) {
+ quote_c_style(obj_name, "ed, NULL, 0);
+ obj_name = quoted.buf;
+ }
+
switch (result) {
case MISSING_OBJECT:
printf("%s missing\n", obj_name);
@@ -499,6 +507,8 @@ static void batch_one_object(const char *obj_name,
result);
break;
}
+
+ strbuf_release("ed);
fflush(stdout);
return;
}
diff --git a/t/t1006-cat-file.sh b/t/t1006-cat-file.sh
index 23b8942edb..232bfd1723 100755
--- a/t/t1006-cat-file.sh
+++ b/t/t1006-cat-file.sh
@@ -447,6 +447,14 @@ test_expect_success FUNNYNAMES '--batch-check, -z with newline in input' '
test_cmp expect actual
'
+test_expect_success FUNNYNAMES '--batch-check, -z with newline in non-existent named object' '
+ printf "HEAD:newline${LF}embedded" >in &&
+ git cat-file --batch-check -z <in >actual &&
+
+ printf "\"HEAD:newline\\\\nembedded\" missing\n" >expect &&
+ test_cmp expect actual
+'
+
batch_command_multiple_info="info $hello_sha1
info $tree_sha1
info $commit_sha1
--
2.39.0.rc0.57