| #!/bin/sh |
| |
| test_description='handling of missing objects in rev-list' |
| |
| TEST_PASSES_SANITIZE_LEAK=true |
| . ./test-lib.sh |
| |
| # We setup the repository with two commits, this way HEAD is always |
| # available and we can hide commit 1. |
| test_expect_success 'create repository and alternate directory' ' |
| test_commit 1 && |
| test_commit 2 && |
| test_commit 3 && |
| git tag -m "tag message" annot_tag HEAD~1 && |
| git tag regul_tag HEAD~1 && |
| git branch a_branch HEAD~1 |
| ' |
| |
| # We manually corrupt the repository, which means that the commit-graph may |
| # contain references to already-deleted objects. We thus need to enable |
| # commit-graph paranoia to not returned these deleted commits from the graph. |
| GIT_COMMIT_GRAPH_PARANOIA=true |
| export GIT_COMMIT_GRAPH_PARANOIA |
| |
| for obj in "HEAD~1" "HEAD~1^{tree}" "HEAD:1.t" |
| do |
| test_expect_success "rev-list --missing=error fails with missing object $obj" ' |
| oid="$(git rev-parse $obj)" && |
| path=".git/objects/$(test_oid_to_path $oid)" && |
| |
| mv "$path" "$path.hidden" && |
| test_when_finished "mv $path.hidden $path" && |
| |
| test_must_fail git rev-list --missing=error --objects \ |
| --no-object-names HEAD |
| ' |
| done |
| |
| for obj in "HEAD~1" "HEAD~1^{tree}" "HEAD:1.t" |
| do |
| for action in "allow-any" "print" |
| do |
| test_expect_success "rev-list --missing=$action with missing $obj" ' |
| oid="$(git rev-parse $obj)" && |
| path=".git/objects/$(test_oid_to_path $oid)" && |
| |
| # Before the object is made missing, we use rev-list to |
| # get the expected oids. |
| git rev-list --objects --no-object-names \ |
| HEAD ^$obj >expect.raw && |
| |
| # Blobs are shared by all commits, so even though a commit/tree |
| # might be skipped, its blob must be accounted for. |
| if test $obj != "HEAD:1.t" |
| then |
| echo $(git rev-parse HEAD:1.t) >>expect.raw && |
| echo $(git rev-parse HEAD:2.t) >>expect.raw |
| fi && |
| |
| mv "$path" "$path.hidden" && |
| test_when_finished "mv $path.hidden $path" && |
| |
| git rev-list --missing=$action --objects --no-object-names \ |
| HEAD >actual.raw && |
| |
| # When the action is to print, we should also add the missing |
| # oid to the expect list. |
| case $action in |
| allow-any) |
| ;; |
| print) |
| grep ?$oid actual.raw && |
| echo ?$oid >>expect.raw |
| ;; |
| esac && |
| |
| sort actual.raw >actual && |
| sort expect.raw >expect && |
| test_cmp expect actual |
| ' |
| done |
| done |
| |
| for missing_tip in "annot_tag" "regul_tag" "a_branch" "HEAD~1" "HEAD~1^{tree}" "HEAD:1.t" |
| do |
| # We want to check that things work when both |
| # - all the tips passed are missing (case existing_tip = ""), and |
| # - there is one missing tip and one existing tip (case existing_tip = "HEAD") |
| for existing_tip in "" "HEAD" |
| do |
| for action in "allow-any" "print" |
| do |
| test_expect_success "--missing=$action with tip '$missing_tip' missing and tip '$existing_tip'" ' |
| # Before the object is made missing, we use rev-list to |
| # get the expected oids. |
| if test "$existing_tip" = "HEAD" |
| then |
| git rev-list --objects --no-object-names \ |
| HEAD ^$missing_tip >expect.raw |
| else |
| >expect.raw |
| fi && |
| |
| # Blobs are shared by all commits, so even though a commit/tree |
| # might be skipped, its blob must be accounted for. |
| if test "$existing_tip" = "HEAD" && test $missing_tip != "HEAD:1.t" |
| then |
| echo $(git rev-parse HEAD:1.t) >>expect.raw && |
| echo $(git rev-parse HEAD:2.t) >>expect.raw |
| fi && |
| |
| missing_oid="$(git rev-parse $missing_tip)" && |
| |
| if test "$missing_tip" = "annot_tag" |
| then |
| oid="$(git rev-parse $missing_tip^{commit})" && |
| echo "$missing_oid" >>expect.raw |
| else |
| oid="$missing_oid" |
| fi && |
| |
| path=".git/objects/$(test_oid_to_path $oid)" && |
| |
| mv "$path" "$path.hidden" && |
| test_when_finished "mv $path.hidden $path" && |
| |
| git rev-list --missing=$action --objects --no-object-names \ |
| $missing_oid $existing_tip >actual.raw && |
| |
| # When the action is to print, we should also add the missing |
| # oid to the expect list. |
| case $action in |
| allow-any) |
| ;; |
| print) |
| grep ?$oid actual.raw && |
| echo ?$oid >>expect.raw |
| ;; |
| esac && |
| |
| sort actual.raw >actual && |
| sort expect.raw >expect && |
| test_cmp expect actual |
| ' |
| done |
| done |
| done |
| |
| test_done |