| #!/bin/sh | 
 | # | 
 | # Copyright (c) 2016 Jacob Keller, based on t4041 by Jens Lehmann | 
 | # | 
 |  | 
 | test_description='Test for submodule diff on non-checked out submodule | 
 |  | 
 | This test tries to verify that add_submodule_odb works when the submodule was | 
 | initialized previously but the checkout has since been removed. | 
 | ' | 
 |  | 
 | . ./test-lib.sh | 
 |  | 
 | # Tested non-UTF-8 encoding | 
 | test_encoding="ISO8859-1" | 
 |  | 
 | # String "added" in German (translated with Google Translate), encoded in UTF-8, | 
 | # used in sample commit log messages in add_file() function below. | 
 | added=$(printf "hinzugef\303\274gt") | 
 |  | 
 | add_file () { | 
 | 	( | 
 | 		cd "$1" && | 
 | 		shift && | 
 | 		for name | 
 | 		do | 
 | 			echo "$name" >"$name" && | 
 | 			git add "$name" && | 
 | 			test_tick && | 
 | 			# "git commit -m" would break MinGW, as Windows refuse to pass | 
 | 			# $test_encoding encoded parameter to git. | 
 | 			echo "Add $name ($added $name)" | iconv -f utf-8 -t $test_encoding | | 
 | 			git -c "i18n.commitEncoding=$test_encoding" commit -F - | 
 | 		done >/dev/null && | 
 | 		git rev-parse --short --verify HEAD | 
 | 	) | 
 | } | 
 |  | 
 | commit_file () { | 
 | 	test_tick && | 
 | 	git commit "$@" -m "Commit $*" >/dev/null | 
 | } | 
 |  | 
 | test_expect_success 'setup - submodules' ' | 
 | 	test_create_repo sm2 && | 
 | 	add_file . foo && | 
 | 	add_file sm2 foo1 foo2 && | 
 | 	smhead1=$(git -C sm2 rev-parse --short --verify HEAD) | 
 | ' | 
 |  | 
 | test_expect_success 'setup - git submodule add' ' | 
 | 	git submodule add ./sm2 sm1 && | 
 | 	commit_file sm1 .gitmodules && | 
 | 	git diff-tree -p --no-commit-id --submodule=log HEAD -- sm1 >actual && | 
 | 	cat >expected <<-EOF && | 
 | 	Submodule sm1 0000000...$smhead1 (new submodule) | 
 | 	EOF | 
 | 	test_cmp expected actual | 
 | ' | 
 |  | 
 | test_expect_success 'submodule directory removed' ' | 
 | 	rm -rf sm1 && | 
 | 	git diff-tree -p --no-commit-id --submodule=log HEAD -- sm1 >actual && | 
 | 	cat >expected <<-EOF && | 
 | 	Submodule sm1 0000000...$smhead1 (new submodule) | 
 | 	EOF | 
 | 	test_cmp expected actual | 
 | ' | 
 |  | 
 | test_expect_success 'setup - submodule multiple commits' ' | 
 | 	git submodule update --checkout sm1 && | 
 | 	smhead2=$(add_file sm1 foo3 foo4) && | 
 | 	commit_file sm1 && | 
 | 	git diff-tree -p --no-commit-id --submodule=log HEAD >actual && | 
 | 	cat >expected <<-EOF && | 
 | 	Submodule sm1 $smhead1..$smhead2: | 
 | 	  > Add foo4 ($added foo4) | 
 | 	  > Add foo3 ($added foo3) | 
 | 	EOF | 
 | 	test_cmp expected actual | 
 | ' | 
 |  | 
 | test_expect_success 'submodule removed multiple commits' ' | 
 | 	rm -rf sm1 && | 
 | 	git diff-tree -p --no-commit-id --submodule=log HEAD >actual && | 
 | 	cat >expected <<-EOF && | 
 | 	Submodule sm1 $smhead1..$smhead2: | 
 | 	  > Add foo4 ($added foo4) | 
 | 	  > Add foo3 ($added foo3) | 
 | 	EOF | 
 | 	test_cmp expected actual | 
 | ' | 
 |  | 
 | test_expect_success 'submodule not initialized in new clone' ' | 
 | 	git clone . sm3 && | 
 | 	git -C sm3 diff-tree -p --no-commit-id --submodule=log HEAD >actual && | 
 | 	cat >expected <<-EOF && | 
 | 	Submodule sm1 $smhead1...$smhead2 (commits not present) | 
 | 	EOF | 
 | 	test_cmp expected actual | 
 | ' | 
 |  | 
 | test_expect_success 'setup submodule moved' ' | 
 | 	git submodule update --checkout sm1 && | 
 | 	git mv sm1 sm4 && | 
 | 	commit_file sm4 && | 
 | 	git diff-tree -p --no-commit-id --submodule=log HEAD >actual && | 
 | 	cat >expected <<-EOF && | 
 | 	Submodule sm4 0000000...$smhead2 (new submodule) | 
 | 	EOF | 
 | 	test_cmp expected actual | 
 | ' | 
 |  | 
 | test_expect_success 'submodule moved then removed' ' | 
 | 	smhead3=$(add_file sm4 foo6 foo7) && | 
 | 	commit_file sm4 && | 
 | 	rm -rf sm4 && | 
 | 	git diff-tree -p --no-commit-id --submodule=log HEAD >actual && | 
 | 	cat >expected <<-EOF && | 
 | 	Submodule sm4 $smhead2..$smhead3: | 
 | 	  > Add foo7 ($added foo7) | 
 | 	  > Add foo6 ($added foo6) | 
 | 	EOF | 
 | 	test_cmp expected actual | 
 | ' | 
 |  | 
 | test_done |