]>
Commit | Line | Data |
---|---|---|
6594afc3 MT |
1 | #!/bin/sh |
2 | ||
3 | test_description='git add in sparse checked out working trees' | |
4 | ||
5 | . ./test-lib.sh | |
6 | ||
7 | SPARSE_ENTRY_BLOB="" | |
8 | ||
9 | # Optionally take a printf format string to write to the sparse_entry file | |
10 | setup_sparse_entry () { | |
11 | # 'sparse_entry' might already be in the index with the skip-worktree | |
12 | # bit set. Remove it so that the subsequent git add can update it. | |
13 | git update-index --force-remove sparse_entry && | |
14 | if test $# -eq 1 | |
15 | then | |
16 | printf "$1" >sparse_entry | |
17 | else | |
18 | >sparse_entry | |
19 | fi && | |
20 | git add sparse_entry && | |
21 | git update-index --skip-worktree sparse_entry && | |
af6a5187 | 22 | git config core.sparseCheckout false && |
ca267aee | 23 | git commit --allow-empty -m "ensure sparse_entry exists at HEAD" && |
6594afc3 MT |
24 | SPARSE_ENTRY_BLOB=$(git rev-parse :sparse_entry) |
25 | } | |
26 | ||
27 | test_sparse_entry_unchanged () { | |
28 | echo "100644 $SPARSE_ENTRY_BLOB 0 sparse_entry" >expected && | |
29 | git ls-files --stage sparse_entry >actual && | |
30 | test_cmp expected actual | |
31 | } | |
32 | ||
33 | setup_gitignore () { | |
34 | test_when_finished rm -f .gitignore && | |
35 | cat >.gitignore <<-EOF | |
36 | * | |
37 | !/sparse_entry | |
38 | EOF | |
39 | } | |
40 | ||
ca267aee DS |
41 | test_sparse_entry_unstaged () { |
42 | git diff --staged -- sparse_entry >diff && | |
43 | test_must_be_empty diff | |
44 | } | |
45 | ||
a20f7047 MT |
46 | test_expect_success 'setup' " |
47 | cat >sparse_error_header <<-EOF && | |
6579e788 DS |
48 | The following paths and/or pathspecs matched paths that exist |
49 | outside of your sparse-checkout definition, so will not be | |
50 | updated in the index: | |
a20f7047 MT |
51 | EOF |
52 | ||
53 | cat >sparse_hint <<-EOF && | |
6579e788 DS |
54 | hint: If you intend to update such entries, try one of the following: |
55 | hint: * Use the --sparse option. | |
56 | hint: * Disable or modify the sparsity rules. | |
a20f7047 MT |
57 | hint: Disable this message with \"git config advice.updateSparsePath false\" |
58 | EOF | |
59 | ||
60 | echo sparse_entry | cat sparse_error_header - >sparse_entry_error && | |
61 | cat sparse_entry_error sparse_hint >error_and_hint | |
62 | " | |
63 | ||
6594afc3 MT |
64 | test_expect_success 'git add does not remove sparse entries' ' |
65 | setup_sparse_entry && | |
66 | rm sparse_entry && | |
a20f7047 | 67 | test_must_fail git add sparse_entry 2>stderr && |
ca267aee | 68 | test_sparse_entry_unstaged && |
a20f7047 | 69 | test_cmp error_and_hint stderr && |
6594afc3 MT |
70 | test_sparse_entry_unchanged |
71 | ' | |
72 | ||
73 | test_expect_success 'git add -A does not remove sparse entries' ' | |
74 | setup_sparse_entry && | |
75 | rm sparse_entry && | |
76 | setup_gitignore && | |
a20f7047 MT |
77 | git add -A 2>stderr && |
78 | test_must_be_empty stderr && | |
6594afc3 MT |
79 | test_sparse_entry_unchanged |
80 | ' | |
81 | ||
82 | test_expect_success 'git add . does not remove sparse entries' ' | |
83 | setup_sparse_entry && | |
84 | rm sparse_entry && | |
85 | setup_gitignore && | |
a20f7047 | 86 | test_must_fail git add . 2>stderr && |
ca267aee | 87 | test_sparse_entry_unstaged && |
a20f7047 MT |
88 | |
89 | cat sparse_error_header >expect && | |
90 | echo . >>expect && | |
91 | cat sparse_hint >>expect && | |
92 | ||
93 | test_cmp expect stderr && | |
6594afc3 MT |
94 | test_sparse_entry_unchanged |
95 | ' | |
96 | ||
97 | for opt in "" -f -u --ignore-removal --dry-run | |
98 | do | |
99 | test_expect_success "git add${opt:+ $opt} does not update sparse entries" ' | |
100 | setup_sparse_entry && | |
101 | echo modified >sparse_entry && | |
a20f7047 | 102 | test_must_fail git add $opt sparse_entry 2>stderr && |
ca267aee | 103 | test_sparse_entry_unstaged && |
a20f7047 | 104 | test_cmp error_and_hint stderr && |
6594afc3 MT |
105 | test_sparse_entry_unchanged |
106 | ' | |
107 | done | |
108 | ||
109 | test_expect_success 'git add --refresh does not update sparse entries' ' | |
110 | setup_sparse_entry && | |
111 | git ls-files --debug sparse_entry | grep mtime >before && | |
112 | test-tool chmtime -60 sparse_entry && | |
a20f7047 | 113 | test_must_fail git add --refresh sparse_entry 2>stderr && |
ca267aee | 114 | test_sparse_entry_unstaged && |
a20f7047 | 115 | test_cmp error_and_hint stderr && |
6594afc3 MT |
116 | git ls-files --debug sparse_entry | grep mtime >after && |
117 | test_cmp before after | |
118 | ' | |
119 | ||
d73dbafc | 120 | test_expect_success 'git add --chmod does not update sparse entries' ' |
6594afc3 | 121 | setup_sparse_entry && |
a20f7047 | 122 | test_must_fail git add --chmod=+x sparse_entry 2>stderr && |
ca267aee | 123 | test_sparse_entry_unstaged && |
a20f7047 | 124 | test_cmp error_and_hint stderr && |
6594afc3 MT |
125 | test_sparse_entry_unchanged && |
126 | ! test -x sparse_entry | |
127 | ' | |
128 | ||
d73dbafc | 129 | test_expect_success 'git add --renormalize does not update sparse entries' ' |
af6a5187 | 130 | test_when_finished rm .gitattributes && |
6594afc3 MT |
131 | test_config core.autocrlf false && |
132 | setup_sparse_entry "LINEONE\r\nLINETWO\r\n" && | |
133 | echo "sparse_entry text=auto" >.gitattributes && | |
a20f7047 | 134 | test_must_fail git add --renormalize sparse_entry 2>stderr && |
ca267aee | 135 | test_sparse_entry_unstaged && |
a20f7047 MT |
136 | test_cmp error_and_hint stderr && |
137 | test_sparse_entry_unchanged | |
138 | ' | |
139 | ||
140 | test_expect_success 'git add --dry-run --ignore-missing warn on sparse path' ' | |
141 | setup_sparse_entry && | |
142 | rm sparse_entry && | |
143 | test_must_fail git add --dry-run --ignore-missing sparse_entry 2>stderr && | |
ca267aee | 144 | test_sparse_entry_unstaged && |
a20f7047 | 145 | test_cmp error_and_hint stderr && |
6594afc3 MT |
146 | test_sparse_entry_unchanged |
147 | ' | |
148 | ||
a20f7047 MT |
149 | test_expect_success 'do not advice about sparse entries when they do not match the pathspec' ' |
150 | setup_sparse_entry && | |
151 | test_must_fail git add nonexistent 2>stderr && | |
152 | grep "fatal: pathspec .nonexistent. did not match any files" stderr && | |
153 | ! grep -F -f sparse_error_header stderr | |
154 | ' | |
155 | ||
156 | test_expect_success 'do not warn when pathspec matches dense entries' ' | |
157 | setup_sparse_entry && | |
158 | echo modified >sparse_entry && | |
159 | >dense_entry && | |
160 | git add "*_entry" 2>stderr && | |
161 | test_must_be_empty stderr && | |
162 | test_sparse_entry_unchanged && | |
163 | git ls-files --error-unmatch dense_entry | |
164 | ' | |
165 | ||
49fdd51a DS |
166 | test_expect_success 'git add fails outside of sparse-checkout definition' ' |
167 | test_when_finished git sparse-checkout disable && | |
168 | test_commit a && | |
dde13589 | 169 | git sparse-checkout init --no-cone && |
49fdd51a DS |
170 | git sparse-checkout set a && |
171 | echo >>sparse_entry && | |
172 | ||
173 | git update-index --no-skip-worktree sparse_entry && | |
174 | test_must_fail git add sparse_entry && | |
0299a696 DS |
175 | test_sparse_entry_unstaged && |
176 | ||
63b60b3a DS |
177 | test_must_fail git add --chmod=+x sparse_entry && |
178 | test_sparse_entry_unstaged && | |
179 | ||
61d450f0 DS |
180 | test_must_fail git add --renormalize sparse_entry && |
181 | test_sparse_entry_unstaged && | |
182 | ||
0299a696 DS |
183 | # Avoid munging CRLFs to avoid an error message |
184 | git -c core.autocrlf=input add --sparse sparse_entry 2>stderr && | |
185 | test_must_be_empty stderr && | |
c2a29405 DS |
186 | git ls-files --stage >actual && |
187 | grep "^100644 .*sparse_entry\$" actual && | |
63b60b3a DS |
188 | |
189 | git add --sparse --chmod=+x sparse_entry 2>stderr && | |
190 | test_must_be_empty stderr && | |
c2a29405 DS |
191 | git ls-files --stage >actual && |
192 | grep "^100755 .*sparse_entry\$" actual && | |
61d450f0 DS |
193 | |
194 | git reset && | |
195 | ||
196 | # This will print a message over stderr on Windows. | |
197 | git add --sparse --renormalize sparse_entry && | |
198 | git status --porcelain >actual && | |
199 | grep "^M sparse_entry\$" actual | |
49fdd51a DS |
200 | ' |
201 | ||
a20f7047 MT |
202 | test_expect_success 'add obeys advice.updateSparsePath' ' |
203 | setup_sparse_entry && | |
204 | test_must_fail git -c advice.updateSparsePath=false add sparse_entry 2>stderr && | |
ca267aee | 205 | test_sparse_entry_unstaged && |
a20f7047 MT |
206 | test_cmp sparse_entry_error stderr |
207 | ||
208 | ' | |
209 | ||
0299a696 | 210 | test_expect_success 'add allows sparse entries with --sparse' ' |
dde13589 | 211 | git sparse-checkout set --no-cone a && |
0299a696 DS |
212 | echo modified >sparse_entry && |
213 | test_must_fail git add sparse_entry && | |
214 | test_sparse_entry_unchanged && | |
215 | git add --sparse sparse_entry 2>stderr && | |
216 | test_must_be_empty stderr | |
217 | ' | |
218 | ||
20141e32 MT |
219 | test_expect_success 'can add files from non-sparse dir' ' |
220 | git sparse-checkout set w !/x y/ && | |
221 | mkdir -p w x/y && | |
222 | touch w/f x/y/f && | |
223 | git add w/f x/y/f 2>stderr && | |
224 | test_must_be_empty stderr | |
225 | ' | |
226 | ||
227 | test_expect_success 'refuse to add non-skip-worktree file from sparse dir' ' | |
228 | git sparse-checkout set !/x y/ !x/y/z && | |
229 | mkdir -p x/y/z && | |
230 | touch x/y/z/f && | |
231 | test_must_fail git add x/y/z/f 2>stderr && | |
232 | echo x/y/z/f | cat sparse_error_header - sparse_hint >expect && | |
233 | test_cmp expect stderr | |
234 | ' | |
235 | ||
6594afc3 | 236 | test_done |