| #!/bin/sh | 
 | # | 
 | # Copyright (c) 2008 Ping Yin | 
 | # | 
 |  | 
 | test_description='Summary support for submodules | 
 |  | 
 | This test tries to verify the sanity of summary subcommand of git submodule. | 
 | ' | 
 |  | 
 | . ./test-lib.sh | 
 |  | 
 | add_file () { | 
 | 	sm=$1 | 
 | 	shift | 
 | 	owd=$(pwd) | 
 | 	cd "$sm" | 
 | 	for name; do | 
 | 		echo "$name" > "$name" && | 
 | 		git add "$name" && | 
 | 		test_tick && | 
 | 		git commit -m "Add $name" | 
 | 	done >/dev/null | 
 | 	git rev-parse --verify HEAD | cut -c1-7 | 
 | 	cd "$owd" | 
 | } | 
 | commit_file () { | 
 | 	test_tick && | 
 | 	git commit "$@" -m "Commit $*" >/dev/null | 
 | } | 
 |  | 
 | test_create_repo sm1 && | 
 | add_file . foo >/dev/null | 
 |  | 
 | head1=$(add_file sm1 foo1 foo2) | 
 |  | 
 | test_expect_success 'added submodule' " | 
 | 	git add sm1 && | 
 | 	git submodule summary >actual && | 
 | 	cat >expected <<-EOF && | 
 | * sm1 0000000...$head1 (2): | 
 |   > Add foo2 | 
 |  | 
 | EOF | 
 | 	test_cmp expected actual | 
 | " | 
 |  | 
 | test_expect_success 'added submodule (subdirectory)' " | 
 | 	mkdir sub && | 
 | 	( | 
 | 		cd sub && | 
 | 		git submodule summary >../actual | 
 | 	) && | 
 | 	cat >expected <<-EOF && | 
 | * ../sm1 0000000...$head1 (2): | 
 |   > Add foo2 | 
 |  | 
 | EOF | 
 | 	test_cmp expected actual | 
 | " | 
 |  | 
 | test_expect_success 'added submodule (subdirectory only)' " | 
 | 	( | 
 | 		cd sub && | 
 | 		git submodule summary . >../actual | 
 | 	) && | 
 | 	test_must_be_empty actual | 
 | " | 
 |  | 
 | test_expect_success 'added submodule (subdirectory with explicit path)' " | 
 | 	( | 
 | 		cd sub && | 
 | 		git submodule summary ../sm1 >../actual | 
 | 	) && | 
 | 	cat >expected <<-EOF && | 
 | * ../sm1 0000000...$head1 (2): | 
 |   > Add foo2 | 
 |  | 
 | EOF | 
 | 	test_cmp expected actual | 
 | " | 
 |  | 
 | commit_file sm1 && | 
 | head2=$(add_file sm1 foo3) | 
 |  | 
 | test_expect_success 'modified submodule(forward)' " | 
 | 	git submodule summary >actual && | 
 | 	cat >expected <<-EOF && | 
 | * sm1 $head1...$head2 (1): | 
 |   > Add foo3 | 
 |  | 
 | EOF | 
 | 	test_cmp expected actual | 
 | " | 
 |  | 
 | test_expect_success 'modified submodule(forward), --files' " | 
 | 	git submodule summary --files >actual && | 
 | 	cat >expected <<-EOF && | 
 | * sm1 $head1...$head2 (1): | 
 |   > Add foo3 | 
 |  | 
 | EOF | 
 | 	test_cmp expected actual | 
 | " | 
 |  | 
 | test_expect_success 'no ignore=all setting has any effect' " | 
 | 	git config -f .gitmodules submodule.sm1.path sm1 && | 
 | 	git config -f .gitmodules submodule.sm1.ignore all && | 
 | 	git config submodule.sm1.ignore all && | 
 | 	git config diff.ignoreSubmodules all && | 
 | 	git submodule summary >actual && | 
 | 	cat >expected <<-EOF && | 
 | * sm1 $head1...$head2 (1): | 
 |   > Add foo3 | 
 |  | 
 | EOF | 
 | 	test_cmp expected actual && | 
 | 	git config --unset diff.ignoreSubmodules && | 
 | 	git config --remove-section submodule.sm1 && | 
 | 	git config -f .gitmodules --remove-section submodule.sm1 | 
 | " | 
 |  | 
 |  | 
 | commit_file sm1 && | 
 | head3=$( | 
 | 	cd sm1 && | 
 | 	git reset --hard HEAD~2 >/dev/null && | 
 | 	git rev-parse --verify HEAD | cut -c1-7 | 
 | ) | 
 |  | 
 | test_expect_success 'modified submodule(backward)' " | 
 | 	git submodule summary >actual && | 
 | 	cat >expected <<-EOF && | 
 | * sm1 $head2...$head3 (2): | 
 |   < Add foo3 | 
 |   < Add foo2 | 
 |  | 
 | EOF | 
 | 	test_cmp expected actual | 
 | " | 
 |  | 
 | head4=$(add_file sm1 foo4 foo5) && | 
 | head4_full=$(GIT_DIR=sm1/.git git rev-parse --verify HEAD) | 
 | test_expect_success 'modified submodule(backward and forward)' " | 
 | 	git submodule summary >actual && | 
 | 	cat >expected <<-EOF && | 
 | * sm1 $head2...$head4 (4): | 
 |   > Add foo5 | 
 |   > Add foo4 | 
 |   < Add foo3 | 
 |   < Add foo2 | 
 |  | 
 | EOF | 
 | 	test_cmp expected actual | 
 | " | 
 |  | 
 | test_expect_success '--summary-limit' " | 
 | 	git submodule summary -n 3 >actual && | 
 | 	cat >expected <<-EOF && | 
 | * sm1 $head2...$head4 (4): | 
 |   > Add foo5 | 
 |   > Add foo4 | 
 |   < Add foo3 | 
 |  | 
 | EOF | 
 | 	test_cmp expected actual | 
 | " | 
 |  | 
 | commit_file sm1 && | 
 | mv sm1 sm1-bak && | 
 | echo sm1 >sm1 && | 
 | head5=$(git hash-object sm1 | cut -c1-7) && | 
 | git add sm1 && | 
 | rm -f sm1 && | 
 | mv sm1-bak sm1 | 
 |  | 
 | test_expect_success 'typechanged submodule(submodule->blob), --cached' " | 
 | 	git submodule summary --cached >actual && | 
 | 	cat >expected <<-EOF && | 
 | * sm1 $head4(submodule)->$head5(blob) (3): | 
 |   < Add foo5 | 
 |  | 
 | EOF | 
 | 	test_i18ncmp actual expected | 
 | " | 
 |  | 
 | test_expect_success 'typechanged submodule(submodule->blob), --files' " | 
 | 	git submodule summary --files >actual && | 
 | 	cat >expected <<-EOF && | 
 | * sm1 $head5(blob)->$head4(submodule) (3): | 
 |   > Add foo5 | 
 |  | 
 | EOF | 
 | 	test_i18ncmp actual expected | 
 | " | 
 |  | 
 | rm -rf sm1 && | 
 | git checkout-index sm1 | 
 | test_expect_success 'typechanged submodule(submodule->blob)' " | 
 | 	git submodule summary >actual && | 
 | 	cat >expected <<-EOF && | 
 | * sm1 $head4(submodule)->$head5(blob): | 
 |  | 
 | EOF | 
 | 	test_i18ncmp actual expected | 
 | " | 
 |  | 
 | rm -f sm1 && | 
 | test_create_repo sm1 && | 
 | head6=$(add_file sm1 foo6 foo7) | 
 | test_expect_success 'nonexistent commit' " | 
 | 	git submodule summary >actual && | 
 | 	cat >expected <<-EOF && | 
 | * sm1 $head4...$head6: | 
 |   Warn: sm1 doesn't contain commit $head4_full | 
 |  | 
 | EOF | 
 | 	test_i18ncmp actual expected | 
 | " | 
 |  | 
 | commit_file | 
 | test_expect_success 'typechanged submodule(blob->submodule)' " | 
 | 	git submodule summary >actual && | 
 | 	cat >expected <<-EOF && | 
 | * sm1 $head5(blob)->$head6(submodule) (2): | 
 |   > Add foo7 | 
 |  | 
 | EOF | 
 | 	test_i18ncmp expected actual | 
 | " | 
 |  | 
 | commit_file sm1 && | 
 | rm -rf sm1 | 
 | test_expect_success 'deleted submodule' " | 
 | 	git submodule summary >actual && | 
 | 	cat >expected <<-EOF && | 
 | * sm1 $head6...0000000: | 
 |  | 
 | EOF | 
 | 	test_cmp expected actual | 
 | " | 
 |  | 
 | test_expect_success 'create second submodule' ' | 
 | 	test_create_repo sm2 && | 
 | 	head7=$(add_file sm2 foo8 foo9) && | 
 | 	git add sm2 | 
 | ' | 
 |  | 
 | test_expect_success 'multiple submodules' " | 
 | 	git submodule summary >actual && | 
 | 	cat >expected <<-EOF && | 
 | * sm1 $head6...0000000: | 
 |  | 
 | * sm2 0000000...$head7 (2): | 
 |   > Add foo9 | 
 |  | 
 | EOF | 
 | 	test_cmp expected actual | 
 | " | 
 |  | 
 | test_expect_success 'path filter' " | 
 | 	git submodule summary sm2 >actual && | 
 | 	cat >expected <<-EOF && | 
 | * sm2 0000000...$head7 (2): | 
 |   > Add foo9 | 
 |  | 
 | EOF | 
 | 	test_cmp expected actual | 
 | " | 
 |  | 
 | commit_file sm2 | 
 | test_expect_success 'given commit' " | 
 | 	git submodule summary HEAD^ >actual && | 
 | 	cat >expected <<-EOF && | 
 | * sm1 $head6...0000000: | 
 |  | 
 | * sm2 0000000...$head7 (2): | 
 |   > Add foo9 | 
 |  | 
 | EOF | 
 | 	test_cmp expected actual | 
 | " | 
 |  | 
 | test_expect_success '--for-status' " | 
 | 	git submodule summary --for-status HEAD^ >actual && | 
 | 	test_i18ncmp actual - <<EOF | 
 | * sm1 $head6...0000000: | 
 |  | 
 | * sm2 0000000...$head7 (2): | 
 |   > Add foo9 | 
 |  | 
 | EOF | 
 | " | 
 |  | 
 | test_expect_success 'fail when using --files together with --cached' " | 
 | 	test_must_fail git submodule summary --files --cached | 
 | " | 
 |  | 
 | test_expect_success 'should not fail in an empty repo' " | 
 | 	git init xyzzy && | 
 | 	cd xyzzy && | 
 | 	git submodule summary >output 2>&1 && | 
 | 	test_must_be_empty output | 
 | " | 
 |  | 
 | test_done |