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

[PATCH] t7701: make annotated tag unreachable

From
Taylor Blau <me@ttaylorr.com>
Date
Jun 21, 2023, 10:21 UTC
Message-ID
<48d3c2c1871c8122d22fbce7c256ca65582fcd67.1687342818.git.me@ttaylorr.com>

In 4dc16e2cb0 (gc: introduce `gc.recentObjectsHook`, 2023-06-07), we added tests to ensure that prune-able (i.e. unreachable and with mtime older than the cutoff) objects which are marked as recent via the new `gc.recentObjectsHook` configuration are unpacked as loose with `--unpack-unreachable`.

In that test, we also ensure that objects which are reachable from other unreachable objects which were *not* pruned are kept as well, regardless of their mtimes. For this, we use an annotated tag pointing at a blob ($obj2) which would otherwise be pruned.

But after pruning, that object is kept around for two reasons. One, the tag object's mtime wasn't adjusted to be beyond the 1-hour cutoff, so it would be kept as due to its recency regardless. The other reason is because the tag itself is reachable.

Use mktag to write the tag object directly without pointing a reference at it, and adjust the mtime of the tag object to be older than the cutoff to ensure that our `gc.recentObjectsHook` configuration is working as intended.

Noticed-by: Jeff King <peff@peff.net>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
---
Peff pointed this out to me after the gc.recentObjectsHook stuff was in
'next', but this should go on top. This patch is based off of the tip of
"tb/gc-recent-object-hook".
 t/t7701-repack-unpack-unreachable.sh | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/t/t7701-repack-unpack-unreachable.sh b/t/t7701-repack-unpack-unreachable.sh
index ba428c18a8..ceb4e805d2 100755
--- a/t/t7701-repack-unpack-unreachable.sh
+++ b/t/t7701-repack-unpack-unreachable.sh
@@ -126,8 +126,19 @@ test_expect_success 'gc.recentObjectsHook' '
 	git cat-file -p $obj2 &&
 	git cat-file -p $obj3 &&

+	# make an unreachable annotated tag object to ensure we rescue objects
+	# which are reachable from non-pruned unreachable objects
 	git tag -a -m tag obj2-tag $obj2 &&
-	obj2_tag="$(git rev-parse obj2-tag)" &&
+	obj2_tag="$(git mktag <<-EOF
+	object $obj2
+	type blob
+	tag obj2-tag
+	tagger T A Gger <tagger@example.com> 1234567890 -0000
+	EOF
+	)" &&
+
+	obj2_tag_pack="$(echo $obj2_tag | git pack-objects .git/objects/pack/pack)" &&
+	git prune-packed &&

 	write_script precious-objects <<-EOF &&
 	echo $obj2_tag
@@ -136,6 +147,7 @@ test_expect_success 'gc.recentObjectsHook' '

 	test-tool chmtime =-86400 .git/objects/pack/pack-$pack2.pack &&
 	test-tool chmtime =-86400 .git/objects/pack/pack-$pack3.pack &&
+	test-tool chmtime =-86400 .git/objects/pack/pack-$obj2_tag_pack.pack &&
 	git repack -A -d --unpack-unreachable=1.hour.ago &&

 	git cat-file -p $obj1 &&
--
2.40.1.478.g4dc16e2cb0
Next: Jeff King
Message 1 of 4 in “t7701: make annotated tag unreachable”
  1. t7701: make annotated tag unreachableTaylor Blau, Jun 21, 2023
  2. Jeff KingJun 24, 2023
  3. t7701: make annotated tag unreachableTaylor Blau, Jun 24, 2023
  4. Jeff KingJun 27, 2023

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.