| #!/bin/sh | 
 |  | 
 | test_description='push from/to a shallow clone' | 
 |  | 
 | . ./test-lib.sh | 
 |  | 
 | commit() { | 
 | 	echo "$1" >tracked && | 
 | 	git add tracked && | 
 | 	git commit -m "$1" | 
 | } | 
 |  | 
 | test_expect_success 'setup' ' | 
 | 	git config --global transfer.fsckObjects true && | 
 | 	commit 1 && | 
 | 	commit 2 && | 
 | 	commit 3 && | 
 | 	commit 4 && | 
 | 	git clone . full && | 
 | 	( | 
 | 	git init full-abc && | 
 | 	cd full-abc && | 
 | 	commit a && | 
 | 	commit b && | 
 | 	commit c | 
 | 	) && | 
 | 	git clone --no-local --depth=2 .git shallow && | 
 | 	git --git-dir=shallow/.git log --format=%s >actual && | 
 | 	cat <<EOF >expect && | 
 | 4 | 
 | 3 | 
 | EOF | 
 | 	test_cmp expect actual && | 
 | 	git clone --no-local --depth=2 full-abc/.git shallow2 && | 
 | 	git --git-dir=shallow2/.git log --format=%s >actual && | 
 | 	cat <<EOF >expect && | 
 | c | 
 | b | 
 | EOF | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'push from shallow clone' ' | 
 | 	( | 
 | 	cd shallow && | 
 | 	commit 5 && | 
 | 	git push ../.git +master:refs/remotes/shallow/master | 
 | 	) && | 
 | 	git log --format=%s shallow/master >actual && | 
 | 	git fsck && | 
 | 	cat <<EOF >expect && | 
 | 5 | 
 | 4 | 
 | 3 | 
 | 2 | 
 | 1 | 
 | EOF | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'push from shallow clone, with grafted roots' ' | 
 | 	( | 
 | 	cd shallow2 && | 
 | 	test_must_fail git push ../.git +master:refs/remotes/shallow2/master 2>err && | 
 | 	grep "shallow2/master.*shallow update not allowed" err | 
 | 	) && | 
 | 	test_must_fail git rev-parse shallow2/master && | 
 | 	git fsck | 
 | ' | 
 |  | 
 | test_expect_success 'add new shallow root with receive.updateshallow on' ' | 
 | 	test_config receive.shallowupdate true && | 
 | 	( | 
 | 	cd shallow2 && | 
 | 	git push ../.git +master:refs/remotes/shallow2/master | 
 | 	) && | 
 | 	git log --format=%s shallow2/master >actual && | 
 | 	git fsck && | 
 | 	cat <<EOF >expect && | 
 | c | 
 | b | 
 | EOF | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'push from shallow to shallow' ' | 
 | 	( | 
 | 	cd shallow && | 
 | 	git --git-dir=../shallow2/.git config receive.shallowupdate true && | 
 | 	git push ../shallow2/.git +master:refs/remotes/shallow/master && | 
 | 	git --git-dir=../shallow2/.git config receive.shallowupdate false | 
 | 	) && | 
 | 	( | 
 | 	cd shallow2 && | 
 | 	git log --format=%s shallow/master >actual && | 
 | 	git fsck && | 
 | 	cat <<EOF >expect && | 
 | 5 | 
 | 4 | 
 | 3 | 
 | EOF | 
 | 	test_cmp expect actual | 
 | 	) | 
 | ' | 
 |  | 
 | test_expect_success 'push from full to shallow' ' | 
 | 	! git --git-dir=shallow2/.git cat-file blob $(echo 1|git hash-object --stdin) && | 
 | 	commit 1 && | 
 | 	git push shallow2/.git +master:refs/remotes/top/master && | 
 | 	( | 
 | 	cd shallow2 && | 
 | 	git log --format=%s top/master >actual && | 
 | 	git fsck && | 
 | 	cat <<EOF >expect && | 
 | 1 | 
 | 4 | 
 | 3 | 
 | EOF | 
 | 	test_cmp expect actual && | 
 | 	git cat-file blob $(echo 1|git hash-object --stdin) >/dev/null | 
 | 	) | 
 | ' | 
 | test_done |