|  | #!/bin/sh | 
|  |  | 
|  | test_description='common tail optimization' | 
|  |  | 
|  | . ./test-lib.sh | 
|  |  | 
|  | z=zzzzzzzz ;# 8 | 
|  | z="$z$z$z$z$z$z$z$z" ;# 64 | 
|  | z="$z$z$z$z$z$z$z$z" ;# 512 | 
|  | z="$z$z$z$z" ;# 2048 | 
|  | z2047=$(expr "$z" : '.\(.*\)') ; #2047 | 
|  |  | 
|  | x=zzzzzzzzzz			;# 10 | 
|  | y="$x$x$x$x$x$x$x$x$x$x"	;# 100 | 
|  | z="$y$y$y$y$y$y$y$y$y$y"	;# 1000 | 
|  | z1000=$z | 
|  | z100=$y | 
|  | z10=$x | 
|  |  | 
|  | zs() { | 
|  | count="$1" | 
|  | while test "$count" -ge 1000 | 
|  | do | 
|  | count=$(($count - 1000)) | 
|  | printf "%s" $z1000 | 
|  | done | 
|  | while test "$count" -ge 100 | 
|  | do | 
|  | count=$(($count - 100)) | 
|  | printf "%s" $z100 | 
|  | done | 
|  | while test "$count" -ge 10 | 
|  | do | 
|  | count=$(($count - 10)) | 
|  | printf "%s" $z10 | 
|  | done | 
|  | while test "$count" -ge 1 | 
|  | do | 
|  | count=$(($count - 1)) | 
|  | printf "z" | 
|  | done | 
|  | } | 
|  |  | 
|  | zc () { | 
|  | sed -e "/^index/d" \ | 
|  | -e "s/$z1000/Q/g" \ | 
|  | -e "s/QQQQQQQQQ/Z9000/g" \ | 
|  | -e "s/QQQQQQQQ/Z8000/g" \ | 
|  | -e "s/QQQQQQQ/Z7000/g" \ | 
|  | -e "s/QQQQQQ/Z6000/g" \ | 
|  | -e "s/QQQQQ/Z5000/g" \ | 
|  | -e "s/QQQQ/Z4000/g" \ | 
|  | -e "s/QQQ/Z3000/g" \ | 
|  | -e "s/QQ/Z2000/g" \ | 
|  | -e "s/Q/Z1000/g" \ | 
|  | -e "s/$z100/Q/g" \ | 
|  | -e "s/QQQQQQQQQ/Z900/g" \ | 
|  | -e "s/QQQQQQQQ/Z800/g" \ | 
|  | -e "s/QQQQQQQ/Z700/g" \ | 
|  | -e "s/QQQQQQ/Z600/g" \ | 
|  | -e "s/QQQQQ/Z500/g" \ | 
|  | -e "s/QQQQ/Z400/g" \ | 
|  | -e "s/QQQ/Z300/g" \ | 
|  | -e "s/QQ/Z200/g" \ | 
|  | -e "s/Q/Z100/g" \ | 
|  | -e "s/000Z//g" \ | 
|  | -e "s/$z10/Q/g" \ | 
|  | -e "s/QQQQQQQQQ/Z90/g" \ | 
|  | -e "s/QQQQQQQQ/Z80/g" \ | 
|  | -e "s/QQQQQQQ/Z70/g" \ | 
|  | -e "s/QQQQQQ/Z60/g" \ | 
|  | -e "s/QQQQQ/Z50/g" \ | 
|  | -e "s/QQQQ/Z40/g" \ | 
|  | -e "s/QQQ/Z30/g" \ | 
|  | -e "s/QQ/Z20/g" \ | 
|  | -e "s/Q/Z10/g" \ | 
|  | -e "s/00Z//g" \ | 
|  | -e "s/z/Q/g" \ | 
|  | -e "s/QQQQQQQQQ/Z9/g" \ | 
|  | -e "s/QQQQQQQQ/Z8/g" \ | 
|  | -e "s/QQQQQQQ/Z7/g" \ | 
|  | -e "s/QQQQQQ/Z6/g" \ | 
|  | -e "s/QQQQQ/Z5/g" \ | 
|  | -e "s/QQQQ/Z4/g" \ | 
|  | -e "s/QQQ/Z3/g" \ | 
|  | -e "s/QQ/Z2/g" \ | 
|  | -e "s/Q/Z1/g" \ | 
|  | -e "s/0Z//g" \ | 
|  | ; | 
|  | } | 
|  |  | 
|  | expect_pattern () { | 
|  | cnt="$1" | 
|  | cat <<EOF | 
|  | diff --git a/file-a$cnt b/file-a$cnt | 
|  | --- a/file-a$cnt | 
|  | +++ b/file-a$cnt | 
|  | @@ -1 +1 @@ | 
|  | -Z${cnt}a | 
|  | +Z${cnt}A | 
|  | diff --git a/file-b$cnt b/file-b$cnt | 
|  | --- a/file-b$cnt | 
|  | +++ b/file-b$cnt | 
|  | @@ -1 +1 @@ | 
|  | -b | 
|  | +B | 
|  | diff --git a/file-c$cnt b/file-c$cnt | 
|  | --- a/file-c$cnt | 
|  | +++ b/file-c$cnt | 
|  | @@ -1 +1 @@ | 
|  | -cZ$cnt | 
|  | \ No newline at end of file | 
|  | +CZ$cnt | 
|  | \ No newline at end of file | 
|  | diff --git a/file-d$cnt b/file-d$cnt | 
|  | --- a/file-d$cnt | 
|  | +++ b/file-d$cnt | 
|  | @@ -1 +1 @@ | 
|  | -d | 
|  | +D | 
|  | EOF | 
|  | } | 
|  |  | 
|  | sample='1023 1024 1025 2047 4095' | 
|  |  | 
|  | test_expect_success setup ' | 
|  |  | 
|  | for n in $sample | 
|  | do | 
|  | ( zs $n ; echo a ) >file-a$n && | 
|  | ( echo b; zs $n; echo ) >file-b$n && | 
|  | ( printf c; zs $n ) >file-c$n && | 
|  | ( echo d; zs $n ) >file-d$n && | 
|  |  | 
|  | git add file-a$n file-b$n file-c$n file-d$n && | 
|  |  | 
|  | ( zs $n ; echo A ) >file-a$n && | 
|  | ( echo B; zs $n; echo ) >file-b$n && | 
|  | ( printf C; zs $n ) >file-c$n && | 
|  | ( echo D; zs $n ) >file-d$n && | 
|  |  | 
|  | expect_pattern $n || break | 
|  |  | 
|  | done >expect | 
|  | ' | 
|  |  | 
|  | test_expect_success 'diff -U0' ' | 
|  |  | 
|  | for n in $sample | 
|  | do | 
|  | git diff -U0 file-?$n | 
|  | done | zc >actual && | 
|  | test_cmp expect actual | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_done |