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
|
* to complain about it being unreachable (since it does
|
||||||
* not exist).
|
* not exist).
|
||||||
*/
|
*/
|
||||||
if (!obj->parsed)
|
if (!(obj->flags & HAS_OBJ))
|
||||||
return;
|
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
|
test_done
|
||||||
|
Loading…
x
Reference in New Issue
Block a user