81 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
| #!/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
 |