#!/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 ' # 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 evethough a commit/tree # might be skipped, its blob must be accounted for. if [ $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 test_done