1#!/bin/sh
2#
3# Copyright (c) 2016 Jacob Keller, based on t4041 by Jens Lehmann
4#
5
6test_description='Test for submodule diff on non-checked out submodule
7
8This test tries to verify that add_submodule_odb works when the submodule was
9initialized previously but the checkout has since been removed.
10'
11
12. ./test-lib.sh
13
14# Tested non-UTF-8 encoding
15test_encoding="ISO8859-1"
16
17# String "added" in German (translated with Google Translate), encoded in UTF-8,
18# used in sample commit log messages in add_file() function below.
19added=$(printf "hinzugef\303\274gt")
20
21add_file () {
22	(
23		cd "$1" &&
24		shift &&
25		for name
26		do
27			echo "$name" >"$name" &&
28			git add "$name" &&
29			test_tick &&
30			# "git commit -m" would break MinGW, as Windows refuse to pass
31			# $test_encoding encoded parameter to git.
32			echo "Add $name ($added $name)" | iconv -f utf-8 -t $test_encoding |
33			git -c "i18n.commitEncoding=$test_encoding" commit -F -
34		done >/dev/null &&
35		git rev-parse --short --verify HEAD
36	)
37}
38
39commit_file () {
40	test_tick &&
41	git commit "$@" -m "Commit $*" >/dev/null
42}
43
44test_expect_success 'setup - submodules' '
45	test_create_repo sm2 &&
46	add_file . foo &&
47	add_file sm2 foo1 foo2 &&
48	smhead1=$(git -C sm2 rev-parse --short --verify HEAD)
49'
50
51test_expect_success 'setup - git submodule add' '
52	git submodule add ./sm2 sm1 &&
53	commit_file sm1 .gitmodules &&
54	git diff-tree -p --no-commit-id --submodule=log HEAD -- sm1 >actual &&
55	cat >expected <<-EOF &&
56	Submodule sm1 0000000...$smhead1 (new submodule)
57	EOF
58	test_cmp expected actual
59'
60
61test_expect_success 'submodule directory removed' '
62	rm -rf sm1 &&
63	git diff-tree -p --no-commit-id --submodule=log HEAD -- sm1 >actual &&
64	cat >expected <<-EOF &&
65	Submodule sm1 0000000...$smhead1 (new submodule)
66	EOF
67	test_cmp expected actual
68'
69
70test_expect_success 'setup - submodule multiple commits' '
71	git submodule update --checkout sm1 &&
72	smhead2=$(add_file sm1 foo3 foo4) &&
73	commit_file sm1 &&
74	git diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
75	cat >expected <<-EOF &&
76	Submodule sm1 $smhead1..$smhead2:
77	  > Add foo4 ($added foo4)
78	  > Add foo3 ($added foo3)
79	EOF
80	test_cmp expected actual
81'
82
83test_expect_success 'submodule removed multiple commits' '
84	rm -rf sm1 &&
85	git diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
86	cat >expected <<-EOF &&
87	Submodule sm1 $smhead1..$smhead2:
88	  > Add foo4 ($added foo4)
89	  > Add foo3 ($added foo3)
90	EOF
91	test_cmp expected actual
92'
93
94test_expect_success 'submodule not initialized in new clone' '
95	git clone . sm3 &&
96	git -C sm3 diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
97	cat >expected <<-EOF &&
98	Submodule sm1 $smhead1...$smhead2 (commits not present)
99	EOF
100	test_cmp expected actual
101'
102
103test_expect_success 'setup submodule moved' '
104	git submodule update --checkout sm1 &&
105	git mv sm1 sm4 &&
106	commit_file sm4 &&
107	git diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
108	cat >expected <<-EOF &&
109	Submodule sm4 0000000...$smhead2 (new submodule)
110	EOF
111	test_cmp expected actual
112'
113
114test_expect_success 'submodule moved then removed' '
115	smhead3=$(add_file sm4 foo6 foo7) &&
116	commit_file sm4 &&
117	rm -rf sm4 &&
118	git diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
119	cat >expected <<-EOF &&
120	Submodule sm4 $smhead2..$smhead3:
121	  > Add foo7 ($added foo7)
122	  > Add foo6 ($added foo6)
123	EOF
124	test_cmp expected actual
125'
126
127test_done
128