From: "ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
Christian Couder <christian.couder@gmail.com>,
Hariom Verma <hariom18599@gmail.com>,
ZheNing Hu <adlternative@gmail.com>,
ZheNing Hu <adlternative@gmail.com>
Subject: [PATCH] [GSOC] cat-file: fix --batch report changed-type bug
Date: Sun, 30 May 2021 08:29:26 +0000 [thread overview]
Message-ID: <pull.965.git.1622363366722.gitgitgadget@gmail.com> (raw)
From: ZheNing Hu <adlternative@gmail.com>
When we use `--batch` with no atoms formatting and use
`--batch-all-objects` at the same time (e.g.
`git cat-file --batch="batman" --batch-all-objects`),
Git will exit and report "object xxx changed type!?".
This is because we have a format string which does not
contain any atoms, so skip_object_info option will be
set if we also use --batch-all-objects, and then
`oid_object_info_extended()` will be skipped in
`batch_object_write()`, it cause object type to not be
collected. Therefore, it reported object type has changed.
So avoid checking changes in type and size when all_objects
and skip_object_info options are set at the same time.
Signed-off-by: ZheNing Hu <adlternative@gmail.com>
---
[GSOC] cat-file: fix --batch report changed-type bug
"git cat-file --batch-all-objects --batch=batman" will trigger a bug:
"fatal: object xxx changed type!?"
Although we will replace the logic here in the future, this patch can
help the old git maintain its functionality.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-965%2Fadlternative%2Fcat-file-batch-bug-fix-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-965/adlternative/cat-file-batch-bug-fix-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/965
builtin/cat-file.c | 11 ++++++-----
t/t1006-cat-file.sh | 6 ++++++
2 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/builtin/cat-file.c b/builtin/cat-file.c
index 5ebf13359e83..5f9578f9b86b 100644
--- a/builtin/cat-file.c
+++ b/builtin/cat-file.c
@@ -345,11 +345,12 @@ static void print_object_or_die(struct batch_options *opt, struct expand_data *d
contents = read_object_file(oid, &type, &size);
if (!contents)
die("object %s disappeared", oid_to_hex(oid));
- if (type != data->type)
- die("object %s changed type!?", oid_to_hex(oid));
- if (data->info.sizep && size != data->size)
- die("object %s changed size!?", oid_to_hex(oid));
-
+ if (!(opt->all_objects && data->skip_object_info)) {
+ if (type != data->type)
+ die("object %s changed type!?", oid_to_hex(oid));
+ if (data->info.sizep && size != data->size)
+ die("object %s changed size!?", oid_to_hex(oid));
+ }
batch_write(opt, contents, size);
free(contents);
}
diff --git a/t/t1006-cat-file.sh b/t/t1006-cat-file.sh
index 5d2dc99b74ad..9b0f1ae5ef8b 100755
--- a/t/t1006-cat-file.sh
+++ b/t/t1006-cat-file.sh
@@ -586,4 +586,10 @@ test_expect_success 'cat-file --unordered works' '
test_cmp expect actual
'
+test_expect_success 'cat-file --batch="batman" with --batch-all-objects will work' '
+ git -C all-two cat-file --batch-all-objects --batch="%(objectname)" | wc -l >expect &&
+ git -C all-two cat-file --batch-all-objects --batch="batman" | wc -l >actual &&
+ test_cmp expect actual
+'
+
test_done
base-commit: 5d5b1473453400224ebb126bf3947e0a3276bdf5
--
gitgitgadget
next reply other threads:[~2021-05-30 8:29 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-30 8:29 ZheNing Hu via GitGitGadget [this message]
2021-05-30 21:09 ` [PATCH] [GSOC] cat-file: fix --batch report changed-type bug Jeff King
2021-05-31 13:20 ` ZheNing Hu
2021-05-31 14:44 ` Jeff King
2021-05-31 15:32 ` ZheNing Hu
2021-05-31 16:07 ` Felipe Contreras
2021-06-01 1:49 ` Jeff King
2021-06-01 6:34 ` Felipe Contreras
2021-06-01 15:34 ` Jeff King
2021-06-01 16:42 ` Felipe Contreras
2021-06-01 12:46 ` ZheNing Hu
2021-05-30 21:15 ` Junio C Hamano
2021-05-30 21:36 ` Jeff King
2021-06-01 1:40 ` Junio C Hamano
2021-05-31 13:55 ` ZheNing Hu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.965.git.1622363366722.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=adlternative@gmail.com \
--cc=christian.couder@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=hariom18599@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.