1#!/bin/sh
2
3test_description='difference in submodules'
4
5. ./test-lib.sh
6. "$TEST_DIRECTORY"/diff-lib.sh
7
8_z40=0000000000000000000000000000000000000000
9test_expect_success setup '
10 test_tick &&
11 test_create_repo sub &&
12 (
13 cd sub &&
14 echo hello >world &&
15 git add world &&
16 git commit -m submodule
17 ) &&
18
19 test_tick &&
20 echo frotz >nitfol &&
21 git add nitfol sub &&
22 git commit -m superproject &&
23
24 (
25 cd sub &&
26 echo goodbye >world &&
27 git add world &&
28 git commit -m "submodule #2"
29 ) &&
30
31 set x $(
32 cd sub &&
33 git rev-list HEAD
34 ) &&
35 echo ":160000 160000 $3 $_z40 M sub" >expect &&
36 subtip=$3 subprev=$2
37'
38
39test_expect_success 'git diff --raw HEAD' '
40 git diff --raw --abbrev=40 HEAD >actual &&
41 test_cmp expect actual
42'
43
44test_expect_success 'git diff-index --raw HEAD' '
45 git diff-index --raw HEAD >actual.index &&
46 test_cmp expect actual.index
47'
48
49test_expect_success 'git diff-files --raw' '
50 git diff-files --raw >actual.files &&
51 test_cmp expect actual.files
52'
53
54expect_from_to () {
55 printf "%sSubproject commit %s\n+Subproject commit %s\n" \
56 "-" "$1" "$2"
57}
58
59test_expect_success 'git diff HEAD' '
60 git diff HEAD >actual &&
61 sed -e "1,/^@@/d" actual >actual.body &&
62 expect_from_to >expect.body $subtip $subprev &&
63 test_cmp expect.body actual.body
64'
65
66test_expect_success 'git diff HEAD with dirty submodule (work tree)' '
67 echo >>sub/world &&
68 git diff HEAD >actual &&
69 sed -e "1,/^@@/d" actual >actual.body &&
70 expect_from_to >expect.body $subtip $subprev-dirty &&
71 test_cmp expect.body actual.body
72'
73
74test_expect_success 'git diff HEAD with dirty submodule (index)' '
75 (
76 cd sub &&
77 git reset --hard &&
78 echo >>world &&
79 git add world
80 ) &&
81 git diff HEAD >actual &&
82 sed -e "1,/^@@/d" actual >actual.body &&
83 expect_from_to >expect.body $subtip $subprev-dirty &&
84 test_cmp expect.body actual.body
85'
86
87test_expect_success 'git diff HEAD with dirty submodule (untracked)' '
88 (
89 cd sub &&
90 git reset --hard &&
91 git clean -qfdx &&
92 >cruft
93 ) &&
94 git diff HEAD >actual &&
95 sed -e "1,/^@@/d" actual >actual.body &&
96 expect_from_to >expect.body $subtip $subprev-dirty &&
97 test_cmp expect.body actual.body
98'
99
100test_expect_success 'git diff HEAD with dirty submodule (work tree, refs match)' '
101 git commit -m "x" sub &&
102 echo >>sub/world &&
103 git diff HEAD >actual &&
104 sed -e "1,/^@@/d" actual >actual.body &&
105 expect_from_to >expect.body $subprev $subprev-dirty &&
106 test_cmp expect.body actual.body
107'
108
109test_expect_success 'git diff HEAD with dirty submodule (index, refs match)' '
110 (
111 cd sub &&
112 git reset --hard &&
113 echo >>world &&
114 git add world
115 ) &&
116 git diff HEAD >actual &&
117 sed -e "1,/^@@/d" actual >actual.body &&
118 expect_from_to >expect.body $subprev $subprev-dirty &&
119 test_cmp expect.body actual.body
120'
121
122test_expect_success 'git diff HEAD with dirty submodule (untracked, refs match)' '
123 (
124 cd sub &&
125 git reset --hard &&
126 git clean -qfdx &&
127 >cruft
128 ) &&
129 git diff HEAD >actual &&
130 sed -e "1,/^@@/d" actual >actual.body &&
131 expect_from_to >expect.body $subprev $subprev-dirty &&
132 test_cmp expect.body actual.body
133'
134
135test_expect_success 'git diff (empty submodule dir)' '
136 : >empty &&
137 rm -rf sub/* sub/.git &&
138 git diff > actual.empty &&
139 test_cmp empty actual.empty
140'
141
142test_expect_success 'conflicted submodule setup' '
143
144 # 39 efs
145 c=fffffffffffffffffffffffffffffffffffffff
146 (
147 echo "000000 $_z40 0 sub"
148 echo "160000 1$c 1 sub"
149 echo "160000 2$c 2 sub"
150 echo "160000 3$c 3 sub"
151 ) | git update-index --index-info &&
152 echo >expect.nosub '\''diff --cc sub
153index 2ffffff,3ffffff..0000000
154--- a/sub
155+++ b/sub
156@@@ -1,1 -1,1 +1,1 @@@
157- Subproject commit 2fffffffffffffffffffffffffffffffffffffff
158 -Subproject commit 3fffffffffffffffffffffffffffffffffffffff
159++Subproject commit 0000000000000000000000000000000000000000'\'' &&
160
161 hh=$(git rev-parse HEAD) &&
162 sed -e "s/$_z40/$hh/" expect.nosub >expect.withsub
163
164'
165
166test_expect_success 'combined (empty submodule)' '
167 rm -fr sub && mkdir sub &&
168 git diff >actual &&
169 test_cmp expect.nosub actual
170'
171
172test_expect_success 'combined (with submodule)' '
173 rm -fr sub &&
174 git clone --no-checkout . sub &&
175 git diff >actual &&
176 test_cmp expect.withsub actual
177'
178
179
180
181test_done