1
+#!/bin/sh
2
+
3
+test_description='directory traversal respects user config
4
+
5
+This test verifies the traversal of the directory tree when the traversal begins
6
+outside the repository. Two instances for which this can occur are tested:
7
+
8
+ 1) The user manually sets the worktree. For this instance, the test sets
9
+ the worktree two levels above the `.git` directory and checks whether we
10
+ are able to add to the index those files that are in either (1) the
11
+ manually configured worktree directory or (2) the standard worktree
12
+ location with respect to the `.git` directory (i.e. ensuring that the
13
+ encountered `.git` directory is not treated as belonging to a foreign
14
+ nested repository).
15
+ 2) The user manually sets the `git_dir` while the working directory is
16
+ outside the repository. The test checks that files inside the
17
+ repository can be added to the index.
18
+ '
19
+
20
+. ./test-lib.sh
21
+
22
+test_expect_success '1a: setup--config worktree' '
23
+ mkdir test1 &&
24
+ (
25
+ cd test1 &&
26
+ test_create_repo repo &&
27
+ git --git-dir="repo/.git" config core.worktree "$(pwd)" &&
28
+
29
+ mkdir -p outside-tracked outside-untracked &&
30
+ mkdir -p repo/inside-tracked repo/inside-untracked &&
31
+ >file-tracked &&
32
+ >file-untracked &&
33
+ >outside-tracked/file &&
34
+ >outside-untracked/file &&
35
+ >repo/file-tracked &&
36
+ >repo/file-untracked &&
37
+ >repo/inside-tracked/file &&
38
+ >repo/inside-untracked/file &&
39
+
40
+ cat >expect-tracked-unsorted <<-EOF &&
41
+ ../file-tracked
42
+ ../outside-tracked/file
43
+ file-tracked
44
+ inside-tracked/file
45
+ EOF
46
+
47
+ cat >expect-untracked-unsorted <<-EOF &&
48
+ ../file-untracked
49
+ ../outside-untracked/file
50
+ file-untracked
51
+ inside-untracked/file
52
+ EOF
53
+
54
+ cat >expect-all-dir-unsorted <<-EOF &&
55
+ ../file-untracked
56
+ ../file-tracked
57
+ ../outside-untracked/
58
+ ../outside-tracked/
59
+ ./
60
+ EOF
61
+
62
+ cat expect-tracked-unsorted expect-untracked-unsorted >expect-all-unsorted &&
63
+
64
+ cat >.gitignore <<-EOF
65
+ .gitignore
66
+ actual-*
67
+ expect-*
68
+ EOF
69
+ )
70
+'
71
+
72
+test_expect_success '1b: pre-add all' '
73
+ (
74
+ cd test1 &&
75
+ local parent_dir="$(pwd)" &&
76
+ git -C repo ls-files -o --exclude-standard "$parent_dir" >actual-all-unsorted &&
77
+ sort actual-all-unsorted >actual-all &&
78
+ sort expect-all-unsorted >expect-all &&
79
+ test_cmp expect-all actual-all
80
+ )
81
+'
82
+
83
+test_expect_success '1c: pre-add dir all' '
84
+ (
85
+ cd test1 &&
86
+ local parent_dir="$(pwd)" &&
87
+ git -C repo ls-files -o --directory --exclude-standard "$parent_dir" >actual-all-dir-unsorted &&
88
+ sort actual-all-dir-unsorted >actual-all &&
89
+ sort expect-all-dir-unsorted >expect-all &&
90
+ test_cmp expect-all actual-all
91
+ )
92
+'
93
+
94
+test_expect_success '1d: post-add tracked' '
95
+ (
96
+ cd test1 &&
97
+ local parent_dir="$(pwd)" &&
98
+ (
99
+ cd repo &&
100
+ git add file-tracked &&
101
+ git add inside-tracked &&
102
+ git add ../outside-tracked &&
103
+ git add "$parent_dir/file-tracked" &&
104
+ git ls-files "$parent_dir" >../actual-tracked-unsorted
105
+ ) &&
106
+ sort actual-tracked-unsorted >actual-tracked &&
107
+ sort expect-tracked-unsorted >expect-tracked &&
108
+ test_cmp expect-tracked actual-tracked
109
+ )
110
+'
111
+
112
+test_expect_success '1e: post-add untracked' '
113
+ (
114
+ cd test1 &&
115
+ local parent_dir="$(pwd)" &&
116
+ git -C repo ls-files -o --exclude-standard "$parent_dir" >actual-untracked-unsorted &&
117
+ sort actual-untracked-unsorted >actual-untracked &&
118
+ sort expect-untracked-unsorted >expect-untracked &&
119
+ test_cmp expect-untracked actual-untracked
120
+ )
121
+'
122
+
123
+test_expect_success '2a: setup--set git-dir' '
124
+ mkdir test2 &&
125
+ (
126
+ cd test2 &&
127
+ test_create_repo repo &&
128
+ # create two foreign repositories that should remain untracked
129
+ test_create_repo repo-outside &&
130
+ test_create_repo repo/repo-inside &&
131
+
132
+ mkdir -p repo/inside-tracked repo/inside-untracked &&
133
+ >repo/file-tracked &&
134
+ >repo/file-untracked &&
135
+ >repo/inside-tracked/file &&
136
+ >repo/inside-untracked/file &&
137
+ >repo-outside/file &&
138
+ >repo/repo-inside/file &&
139
+
140
+ cat >expect-tracked-unsorted <<-EOF &&
141
+ repo/file-tracked
142
+ repo/inside-tracked/file
143
+ EOF
144
+
145
+ cat >expect-untracked-unsorted <<-EOF &&
146
+ repo/file-untracked
147
+ repo/inside-untracked/file
148
+ repo/repo-inside/
149
+ repo-outside/
150
+ EOF
151
+
152
+ cat >expect-all-dir-unsorted <<-EOF &&
153
+ repo/
154
+ repo-outside/
155
+ EOF
156
+
157
+ cat expect-tracked-unsorted expect-untracked-unsorted >expect-all-unsorted &&
158
+
159
+ cat >.gitignore <<-EOF
160
+ .gitignore
161
+ actual-*
162
+ expect-*
163
+ EOF
164
+ )
165
+'
166
+
167
+test_expect_success '2b: pre-add all' '
168
+ (
169
+ cd test2 &&
170
+ git --git-dir=repo/.git ls-files -o --exclude-standard >actual-all-unsorted &&
171
+ sort actual-all-unsorted >actual-all &&
172
+ sort expect-all-unsorted >expect-all &&
173
+ test_cmp expect-all actual-all
174
+ )
175
+'
176
+
177
+test_expect_success '2c: pre-add dir all' '
178
+ (
179
+ cd test2 &&
180
+ git --git-dir=repo/.git ls-files -o --directory --exclude-standard >actual-all-dir-unsorted &&
181
+ sort actual-all-dir-unsorted >actual-all &&
182
+ sort expect-all-dir-unsorted >expect-all &&
183
+ test_cmp expect-all actual-all
184
+ )
185
+'
186
+
187
+test_expect_success '2d: post-add tracked' '
188
+ (
189
+ cd test2 &&
190
+ git --git-dir=repo/.git add repo/file-tracked &&
191
+ git --git-dir=repo/.git add repo/inside-tracked &&
192
+ git --git-dir=repo/.git ls-files >actual-tracked-unsorted &&
193
+ sort actual-tracked-unsorted >actual-tracked &&
194
+ sort expect-tracked-unsorted >expect-tracked &&
195
+ test_cmp expect-tracked actual-tracked
196
+ )
197
+'
198
+
199
+test_expect_success '2e: post-add untracked' '
200
+ (
201
+ cd test2 &&
202
+ git --git-dir=repo/.git ls-files -o --exclude-standard >actual-untracked-unsorted &&
203
+ sort actual-untracked-unsorted >actual-untracked &&
204
+ sort expect-untracked-unsorted >expect-untracked &&
205
+ test_cmp expect-untracked actual-untracked
206
+ )
207
+'
208
+
209
+test_expect_success '3a: setup--add repo dir' '
210
+ mkdir test3 &&
211
+ (
212
+ cd test3 &&
213
+ test_create_repo repo &&
214
+
215
+ mkdir -p repo/inside-tracked repo/inside-ignored &&
216
+ >repo/file-tracked &&
217
+ >repo/file-ignored &&
218
+ >repo/inside-tracked/file &&
219
+ >repo/inside-ignored/file &&
220
+
221
+ cat >.gitignore <<-EOF &&
222
+ .gitignore
223
+ actual-*
224
+ expect-*
225
+ *ignored
226
+ EOF
227
+
228
+ cat >expect-tracked-unsorted <<-EOF &&
229
+ repo/file-tracked
230
+ repo/inside-tracked/file
231
+ EOF
232
+
233
+ cat >expect-ignored-unsorted <<-EOF
234
+ repo/file-ignored
235
+ repo/inside-ignored/
236
+ .gitignore
237
+ actual-ignored-unsorted
238
+ expect-ignored-unsorted
239
+ expect-tracked-unsorted
240
+ EOF
241
+ )
242
+'
243
+
244
+test_expect_success '3b: ignored' '
245
+ (
246
+ cd test3 &&
247
+ git --git-dir=repo/.git ls-files -io --directory --exclude-standard >actual-ignored-unsorted &&
248
+ sort actual-ignored-unsorted >actual-ignored &&
249
+ sort expect-ignored-unsorted >expect-ignored &&
250
+ test_cmp expect-ignored actual-ignored
251
+ )
252
+'
253
+
254
+test_expect_success '3c: add repo' '
255
+ (
256
+ cd test3 &&
257
+ git --git-dir=repo/.git add repo &&
258
+ git --git-dir=repo/.git ls-files >actual-tracked-unsorted &&
259
+ sort actual-tracked-unsorted >actual-tracked &&
260
+ sort expect-tracked-unsorted >expect-tracked &&
261
+ test_cmp expect-tracked actual-tracked
262
+ )
263
+'
264
+
265
+test_done