Merge branch 'rs/convert-fix-utf-without-dash'
[git.git] / t / t6135-pathspec-with-attrs.sh
blob457cc167c774a0e4551cfc98c4f9aec6a17e1416
1 #!/bin/sh
3 test_description='test labels in pathspecs'
4 . ./test-lib.sh
6 test_expect_success 'setup a tree' '
7 cat <<-\EOF >expect &&
8 fileA
9 fileAB
10 fileAC
11 fileB
12 fileBC
13 fileC
14 fileNoLabel
15 fileSetLabel
16 fileUnsetLabel
17 fileValue
18 fileWrongLabel
19 sub/fileA
20 sub/fileAB
21 sub/fileAC
22 sub/fileB
23 sub/fileBC
24 sub/fileC
25 sub/fileNoLabel
26 sub/fileSetLabel
27 sub/fileUnsetLabel
28 sub/fileValue
29 sub/fileWrongLabel
30 EOF
31 mkdir sub &&
32 while read path
34 echo content >$path &&
35 git add $path || return 1
36 done <expect &&
37 git commit -m "initial commit" &&
38 git ls-files >actual &&
39 test_cmp expect actual
42 test_expect_success 'pathspec with no attr' '
43 test_must_fail git ls-files ":(attr:)"
46 test_expect_success 'pathspec with labels and non existent .gitattributes' '
47 git ls-files ":(attr:label)" >actual &&
48 test_must_be_empty actual
51 test_expect_success 'pathspec with labels and non existent .gitattributes (2)' '
52 test_must_fail git grep content HEAD -- ":(attr:label)"
55 test_expect_success 'setup .gitattributes' '
56 cat <<-\EOF >.gitattributes &&
57 fileA labelA
58 fileB labelB
59 fileC labelC
60 fileAB labelA labelB
61 fileAC labelA labelC
62 fileBC labelB labelC
63 fileUnsetLabel -label
64 fileSetLabel label
65 fileValue label=foo
66 fileWrongLabel label☺
67 EOF
68 git add .gitattributes &&
69 git commit -m "add attributes"
72 test_expect_success 'check specific set attr' '
73 cat <<-\EOF >expect &&
74 fileSetLabel
75 sub/fileSetLabel
76 EOF
77 git ls-files ":(attr:label)" >actual &&
78 test_cmp expect actual
81 test_expect_success 'check specific set attr (2)' '
82 cat <<-\EOF >expect &&
83 HEAD:fileSetLabel
84 HEAD:sub/fileSetLabel
85 EOF
86 git grep -l content HEAD ":(attr:label)" >actual &&
87 test_cmp expect actual
90 test_expect_success 'check specific unset attr' '
91 cat <<-\EOF >expect &&
92 fileUnsetLabel
93 sub/fileUnsetLabel
94 EOF
95 git ls-files ":(attr:-label)" >actual &&
96 test_cmp expect actual
99 test_expect_success 'check specific unset attr (2)' '
100 cat <<-\EOF >expect &&
101 HEAD:fileUnsetLabel
102 HEAD:sub/fileUnsetLabel
104 git grep -l content HEAD ":(attr:-label)" >actual &&
105 test_cmp expect actual
108 test_expect_success 'check specific value attr' '
109 cat <<-\EOF >expect &&
110 fileValue
111 sub/fileValue
113 git ls-files ":(attr:label=foo)" >actual &&
114 test_cmp expect actual &&
115 git ls-files ":(attr:label=bar)" >actual &&
116 test_must_be_empty actual
119 test_expect_success 'check specific value attr (2)' '
120 cat <<-\EOF >expect &&
121 HEAD:fileValue
122 HEAD:sub/fileValue
124 git grep -l content HEAD ":(attr:label=foo)" >actual &&
125 test_cmp expect actual &&
126 test_must_fail git grep -l content HEAD ":(attr:label=bar)"
129 test_expect_success 'check unspecified attr' '
130 cat <<-\EOF >expect &&
131 .gitattributes
132 fileA
133 fileAB
134 fileAC
135 fileB
136 fileBC
137 fileC
138 fileNoLabel
139 fileWrongLabel
140 sub/fileA
141 sub/fileAB
142 sub/fileAC
143 sub/fileB
144 sub/fileBC
145 sub/fileC
146 sub/fileNoLabel
147 sub/fileWrongLabel
149 git ls-files ":(attr:!label)" >actual &&
150 test_cmp expect actual
153 test_expect_success 'check unspecified attr (2)' '
154 cat <<-\EOF >expect &&
155 HEAD:.gitattributes
156 HEAD:fileA
157 HEAD:fileAB
158 HEAD:fileAC
159 HEAD:fileB
160 HEAD:fileBC
161 HEAD:fileC
162 HEAD:fileNoLabel
163 HEAD:fileWrongLabel
164 HEAD:sub/fileA
165 HEAD:sub/fileAB
166 HEAD:sub/fileAC
167 HEAD:sub/fileB
168 HEAD:sub/fileBC
169 HEAD:sub/fileC
170 HEAD:sub/fileNoLabel
171 HEAD:sub/fileWrongLabel
173 git grep -l ^ HEAD ":(attr:!label)" >actual &&
174 test_cmp expect actual
177 test_expect_success 'check multiple unspecified attr' '
178 cat <<-\EOF >expect &&
179 .gitattributes
180 fileC
181 fileNoLabel
182 fileWrongLabel
183 sub/fileC
184 sub/fileNoLabel
185 sub/fileWrongLabel
187 git ls-files ":(attr:!labelB !labelA !label)" >actual &&
188 test_cmp expect actual
191 test_expect_success 'check label with more labels but excluded path' '
192 cat <<-\EOF >expect &&
193 fileAB
194 fileB
195 fileBC
197 git ls-files ":(attr:labelB)" ":(exclude)sub/" >actual &&
198 test_cmp expect actual
201 test_expect_success 'check label excluding other labels' '
202 cat <<-\EOF >expect &&
203 fileAB
204 fileB
205 fileBC
206 sub/fileAB
207 sub/fileB
209 git ls-files ":(attr:labelB)" ":(exclude,attr:labelC)sub/" >actual &&
210 test_cmp expect actual
213 test_expect_success 'fail on multiple attr specifiers in one pathspec item' '
214 test_must_fail git ls-files . ":(attr:labelB,attr:labelC)" 2>actual &&
215 test_i18ngrep "Only one" actual
218 test_expect_success 'fail if attr magic is used places not implemented' '
219 # The main purpose of this test is to check that we actually fail
220 # when you attempt to use attr magic in commands that do not implement
221 # attr magic. This test does not advocate git-add to stay that way,
222 # though, but git-add is convenient as it has its own internal pathspec
223 # parsing.
224 test_must_fail git add ":(attr:labelB)" 2>actual &&
225 test_i18ngrep "magic not supported" actual
228 test_expect_success 'abort on giving invalid label on the command line' '
229 test_must_fail git ls-files . ":(attr:☺)"
232 test_expect_success 'abort on asking for wrong magic' '
233 test_must_fail git ls-files . ":(attr:-label=foo)" &&
234 test_must_fail git ls-files . ":(attr:!label=foo)"
237 test_expect_success 'check attribute list' '
238 cat <<-EOF >>.gitattributes &&
239 * whitespace=indent,trail,space
241 git ls-files ":(attr:whitespace=indent\,trail\,space)" >actual &&
242 git ls-files >expect &&
243 test_cmp expect actual
246 test_expect_success 'backslash cannot be the last character' '
247 test_must_fail git ls-files ":(attr:label=foo\\ labelA=bar)" 2>actual &&
248 test_i18ngrep "not allowed as last character in attr value" actual
251 test_expect_success 'backslash cannot be used as a value' '
252 test_must_fail git ls-files ":(attr:label=f\\\oo)" 2>actual &&
253 test_i18ngrep "for value matching" actual
256 test_done