From: "Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Patrick Steinhardt <ps@pks.im>,
Eric Sunshine <sunshine@sunshineco.com>,
Johannes Schindelin <johannes.schindelin@gmx.de>
Subject: [PATCH v3 0/5] merge-tree: handle missing objects correctly
Date: Thu, 22 Feb 2024 14:36:40 +0000 [thread overview]
Message-ID: <pull.1651.v3.git.1708612605.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1651.v2.git.1707324461.gitgitgadget@gmail.com>
I recently looked into issues where git merge-tree calls returned bogus data
(in one instance returning an empty tree for non-empty merge parents). By
the time I had a look at the corresponding repository, the issue was no
longer reproducible, but a closer look at the code combined with some manual
experimenting turned up the fact that missing tree objects aren't handled as
errors by git merge-tree.
While at it, I added a commit on top that tries to catch all remaining
unchecked parse_tree() calls.
This patch series is based on 5f43cf5b2e4 (merge-tree: accept 3 trees as
arguments, 2024-01-28) (the original tip commit of js/merge-tree-3-trees)
because I introduced three unchecked parse_tree() calls in that topic.
Changes since v2:
* Fixed the new "missing tree object" test case in t4301 that succeeded for
the wrong reason.
* Adjusted the new "missing blob object" test case to avoid succeeding for
the wrong reason.
* Simplified the "missing blob object" test case.
Changes since v1:
* Simplified the test case, avoiding a subshell and a pipe in the process.
* Added a patch to remove a superfluous subtree->object.parsed guard around
a parse_tree(subtree) call.
Johannes Schindelin (5):
merge-tree: fail with a non-zero exit code on missing tree objects
merge-ort: do check `parse_tree()`'s return value
t4301: verify that merge-tree fails on missing blob objects
Always check `parse_tree*()`'s return value
cache-tree: avoid an unnecessary check
builtin/checkout.c | 19 ++++++++++++++++---
builtin/clone.c | 3 ++-
builtin/commit.c | 3 ++-
builtin/merge-tree.c | 6 ++++++
builtin/read-tree.c | 3 ++-
builtin/reset.c | 4 ++++
cache-tree.c | 4 ++--
merge-ort.c | 16 +++++++++++-----
merge-recursive.c | 3 ++-
merge.c | 5 ++++-
reset.c | 5 +++++
sequencer.c | 4 ++++
t/t4301-merge-tree-write-tree.sh | 27 +++++++++++++++++++++++++++
13 files changed, 87 insertions(+), 15 deletions(-)
base-commit: 5f43cf5b2e4b68386d3774bce880b0f74d801635
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1651%2Fdscho%2Fmerge-tree-and-missing-objects-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1651/dscho/merge-tree-and-missing-objects-v3
Pull-Request: https://github.com/gitgitgadget/git/pull/1651
Range-diff vs v2:
1: 01dfd66568c ! 1: 11b9cd8c5da merge-tree: fail with a non-zero exit code on missing tree objects
@@ t/t4301-merge-tree-write-tree.sh: test_expect_success '--merge-base with tree OI
+test_expect_success 'error out on missing tree objects' '
+ git init --bare missing-tree.git &&
+ git rev-list side3 >list &&
-+ git rev-parse side3^: >list &&
++ git rev-parse side3^: >>list &&
+ git pack-objects missing-tree.git/objects/pack/side3-tree-is-missing <list &&
+ side3=$(git rev-parse side3) &&
-+ test_must_fail git --git-dir=missing-tree.git merge-tree $side3^ $side3 >actual &&
++ test_must_fail git --git-dir=missing-tree.git merge-tree $side3^ $side3 >actual 2>err &&
++ test_grep "Could not read $(git rev-parse $side3:)" err &&
+ test_must_be_empty actual
+'
+
2: a1bbb7e06e5 = 2: f01f4eb011b merge-ort: do check `parse_tree()`'s return value
3: be1dadf2850 ! 3: e82fdf7fbcb t4301: verify that merge-tree fails on missing blob objects
@@ t/t4301-merge-tree-write-tree.sh: test_expect_success 'error out on missing tree
'
+test_expect_success 'error out on missing blob objects' '
-+ seq1=$(test_seq 1 10 | git hash-object -w --stdin) &&
-+ seq2=$(test_seq 1 11 | git hash-object -w --stdin) &&
-+ seq3=$(test_seq 0 10 | git hash-object -w --stdin) &&
-+ tree1=$(printf "100644 blob %s\tsequence" $seq1 | git mktree) &&
-+ tree2=$(printf "100644 blob %s\tsequence" $seq2 | git mktree) &&
-+ tree3=$(printf "100644 blob %s\tsequence" $seq3 | git mktree) &&
++ echo 1 | git hash-object -w --stdin >blob1 &&
++ echo 2 | git hash-object -w --stdin >blob2 &&
++ echo 3 | git hash-object -w --stdin >blob3 &&
++ printf "100644 blob $(cat blob1)\tblob\n" | git mktree >tree1 &&
++ printf "100644 blob $(cat blob2)\tblob\n" | git mktree >tree2 &&
++ printf "100644 blob $(cat blob3)\tblob\n" | git mktree >tree3 &&
+ git init --bare missing-blob.git &&
-+ test_write_lines $seq1 $seq3 $tree1 $tree2 $tree3 |
++ cat blob1 blob3 tree1 tree2 tree3 |
+ git pack-objects missing-blob.git/objects/pack/side1-whatever-is-missing &&
-+ test_must_fail git --git-dir=missing-blob.git merge-tree --merge-base=$tree1 $tree2 $tree3 >actual &&
++ test_must_fail git --git-dir=missing-blob.git >actual 2>err \
++ merge-tree --merge-base=$(cat tree1) $(cat tree2) $(cat tree3) &&
++ test_grep "unable to read blob object $(cat blob2)" err &&
+ test_must_be_empty actual
+'
+
4: ffd38ad602a = 4: 9e4dc94ef03 Always check `parse_tree*()`'s return value
5: 43c04749513 = 5: 91dc4ccd04e cache-tree: avoid an unnecessary check
--
gitgitgadget
next prev parent reply other threads:[~2024-02-22 14:36 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-06 9:49 [PATCH 0/4] merge-tree: handle missing objects correctly Johannes Schindelin via GitGitGadget
2024-02-06 9:49 ` [PATCH 1/4] merge-tree: fail with a non-zero exit code on missing tree objects Johannes Schindelin via GitGitGadget
2024-02-07 7:42 ` Patrick Steinhardt
2024-02-06 9:49 ` [PATCH 2/4] merge-ort: do check `parse_tree()`'s return value Johannes Schindelin via GitGitGadget
2024-02-06 9:49 ` [PATCH 3/4] t4301: verify that merge-tree fails on missing blob objects Johannes Schindelin via GitGitGadget
2024-02-06 9:49 ` [PATCH 4/4] Always check `parse_tree*()`'s return value Johannes Schindelin via GitGitGadget
2024-02-06 22:07 ` Junio C Hamano
2024-02-07 7:42 ` Patrick Steinhardt
2024-02-06 21:12 ` [PATCH 0/4] merge-tree: handle missing objects correctly Junio C Hamano
2024-02-07 7:42 ` Patrick Steinhardt
2024-02-07 16:47 ` [PATCH v2 0/5] " Johannes Schindelin via GitGitGadget
2024-02-07 16:47 ` [PATCH v2 1/5] merge-tree: fail with a non-zero exit code on missing tree objects Johannes Schindelin via GitGitGadget
2024-02-07 17:02 ` Eric Sunshine
2024-02-22 14:09 ` Johannes Schindelin
2024-02-07 16:47 ` [PATCH v2 2/5] merge-ort: do check `parse_tree()`'s return value Johannes Schindelin via GitGitGadget
2024-02-07 16:47 ` [PATCH v2 3/5] t4301: verify that merge-tree fails on missing blob objects Johannes Schindelin via GitGitGadget
2024-02-07 17:24 ` Eric Sunshine
2024-02-07 21:24 ` Junio C Hamano
2024-02-08 0:52 ` Eric Sunshine
2024-02-22 14:12 ` Johannes Schindelin
2024-02-07 16:47 ` [PATCH v2 4/5] Always check `parse_tree*()`'s return value Johannes Schindelin via GitGitGadget
2024-02-07 17:26 ` Eric Sunshine
2024-02-22 14:08 ` Johannes Schindelin
2024-02-22 17:05 ` Junio C Hamano
2024-02-07 16:47 ` [PATCH v2 5/5] cache-tree: avoid an unnecessary check Johannes Schindelin via GitGitGadget
2024-02-07 16:58 ` Junio C Hamano
2024-02-22 14:36 ` Johannes Schindelin via GitGitGadget [this message]
2024-02-22 14:36 ` [PATCH v3 1/5] merge-tree: fail with a non-zero exit code on missing tree objects Johannes Schindelin via GitGitGadget
2024-02-22 17:13 ` Junio C Hamano
2024-02-22 14:36 ` [PATCH v3 2/5] merge-ort: do check `parse_tree()`'s return value Johannes Schindelin via GitGitGadget
2024-02-22 17:18 ` Junio C Hamano
2024-02-22 14:36 ` [PATCH v3 3/5] t4301: verify that merge-tree fails on missing blob objects Johannes Schindelin via GitGitGadget
2024-02-22 17:27 ` Junio C Hamano
2024-02-22 18:23 ` Junio C Hamano
2024-02-22 14:36 ` [PATCH v3 4/5] Always check `parse_tree*()`'s return value Johannes Schindelin via GitGitGadget
2024-02-22 17:58 ` Junio C Hamano
2024-02-23 8:33 ` Johannes Schindelin
2024-02-23 17:17 ` Junio C Hamano
2024-02-22 14:36 ` [PATCH v3 5/5] cache-tree: avoid an unnecessary check Johannes Schindelin via GitGitGadget
2024-02-22 18:00 ` Junio C Hamano
2024-02-23 8:34 ` [PATCH v4 0/6] merge-tree: handle missing objects correctly Johannes Schindelin via GitGitGadget
2024-02-23 8:34 ` [PATCH v4 1/6] merge-tree: fail with a non-zero exit code on missing tree objects Johannes Schindelin via GitGitGadget
2024-02-23 8:34 ` [PATCH v4 2/6] merge-ort: do check `parse_tree()`'s return value Johannes Schindelin via GitGitGadget
2024-02-23 8:34 ` [PATCH v4 3/6] t4301: verify that merge-tree fails on missing blob objects Johannes Schindelin via GitGitGadget
2024-02-23 8:34 ` [PATCH v4 4/6] Always check `parse_tree*()`'s return value Johannes Schindelin via GitGitGadget
2024-02-23 8:34 ` [PATCH v4 5/6] cache-tree: avoid an unnecessary check Johannes Schindelin via GitGitGadget
2024-02-23 8:34 ` [PATCH v4 6/6] fill_tree_descriptor(): mark error message for translation Johannes Schindelin via GitGitGadget
2024-02-23 18:23 ` [PATCH v4 0/6] merge-tree: handle missing objects correctly Junio C Hamano
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.1651.v3.git.1708612605.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=johannes.schindelin@gmx.de \
--cc=ps@pks.im \
--cc=sunshine@sunshineco.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.