| #!/bin/sh | 
 | # | 
 | # Copyright (c) 2007 Junio C Hamano | 
 | # | 
 |  | 
 | test_description='Test prune and reflog expiration' | 
 | . ./test-lib.sh | 
 |  | 
 | check_have () { | 
 | 	gaah= && | 
 | 	for N in "$@" | 
 | 	do | 
 | 		eval "o=\$$N" && git cat-file -t $o || { | 
 | 			echo Gaah $N | 
 | 			gaah=$N | 
 | 			break | 
 | 		} | 
 | 	done && | 
 | 	test -z "$gaah" | 
 | } | 
 |  | 
 | check_fsck () { | 
 | 	output=$(git fsck --full) | 
 | 	case "$1" in | 
 | 	'') | 
 | 		test -z "$output" ;; | 
 | 	*) | 
 | 		echo "$output" | grep "$1" ;; | 
 | 	esac | 
 | } | 
 |  | 
 | corrupt () { | 
 | 	aa=${1%??????????????????????????????????????} zz=${1#??} | 
 | 	mv .git/objects/$aa/$zz .git/$aa$zz | 
 | } | 
 |  | 
 | recover () { | 
 | 	aa=${1%??????????????????????????????????????} zz=${1#??} | 
 | 	mkdir -p .git/objects/$aa | 
 | 	mv .git/$aa$zz .git/objects/$aa/$zz | 
 | } | 
 |  | 
 | check_dont_have () { | 
 | 	gaah= && | 
 | 	for N in "$@" | 
 | 	do | 
 | 		eval "o=\$$N" | 
 | 		git cat-file -t $o && { | 
 | 			echo Gaah $N | 
 | 			gaah=$N | 
 | 			break | 
 | 		} | 
 | 	done | 
 | 	test -z "$gaah" | 
 | } | 
 |  | 
 | test_expect_success setup ' | 
 | 	mkdir -p A/B && | 
 | 	echo rat >C && | 
 | 	echo ox >A/D && | 
 | 	echo tiger >A/B/E && | 
 | 	git add . && | 
 |  | 
 | 	test_tick && git commit -m rabbit && | 
 | 	H=`git rev-parse --verify HEAD` && | 
 | 	A=`git rev-parse --verify HEAD:A` && | 
 | 	B=`git rev-parse --verify HEAD:A/B` && | 
 | 	C=`git rev-parse --verify HEAD:C` && | 
 | 	D=`git rev-parse --verify HEAD:A/D` && | 
 | 	E=`git rev-parse --verify HEAD:A/B/E` && | 
 | 	check_fsck && | 
 |  | 
 | 	test_chmod +x C && | 
 | 	git add C && | 
 | 	test_tick && git commit -m dragon && | 
 | 	L=`git rev-parse --verify HEAD` && | 
 | 	check_fsck && | 
 |  | 
 | 	rm -f C A/B/E && | 
 | 	echo snake >F && | 
 | 	echo horse >A/G && | 
 | 	git add F A/G && | 
 | 	test_tick && git commit -a -m sheep && | 
 | 	F=`git rev-parse --verify HEAD:F` && | 
 | 	G=`git rev-parse --verify HEAD:A/G` && | 
 | 	I=`git rev-parse --verify HEAD:A` && | 
 | 	J=`git rev-parse --verify HEAD` && | 
 | 	check_fsck && | 
 |  | 
 | 	rm -f A/G && | 
 | 	test_tick && git commit -a -m monkey && | 
 | 	K=`git rev-parse --verify HEAD` && | 
 | 	check_fsck && | 
 |  | 
 | 	check_have A B C D E F G H I J K L && | 
 |  | 
 | 	git prune && | 
 |  | 
 | 	check_have A B C D E F G H I J K L && | 
 |  | 
 | 	check_fsck && | 
 |  | 
 | 	loglen=$(wc -l <.git/logs/refs/heads/master) && | 
 | 	test $loglen = 4 | 
 | ' | 
 |  | 
 | test_expect_success rewind ' | 
 | 	test_tick && git reset --hard HEAD~2 && | 
 | 	test -f C && | 
 | 	test -f A/B/E && | 
 | 	! test -f F && | 
 | 	! test -f A/G && | 
 |  | 
 | 	check_have A B C D E F G H I J K L && | 
 |  | 
 | 	git prune && | 
 |  | 
 | 	check_have A B C D E F G H I J K L && | 
 |  | 
 | 	loglen=$(wc -l <.git/logs/refs/heads/master) && | 
 | 	test $loglen = 5 | 
 | ' | 
 |  | 
 | test_expect_success 'corrupt and check' ' | 
 |  | 
 | 	corrupt $F && | 
 | 	check_fsck "missing blob $F" | 
 |  | 
 | ' | 
 |  | 
 | test_expect_success 'reflog expire --dry-run should not touch reflog' ' | 
 |  | 
 | 	git reflog expire --dry-run \ | 
 | 		--expire=$(($test_tick - 10000)) \ | 
 | 		--expire-unreachable=$(($test_tick - 10000)) \ | 
 | 		--stale-fix \ | 
 | 		--all && | 
 |  | 
 | 	loglen=$(wc -l <.git/logs/refs/heads/master) && | 
 | 	test $loglen = 5 && | 
 |  | 
 | 	check_fsck "missing blob $F" | 
 | ' | 
 |  | 
 | test_expect_success 'reflog expire' ' | 
 |  | 
 | 	git reflog expire --verbose \ | 
 | 		--expire=$(($test_tick - 10000)) \ | 
 | 		--expire-unreachable=$(($test_tick - 10000)) \ | 
 | 		--stale-fix \ | 
 | 		--all && | 
 |  | 
 | 	loglen=$(wc -l <.git/logs/refs/heads/master) && | 
 | 	test $loglen = 2 && | 
 |  | 
 | 	check_fsck "dangling commit $K" | 
 | ' | 
 |  | 
 | test_expect_success 'prune and fsck' ' | 
 |  | 
 | 	git prune && | 
 | 	check_fsck && | 
 |  | 
 | 	check_have A B C D E H L && | 
 | 	check_dont_have F G I J K | 
 |  | 
 | ' | 
 |  | 
 | test_expect_success 'recover and check' ' | 
 |  | 
 | 	recover $F && | 
 | 	check_fsck "dangling blob $F" | 
 |  | 
 | ' | 
 |  | 
 | test_expect_success 'delete' ' | 
 | 	echo 1 > C && | 
 | 	test_tick && | 
 | 	git commit -m rat C && | 
 |  | 
 | 	echo 2 > C && | 
 | 	test_tick && | 
 | 	git commit -m ox C && | 
 |  | 
 | 	echo 3 > C && | 
 | 	test_tick && | 
 | 	git commit -m tiger C && | 
 |  | 
 | 	HEAD_entry_count=$(git reflog | wc -l) | 
 | 	master_entry_count=$(git reflog show master | wc -l) | 
 |  | 
 | 	test $HEAD_entry_count = 5 && | 
 | 	test $master_entry_count = 5 && | 
 |  | 
 |  | 
 | 	git reflog delete master@{1} && | 
 | 	git reflog show master > output && | 
 | 	test $(($master_entry_count - 1)) = $(wc -l < output) && | 
 | 	test $HEAD_entry_count = $(git reflog | wc -l) && | 
 | 	! grep ox < output && | 
 |  | 
 | 	master_entry_count=$(wc -l < output) | 
 |  | 
 | 	git reflog delete HEAD@{1} && | 
 | 	test $(($HEAD_entry_count -1)) = $(git reflog | wc -l) && | 
 | 	test $master_entry_count = $(git reflog show master | wc -l) && | 
 |  | 
 | 	HEAD_entry_count=$(git reflog | wc -l) | 
 |  | 
 | 	git reflog delete master@{07.04.2005.15:15:00.-0700} && | 
 | 	git reflog show master > output && | 
 | 	test $(($master_entry_count - 1)) = $(wc -l < output) && | 
 | 	! grep dragon < output | 
 |  | 
 | ' | 
 |  | 
 | test_expect_success 'rewind2' ' | 
 |  | 
 | 	test_tick && git reset --hard HEAD~2 && | 
 | 	loglen=$(wc -l <.git/logs/refs/heads/master) && | 
 | 	test $loglen = 4 | 
 |  | 
 | ' | 
 |  | 
 | test_expect_success '--expire=never' ' | 
 |  | 
 | 	git reflog expire --verbose \ | 
 | 		--expire=never \ | 
 | 		--expire-unreachable=never \ | 
 | 		--all && | 
 | 	loglen=$(wc -l <.git/logs/refs/heads/master) && | 
 | 	test $loglen = 4 | 
 |  | 
 | ' | 
 |  | 
 | test_expect_success 'gc.reflogexpire=never' ' | 
 |  | 
 | 	git config gc.reflogexpire never && | 
 | 	git config gc.reflogexpireunreachable never && | 
 | 	git reflog expire --verbose --all && | 
 | 	loglen=$(wc -l <.git/logs/refs/heads/master) && | 
 | 	test $loglen = 4 | 
 | ' | 
 |  | 
 | test_expect_success 'gc.reflogexpire=false' ' | 
 |  | 
 | 	git config gc.reflogexpire false && | 
 | 	git config gc.reflogexpireunreachable false && | 
 | 	git reflog expire --verbose --all && | 
 | 	loglen=$(wc -l <.git/logs/refs/heads/master) && | 
 | 	test $loglen = 4 && | 
 |  | 
 | 	git config --unset gc.reflogexpire && | 
 | 	git config --unset gc.reflogexpireunreachable | 
 |  | 
 | ' | 
 |  | 
 | test_done |