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