 16652170bf
			
		
	
	16652170bf
	
	
	
		
			
			This script creates two separate histories, A and B, each of
which does:
      (A0, B0): create fileA and subdir/fileB
      (A1, B1): modify fileA
      (A2, B2): modify subdir/fileB
and then grafts them together to make B0 a child of A2.  So
the final history looks like (time flows from top to bottom):
		true parent	touches subdir?
	A0	none		yes (creates it)
        A1      A0		no
        A2	A1		yes
        B0	none		yes (different from what's in A2)
        B1	B0		no
        B2	B1		yes
"git rev-list --parents --pretty=raw B2" would give "fake"
parents on the "commit " header lines while "parent " header
lines show the parent as recorded in the commit object (i.e. B0
appears to have A2 as its parent on "commit " header but there
is no "parent A2" header line in it).
When you have path limiters, we simplify history to omit
commits that do not affect the specified paths.
So "git rev-list --parents --pretty=raw B2 subdir" would return
"B2 B0 A2 A0" (because B1 and A1 do not touch the path).  When
it does so, the "commit " header lines have "fake" parents
(i.e. B2 appears to have B0 as its parent on "commit " header),
but you can still get the true parents by looking at "parent "
header.
Signed-off-by: Junio C Hamano <junkio@cox.net>
		
	
		
			
				
	
	
		
			114 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/sh
 | |
| 
 | |
| test_description='Revision traversal vs grafts and path limiter'
 | |
| 
 | |
| . ./test-lib.sh
 | |
| 
 | |
| test_expect_success setup '
 | |
| 	mkdir subdir &&
 | |
| 	echo >fileA fileA &&
 | |
| 	echo >subdir/fileB fileB &&
 | |
| 	git add fileA subdir/fileB &&
 | |
| 	git commit -a -m "Initial in one history." &&
 | |
| 	A0=`git rev-parse --verify HEAD` &&
 | |
| 
 | |
| 	echo >fileA fileA modified &&
 | |
| 	git commit -a -m "Second in one history." &&
 | |
| 	A1=`git rev-parse --verify HEAD` &&
 | |
| 
 | |
| 	echo >subdir/fileB fileB modified &&
 | |
| 	git commit -a -m "Third in one history." &&
 | |
| 	A2=`git rev-parse --verify HEAD` &&
 | |
| 
 | |
| 	rm -f .git/refs/heads/master .git/index &&
 | |
| 
 | |
| 	echo >fileA fileA again &&
 | |
| 	echo >subdir/fileB fileB again &&
 | |
| 	git add fileA subdir/fileB &&
 | |
| 	git commit -a -m "Initial in alternate history." &&
 | |
| 	B0=`git rev-parse --verify HEAD` &&
 | |
| 
 | |
| 	echo >fileA fileA modified in alternate history &&
 | |
| 	git commit -a -m "Second in alternate history." &&
 | |
| 	B1=`git rev-parse --verify HEAD` &&
 | |
| 
 | |
| 	echo >subdir/fileB fileB modified in alternate history &&
 | |
| 	git commit -a -m "Third in alternate history." &&
 | |
| 	B2=`git rev-parse --verify HEAD` &&
 | |
| 	: done
 | |
| '
 | |
| 
 | |
| check () {
 | |
| 	type=$1
 | |
| 	shift
 | |
| 
 | |
| 	arg=
 | |
| 	which=arg
 | |
| 	rm -f test.expect
 | |
| 	for a
 | |
| 	do
 | |
| 		if test "z$a" = z--
 | |
| 		then
 | |
| 			which=expect
 | |
| 			child=
 | |
| 			continue
 | |
| 		fi
 | |
| 		if test "$which" = arg
 | |
| 		then
 | |
| 			arg="$arg$a "
 | |
| 			continue
 | |
| 		fi
 | |
| 		if test "$type" = basic
 | |
| 		then
 | |
| 			echo "$a"
 | |
| 		else
 | |
| 			if test "z$child" != z
 | |
| 			then
 | |
| 				echo "$child $a"
 | |
| 			fi
 | |
| 			child="$a"
 | |
| 		fi
 | |
| 	done >test.expect
 | |
| 	if test "$type" != basic && test "z$child" != z
 | |
| 	then
 | |
| 		echo >>test.expect $child
 | |
| 	fi
 | |
| 	if test $type = basic
 | |
| 	then
 | |
| 		git rev-list $arg >test.actual
 | |
| 	elif test $type = parents
 | |
| 	then
 | |
| 		git rev-list --parents $arg >test.actual
 | |
| 	elif test $type = parents-raw
 | |
| 	then
 | |
| 		git rev-list --parents --pretty=raw $arg |
 | |
| 		sed -n -e 's/^commit //p' >test.actual
 | |
| 	fi
 | |
| 	diff test.expect test.actual
 | |
| }
 | |
| 
 | |
| for type in basic parents parents-raw
 | |
| do
 | |
| 	test_expect_success 'without grafts' "
 | |
| 		rm -f .git/info/grafts
 | |
| 		check $type $B2 -- $B2 $B1 $B0
 | |
| 	"
 | |
| 
 | |
| 	test_expect_success 'with grafts' "
 | |
| 		echo '$B0 $A2' >.git/info/grafts
 | |
| 		check $type $B2 -- $B2 $B1 $B0 $A2 $A1 $A0
 | |
| 	"
 | |
| 
 | |
| 	test_expect_success 'without grafts, with pathlimit' "
 | |
| 		rm -f .git/info/grafts
 | |
| 		check $type $B2 subdir -- $B2 $B0
 | |
| 	"
 | |
| 
 | |
| 	test_expect_success 'with grafts, with pathlimit' "
 | |
| 		echo '$B0 $A2' >.git/info/grafts
 | |
| 		check $type $B2 subdir -- $B2 $B0 $A2 $A0
 | |
| 	"
 | |
| 
 | |
| done
 | |
| test_done
 |