diff options
author | Jeff King <peff@peff.net> | 2017-01-16 16:25:35 -0500 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-01-17 12:49:41 -0800 |
commit | b4584e4f665f59f51572f479db6baf1a1cdbc03a (patch) | |
tree | 7b7a24bc811699b7b75e786916690aa429a46694 /t | |
parent | 1ada11ee62658ff4366d93b97995eea055827171 (diff) | |
download | git-b4584e4f665f59f51572f479db6baf1a1cdbc03a.tar.gz |
fsck: report trees as dangling
After checking connectivity, fsck looks through the list of
any objects we've seen mentioned, and reports unreachable
and un-"used" ones as dangling. However, it skips any object
which is not marked as "parsed", as that is an object that
we _don't_ have (but that somebody mentioned).
Since 6e454b9a3 (clear parsed flag when we free tree
buffers, 2013-06-05), that flag can't be relied on, and the
correct method is to check the HAS_OBJ flag. The cleanup in
that commit missed this callsite, though. As a result, we
would generally fail to report dangling trees.
We never noticed because there were no tests in this area
(for trees or otherwise). Let's add some.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 't')
-rwxr-xr-x | t/t1450-fsck.sh | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh index 6eef8b28ed..e88ec7747b 100755 --- a/t/t1450-fsck.sh +++ b/t/t1450-fsck.sh @@ -559,4 +559,31 @@ test_expect_success 'fsck --name-objects' ' ) ' +# for each of type, we have one version which is referenced by another object +# (and so while unreachable, not dangling), and another variant which really is +# dangling. +test_expect_success 'fsck notices dangling objects' ' + git init dangling && + ( + cd dangling && + blob=$(echo not-dangling | git hash-object -w --stdin) && + dblob=$(echo dangling | git hash-object -w --stdin) && + tree=$(printf "100644 blob %s\t%s\n" $blob one | git mktree) && + dtree=$(printf "100644 blob %s\t%s\n" $blob two | git mktree) && + commit=$(git commit-tree $tree) && + dcommit=$(git commit-tree -p $commit $tree) && + + cat >expect <<-EOF && + dangling blob $dblob + dangling commit $dcommit + dangling tree $dtree + EOF + + git fsck >actual && + # the output order is non-deterministic, as it comes from a hash + sort <actual >actual.sorted && + test_cmp expect actual.sorted + ) +' + test_done |