git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2] cache-tree: do not lazy-fetch merge tree

From
JTJonathan Tan <jonathantanmy@google.com>
Date
Sep 9, 2019, 19:01 UTC
Message-ID
<20190909190130.146613-1-jonathantanmy@google.com>
In-Reply-To
<20190903194247.217964-1-jonathantanmy@google.com>

When cherry-picking (for example), new trees may be constructed. During this process, Git constructs the new tree in a struct strbuf, computes the OID of the new tree, and checks if the new OID already exists on disk. However, in a partial clone, the disk check causes a lazy fetch to occur, which is both unnecessary (because we have the tree in the struct strbuf) and likely to fail (because the remote probably doesn't have this tree).

Do not lazy fetch in this situation.
Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
---
As requested in What's Cooking [1], here's a patch with an updated
commit message. Otherwise, the patch is exactly the same.
[1] https://public-inbox.org/git/xmqqd0gcm2zm.fsf@gitster-ct.c.googlers.com/
---
 cache-tree.c             |  2 +-
 t/t0410-partial-clone.sh | 14 ++++++++++++++
 2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/cache-tree.c b/cache-tree.c
index c22161f987..9e596893bc 100644
--- a/cache-tree.c
+++ b/cache-tree.c
@@ -407,7 +407,7 @@ static int update_one(struct cache_tree *it,
 	if (repair) {
 		struct object_id oid;
 		hash_object_file(buffer.buf, buffer.len, tree_type, &oid);
-		if (has_object_file(&oid))
+		if (has_object_file_with_flags(&oid, OBJECT_INFO_SKIP_FETCH_OBJECT))
 			oidcpy(&it->oid, &oid);
 		else
 			to_invalidate = 1;
diff --git a/t/t0410-partial-clone.sh b/t/t0410-partial-clone.sh
index 6415063980..3e434b6a81 100755
--- a/t/t0410-partial-clone.sh
+++ b/t/t0410-partial-clone.sh
@@ -492,6 +492,20 @@ test_expect_success 'gc stops traversal when a missing but promised object is re
 	! grep "$TREE_HASH" out
 '
 
+test_expect_success 'do not fetch when checking existence of tree we construct ourselves' '
+	rm -rf repo &&
+	test_create_repo repo &&
+	test_commit -C repo base &&
+	test_commit -C repo side1 &&
+	git -C repo checkout base &&
+	test_commit -C repo side2 &&
+
+	git -C repo config core.repositoryformatversion 1 &&
+	git -C repo config extensions.partialclone "arbitrary string" &&
+
+	git -C repo cherry-pick side1
+'
+
 . "$TEST_DIRECTORY"/lib-httpd.sh
 start_httpd
 
-- 
2.23.0.162.g0b9fbb3734-goog
Previous: Junio C HamanoNext: Junio C Hamano
Message 5 of 12 in “cache-tree: do not lazy-fetch merge tree”
  1. cache-tree: do not lazy-fetch merge treeJonathan Tan, Sep 3, 2019
  2. Derrick StoleeSep 4, 2019
  3. Jonathan TanSep 4, 2019
  4. Junio C HamanoSep 4, 2019
  5. cache-tree: do not lazy-fetch merge treeJonathan Tan, Sep 9, 2019
  6. Junio C HamanoSep 9, 2019
  7. Junio C HamanoSep 9, 2019
  8. Jeff KingSep 9, 2019
  9. Junio C HamanoSep 10, 2019
  10. Jonathan TanSep 10, 2019
  11. SZEDER GáborSep 10, 2019
  12. Jonathan TanSep 10, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.