revision.c: ignore broken tags with ignore_missing_links

When peeling a tag for prepare_revision_walk(), we do not
respect the ignore_missing_links flag. This can lead to a
bogus error when pack-objects walks the possibly-broken
unreachable-but-recent part of the object graph.

The other link-following all happens via traverse_commit_list(),
which explains why this case was missed. And our tests
covered only broken links from commits. Let's be more
comprehensive and cover broken tree entries (which do work)
and tags (which shows off this bug).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2017-05-20 04:30:25 -04:00 committed by Junio C Hamano
parent 840ed14198
commit a3ba6bf10a
2 changed files with 27 additions and 2 deletions

View File

@ -230,7 +230,7 @@ static struct commit *handle_commit(struct rev_info *revs,
die("bad tag");
object = parse_object(tag->tagged->oid.hash);
if (!object) {
if (flags & UNINTERESTING)
if (revs->ignore_missing_links || (flags & UNINTERESTING))
return NULL;
die("bad object %s", oid_to_hex(&tag->tagged->oid));
}

View File

@ -129,7 +129,7 @@ for repack in '' true; do
'
done
test_expect_success 'do not complain about existing broken links' '
test_expect_success 'do not complain about existing broken links (commit)' '
cat >broken-commit <<-\EOF &&
tree 0000000000000000000000000000000000000001
parent 0000000000000000000000000000000000000002
@ -144,4 +144,29 @@ test_expect_success 'do not complain about existing broken links' '
test_must_be_empty stderr
'
test_expect_success 'do not complain about existing broken links (tree)' '
cat >broken-tree <<-\EOF &&
100644 blob 0000000000000000000000000000000000000003 foo
EOF
tree=$(git mktree --missing <broken-tree) &&
git gc 2>stderr &&
git cat-file -e $tree &&
test_must_be_empty stderr
'
test_expect_success 'do not complain about existing broken links (tag)' '
cat >broken-tag <<-\EOF &&
object 0000000000000000000000000000000000000004
type commit
tag broken
tagger whatever <whatever@example.com> 1234 -0000
this is a broken tag
EOF
tag=$(git hash-object -t tag -w broken-tag) &&
git gc 2>stderr &&
git cat-file -e $tag &&
test_must_be_empty stderr
'
test_done