55 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/bin/sh
 | |
| 
 | |
| test_description='fetch performance with many packs
 | |
| 
 | |
| It is common for fetch to consider objects that we might not have, and it is an
 | |
| easy mistake for the code to use a function like `parse_object` that might
 | |
| give the correct _answer_ on such an object, but do so slowly (due to
 | |
| re-scanning the pack directory for lookup failures).
 | |
| 
 | |
| The resulting performance drop can be hard to notice in a real repository, but
 | |
| becomes quite large in a repository with a large number of packs. So this
 | |
| test creates a more pathological case, since any mistakes would produce a more
 | |
| noticeable slowdown.
 | |
| '
 | |
| . ./perf-lib.sh
 | |
| . "$TEST_DIRECTORY"/perf/lib-pack.sh
 | |
| 
 | |
| test_expect_success 'create parent and child' '
 | |
| 	git init parent &&
 | |
| 	git clone parent child
 | |
| '
 | |
| 
 | |
| 
 | |
| test_expect_success 'create refs in the parent' '
 | |
| 	(
 | |
| 		cd parent &&
 | |
| 		git commit --allow-empty -m foo &&
 | |
| 		head=$(git rev-parse HEAD) &&
 | |
| 		test_seq 1000 |
 | |
| 		sed "s,.*,update refs/heads/& $head," |
 | |
| 		$MODERN_GIT update-ref --stdin
 | |
| 	)
 | |
| '
 | |
| 
 | |
| test_expect_success 'create many packs in the child' '
 | |
| 	(
 | |
| 		cd child &&
 | |
| 		setup_many_packs
 | |
| 	)
 | |
| '
 | |
| 
 | |
| test_perf 'fetch' '
 | |
| 	# start at the same state for each iteration
 | |
| 	obj=$($MODERN_GIT -C parent rev-parse HEAD) &&
 | |
| 	(
 | |
| 		cd child &&
 | |
| 		$MODERN_GIT for-each-ref --format="delete %(refname)" refs/remotes |
 | |
| 		$MODERN_GIT update-ref --stdin &&
 | |
| 		rm -vf .git/objects/$(echo $obj | sed "s|^..|&/|") &&
 | |
| 
 | |
| 		git fetch
 | |
| 	)
 | |
| '
 | |
| 
 | |
| test_done
 |