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>
This commit is contained in:
parent
1ada11ee62
commit
b4584e4f66
@ -225,7 +225,7 @@ static void check_unreachable_object(struct object *obj)
|
||||
* to complain about it being unreachable (since it does
|
||||
* not exist).
|
||||
*/
|
||||
if (!obj->parsed)
|
||||
if (!(obj->flags & HAS_OBJ))
|
||||
return;
|
||||
|
||||
/*
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user