Skip to content

Commit

Permalink
revision traversal and pack: notice and die on missing commit
Browse files Browse the repository at this point in the history
cc0e6c5 (Handle return code of parse_commit in revision machinery,
2007-05-04) attempted to tighten error checking in the revision machinery,
but it wasn't enough.  When get_revision_1() was asked for the next commit
to return, it tries to read and simplify the parents of the commit to be
returned, but an error while doing so was silently ignored and reported as
a truncated history to the caller instead.

This resulted in an early end of "git log" output or a pack that lacks
older commits from "git pack-objects", without any error indication in the
exit status from these commands, even though the underlying parse_commit()
issues an error message to the end user.

Note that the codepath in add_parents_list() that paints parents of an
UNINTERESTING commit UNINTERESTING silently ignores the error when
parse_commit() fails; this is deliberate and in line with aeeae1b
(revision traversal: allow UNINTERESTING objects to be missing,
2009-01-27).

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Feb 11, 2009
1 parent 34b146c commit ed62089
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 2 deletions.
6 changes: 4 additions & 2 deletions revision.c
Original file line number Diff line number Diff line change
Expand Up @@ -1484,14 +1484,16 @@ static struct commit *get_revision_1(struct rev_info *revs)
(commit->date < revs->max_age))
continue;
if (add_parents_to_list(revs, commit, &revs->commits) < 0)
return NULL;
die("Failed to traverse parents of commit %s",
sha1_to_hex(commit->object.sha1));
}

switch (simplify_commit(revs, commit)) {
case commit_ignore:
continue;
case commit_error:
return NULL;
die("Failed to simplify parents of commit %s",
sha1_to_hex(commit->object.sha1));
default:
return commit;
}
Expand Down
39 changes: 39 additions & 0 deletions t/t5307-pack-missing-commit.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/bin/sh

test_description='pack should notice missing commit objects'

. ./test-lib.sh

test_expect_success setup '
for i in 1 2 3 4 5
do
echo "$i" >"file$i" &&
git add "file$i" &&
test_tick &&
git commit -m "$i" &&
git tag "tag$i"
done &&
obj=$(git rev-parse --verify tag3) &&
fanout=$(expr "$obj" : "\(..\)") &&
remainder=$(expr "$obj" : "..\(.*\)") &&
rm -f ".git/objects/$fanout/$remainder"
'

test_expect_success 'check corruption' '
test_must_fail git fsck
'

test_expect_success 'rev-list notices corruption (1)' '
test_must_fail git rev-list HEAD
'

test_expect_success 'rev-list notices corruption (2)' '
test_must_fail git rev-list --objects HEAD
'

test_expect_success 'pack-objects notices corruption' '
echo HEAD |
test_must_fail git pack-objects --revs pack
'

test_done

0 comments on commit ed62089

Please sign in to comment.