Message ID | 259b1b559114ab1a9a0bd7f1ad29a4cba2612ae0.1687617197.git.me@ttaylorr.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] t7701: make annotated tag unreachable | expand |
On Sat, Jun 24, 2023 at 10:33:47AM -0400, Taylor Blau wrote: > 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> > --- > Fixes a trivial oversight from an earlier version of this patch noticed > by Peff. Thanks, this looks great to me. -Peff
diff --git a/t/t7701-repack-unpack-unreachable.sh b/t/t7701-repack-unpack-unreachable.sh index ba428c18a8..fe6c3e77a3 100755 --- a/t/t7701-repack-unpack-unreachable.sh +++ b/t/t7701-repack-unpack-unreachable.sh @@ -126,8 +126,18 @@ test_expect_success 'gc.recentObjectsHook' ' git cat-file -p $obj2 && git cat-file -p $obj3 && - git tag -a -m tag obj2-tag $obj2 && - obj2_tag="$(git rev-parse obj2-tag)" && + # make an unreachable annotated tag object to ensure we rescue objects + # which are reachable from non-pruned unreachable objects + 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 +146,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 &&
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> --- Fixes a trivial oversight from an earlier version of this patch noticed by Peff. Range-diff against v1: 1: 48d3c2c187 ! 1: 259b1b5591 t7701: make annotated tag unreachable @@ t/t7701-repack-unpack-unreachable.sh: test_expect_success 'gc.recentObjectsHook' git cat-file -p $obj2 && git cat-file -p $obj3 && +- git tag -a -m tag obj2-tag $obj2 && +- obj2_tag="$(git rev-parse obj2-tag)" && + # 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 t/t7701-repack-unpack-unreachable.sh | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) -- 2.40.1.479.g48d3c2c187.dirty