Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | |
| 3 | test_description='test case exclude pathspec' |
| 4 | |
| 5 | . ./test-lib.sh |
| 6 | |
| 7 | test_expect_success 'setup' ' |
| 8 | for p in file sub/file sub/sub/file sub/file2 sub/sub/sub/file sub2/file; do |
| 9 | if echo $p | grep /; then |
Elia Pinto | 7b8c0b5 | 2016-01-07 14:51:46 +0100 | [diff] [blame] | 10 | mkdir -p $(dirname $p) |
Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 11 | fi && |
| 12 | : >$p && |
| 13 | git add $p && |
Eric Sunshine | 0c51d6b | 2021-12-09 00:11:15 -0500 | [diff] [blame] | 14 | git commit -m $p || return 1 |
Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 15 | done && |
| 16 | git log --oneline --format=%s >actual && |
| 17 | cat <<EOF >expect && |
| 18 | sub2/file |
| 19 | sub/sub/sub/file |
| 20 | sub/file2 |
| 21 | sub/sub/file |
| 22 | sub/file |
| 23 | file |
| 24 | EOF |
| 25 | test_cmp expect actual |
| 26 | ' |
| 27 | |
Manav Rathi | 93dbefb | 2017-09-25 13:39:00 +0530 | [diff] [blame] | 28 | test_expect_success 'exclude only pathspec uses default implicit pathspec' ' |
Linus Torvalds | 859b7f1 | 2017-02-07 21:08:15 -0800 | [diff] [blame] | 29 | git log --oneline --format=%s -- . ":(exclude)sub" >expect && |
| 30 | git log --oneline --format=%s -- ":(exclude)sub" >actual && |
| 31 | test_cmp expect actual |
Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 32 | ' |
| 33 | |
| 34 | test_expect_success 't_e_i() exclude sub' ' |
Jeff King | 60687de | 2015-03-20 06:06:44 -0400 | [diff] [blame] | 35 | git log --oneline --format=%s -- . ":(exclude)sub" >actual && |
Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 36 | cat <<EOF >expect && |
| 37 | sub2/file |
| 38 | file |
| 39 | EOF |
| 40 | test_cmp expect actual |
| 41 | ' |
| 42 | |
| 43 | test_expect_success 't_e_i() exclude sub/sub/file' ' |
Jeff King | 60687de | 2015-03-20 06:06:44 -0400 | [diff] [blame] | 44 | git log --oneline --format=%s -- . ":(exclude)sub/sub/file" >actual && |
Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 45 | cat <<EOF >expect && |
| 46 | sub2/file |
| 47 | sub/sub/sub/file |
| 48 | sub/file2 |
| 49 | sub/file |
| 50 | file |
| 51 | EOF |
| 52 | test_cmp expect actual |
| 53 | ' |
| 54 | |
| 55 | test_expect_success 't_e_i() exclude sub using mnemonic' ' |
Jeff King | 60687de | 2015-03-20 06:06:44 -0400 | [diff] [blame] | 56 | git log --oneline --format=%s -- . ":!sub" >actual && |
Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 57 | cat <<EOF >expect && |
| 58 | sub2/file |
| 59 | file |
| 60 | EOF |
| 61 | test_cmp expect actual |
| 62 | ' |
| 63 | |
| 64 | test_expect_success 't_e_i() exclude :(icase)SUB' ' |
Jeff King | 60687de | 2015-03-20 06:06:44 -0400 | [diff] [blame] | 65 | git log --oneline --format=%s -- . ":(exclude,icase)SUB" >actual && |
Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 66 | cat <<EOF >expect && |
| 67 | sub2/file |
| 68 | file |
| 69 | EOF |
| 70 | test_cmp expect actual |
| 71 | ' |
| 72 | |
| 73 | test_expect_success 't_e_i() exclude sub2 from sub' ' |
| 74 | ( |
| 75 | cd sub && |
Jeff King | 60687de | 2015-03-20 06:06:44 -0400 | [diff] [blame] | 76 | git log --oneline --format=%s -- :/ ":/!sub2" >actual && |
Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 77 | cat <<EOF >expect && |
| 78 | sub/sub/sub/file |
| 79 | sub/file2 |
| 80 | sub/sub/file |
| 81 | sub/file |
| 82 | file |
| 83 | EOF |
| 84 | test_cmp expect actual |
| 85 | ) |
| 86 | ' |
| 87 | |
| 88 | test_expect_success 't_e_i() exclude sub/*file' ' |
Jeff King | 60687de | 2015-03-20 06:06:44 -0400 | [diff] [blame] | 89 | git log --oneline --format=%s -- . ":(exclude)sub/*file" >actual && |
Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 90 | cat <<EOF >expect && |
| 91 | sub2/file |
| 92 | sub/file2 |
| 93 | file |
| 94 | EOF |
| 95 | test_cmp expect actual |
| 96 | ' |
| 97 | |
| 98 | test_expect_success 't_e_i() exclude :(glob)sub/*/file' ' |
Jeff King | 60687de | 2015-03-20 06:06:44 -0400 | [diff] [blame] | 99 | git log --oneline --format=%s -- . ":(exclude,glob)sub/*/file" >actual && |
Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 100 | cat <<EOF >expect && |
| 101 | sub2/file |
| 102 | sub/sub/sub/file |
| 103 | sub/file2 |
| 104 | sub/file |
| 105 | file |
| 106 | EOF |
| 107 | test_cmp expect actual |
| 108 | ' |
| 109 | |
| 110 | test_expect_success 'm_p_d() exclude sub' ' |
Jeff King | 60687de | 2015-03-20 06:06:44 -0400 | [diff] [blame] | 111 | git ls-files -- . ":(exclude)sub" >actual && |
Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 112 | cat <<EOF >expect && |
| 113 | file |
| 114 | sub2/file |
| 115 | EOF |
| 116 | test_cmp expect actual |
| 117 | ' |
| 118 | |
| 119 | test_expect_success 'm_p_d() exclude sub/sub/file' ' |
Jeff King | 60687de | 2015-03-20 06:06:44 -0400 | [diff] [blame] | 120 | git ls-files -- . ":(exclude)sub/sub/file" >actual && |
Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 121 | cat <<EOF >expect && |
| 122 | file |
| 123 | sub/file |
| 124 | sub/file2 |
| 125 | sub/sub/sub/file |
| 126 | sub2/file |
| 127 | EOF |
| 128 | test_cmp expect actual |
| 129 | ' |
| 130 | |
| 131 | test_expect_success 'm_p_d() exclude sub using mnemonic' ' |
Jeff King | 60687de | 2015-03-20 06:06:44 -0400 | [diff] [blame] | 132 | git ls-files -- . ":!sub" >actual && |
Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 133 | cat <<EOF >expect && |
| 134 | file |
| 135 | sub2/file |
| 136 | EOF |
| 137 | test_cmp expect actual |
| 138 | ' |
| 139 | |
| 140 | test_expect_success 'm_p_d() exclude :(icase)SUB' ' |
Jeff King | 60687de | 2015-03-20 06:06:44 -0400 | [diff] [blame] | 141 | git ls-files -- . ":(exclude,icase)SUB" >actual && |
Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 142 | cat <<EOF >expect && |
| 143 | file |
| 144 | sub2/file |
| 145 | EOF |
| 146 | test_cmp expect actual |
| 147 | ' |
| 148 | |
| 149 | test_expect_success 'm_p_d() exclude sub2 from sub' ' |
| 150 | ( |
| 151 | cd sub && |
Jeff King | 60687de | 2015-03-20 06:06:44 -0400 | [diff] [blame] | 152 | git ls-files -- :/ ":/!sub2" >actual && |
Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 153 | cat <<EOF >expect && |
| 154 | ../file |
| 155 | file |
| 156 | file2 |
| 157 | sub/file |
| 158 | sub/sub/file |
| 159 | EOF |
| 160 | test_cmp expect actual |
| 161 | ) |
| 162 | ' |
| 163 | |
| 164 | test_expect_success 'm_p_d() exclude sub/*file' ' |
Jeff King | 60687de | 2015-03-20 06:06:44 -0400 | [diff] [blame] | 165 | git ls-files -- . ":(exclude)sub/*file" >actual && |
Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 166 | cat <<EOF >expect && |
| 167 | file |
| 168 | sub/file2 |
| 169 | sub2/file |
| 170 | EOF |
| 171 | test_cmp expect actual |
| 172 | ' |
| 173 | |
| 174 | test_expect_success 'm_p_d() exclude :(glob)sub/*/file' ' |
Jeff King | 60687de | 2015-03-20 06:06:44 -0400 | [diff] [blame] | 175 | git ls-files -- . ":(exclude,glob)sub/*/file" >actual && |
Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 176 | cat <<EOF >expect && |
| 177 | file |
| 178 | sub/file |
| 179 | sub/file2 |
| 180 | sub/sub/sub/file |
| 181 | sub2/file |
| 182 | EOF |
| 183 | test_cmp expect actual |
| 184 | ' |
| 185 | |
Manav Rathi | 93dbefb | 2017-09-25 13:39:00 +0530 | [diff] [blame] | 186 | test_expect_success 'multiple exclusions' ' |
| 187 | git ls-files -- ":^*/file2" ":^sub2" >actual && |
| 188 | cat <<-\EOF >expect && |
| 189 | file |
| 190 | sub/file |
| 191 | sub/sub/file |
| 192 | sub/sub/sub/file |
| 193 | EOF |
| 194 | test_cmp expect actual |
| 195 | ' |
| 196 | |
Nguyễn Thái Ngọc Duy | b7845ce | 2018-11-04 06:28:51 +0100 | [diff] [blame] | 197 | test_expect_success 't_e_i() exclude case #8' ' |
Junio C Hamano | b02fdbc | 2022-05-29 15:39:51 -0700 | [diff] [blame] | 198 | test_when_finished "rm -fr case8" && |
Nguyễn Thái Ngọc Duy | b7845ce | 2018-11-04 06:28:51 +0100 | [diff] [blame] | 199 | git init case8 && |
| 200 | ( |
| 201 | cd case8 && |
| 202 | echo file >file1 && |
| 203 | echo file >file2 && |
| 204 | git add file1 file2 && |
| 205 | git commit -m twofiles && |
| 206 | git grep -l file HEAD :^file2 >actual && |
| 207 | echo HEAD:file1 >expected && |
| 208 | test_cmp expected actual && |
| 209 | git grep -l file HEAD :^file1 >actual && |
| 210 | echo HEAD:file2 >expected && |
| 211 | test_cmp expected actual |
| 212 | ) |
| 213 | ' |
| 214 | |
Elijah Newren | f1f061e | 2020-06-05 18:23:48 +0000 | [diff] [blame] | 215 | test_expect_success 'grep --untracked PATTERN' ' |
| 216 | # This test is not an actual test of exclude patterns, rather it |
| 217 | # is here solely to ensure that if any tests are inserted, deleted, or |
| 218 | # changed above, that we still have untracked files with the expected |
| 219 | # contents for the NEXT two tests. |
| 220 | cat <<-\EOF >expect-grep && |
| 221 | actual |
| 222 | expect |
| 223 | sub/actual |
| 224 | sub/expect |
| 225 | EOF |
| 226 | git grep -l --untracked file -- >actual-grep && |
| 227 | test_cmp expect-grep actual-grep |
| 228 | ' |
| 229 | |
| 230 | test_expect_success 'grep --untracked PATTERN :(exclude)DIR' ' |
| 231 | cat <<-\EOF >expect-grep && |
| 232 | actual |
| 233 | expect |
| 234 | EOF |
| 235 | git grep -l --untracked file -- ":(exclude)sub" >actual-grep && |
| 236 | test_cmp expect-grep actual-grep |
| 237 | ' |
| 238 | |
| 239 | test_expect_success 'grep --untracked PATTERN :(exclude)*FILE' ' |
| 240 | cat <<-\EOF >expect-grep && |
| 241 | actual |
| 242 | sub/actual |
| 243 | EOF |
| 244 | git grep -l --untracked file -- ":(exclude)*expect" >actual-grep && |
| 245 | test_cmp expect-grep actual-grep |
| 246 | ' |
| 247 | |
Junio C Hamano | b02fdbc | 2022-05-29 15:39:51 -0700 | [diff] [blame] | 248 | # Depending on the command, all negative pathspec needs to subtract |
| 249 | # either from the full tree, or from the current directory. |
| 250 | # |
| 251 | # The sample tree checked out at this point has: |
| 252 | # file |
| 253 | # sub/file |
| 254 | # sub/file2 |
| 255 | # sub/sub/file |
| 256 | # sub/sub/sub/file |
| 257 | # sub2/file |
| 258 | # |
| 259 | # but there may also be some cruft that interferes with "git clean" |
| 260 | # and "git add" tests. |
| 261 | |
| 262 | test_expect_success 'archive with all negative' ' |
| 263 | git reset --hard && |
| 264 | git clean -f && |
| 265 | git -C sub archive --format=tar HEAD -- ":!sub/" >archive && |
| 266 | "$TAR" tf archive >actual && |
| 267 | cat >expect <<-\EOF && |
| 268 | file |
| 269 | file2 |
| 270 | EOF |
| 271 | test_cmp expect actual |
| 272 | ' |
| 273 | |
| 274 | test_expect_success 'add with all negative' ' |
| 275 | H=$(git rev-parse HEAD) && |
| 276 | git reset --hard $H && |
| 277 | git clean -f && |
| 278 | test_when_finished "git reset --hard $H" && |
| 279 | for path in file sub/file sub/sub/file sub2/file |
| 280 | do |
| 281 | echo smudge >>"$path" || return 1 |
| 282 | done && |
| 283 | git -C sub add -- ":!sub/" && |
| 284 | git diff --name-only --no-renames --cached >actual && |
| 285 | cat >expect <<-\EOF && |
| 286 | file |
| 287 | sub/file |
| 288 | sub2/file |
| 289 | EOF |
| 290 | test_cmp expect actual && |
| 291 | git diff --name-only --no-renames >actual && |
| 292 | echo sub/sub/file >expect && |
| 293 | test_cmp expect actual |
| 294 | ' |
| 295 | |
Ævar Arnfjörð Bjarmason | 20b813d | 2023-02-06 23:58:56 +0100 | [diff] [blame] | 296 | test_expect_success 'add -p with all negative' ' |
Junio C Hamano | b02fdbc | 2022-05-29 15:39:51 -0700 | [diff] [blame] | 297 | H=$(git rev-parse HEAD) && |
| 298 | git reset --hard $H && |
| 299 | git clean -f && |
| 300 | test_when_finished "git reset --hard $H" && |
| 301 | for path in file sub/file sub/sub/file sub2/file |
| 302 | do |
| 303 | echo smudge >>"$path" || return 1 |
| 304 | done && |
| 305 | yes | git -C sub add -p -- ":!sub/" && |
| 306 | git diff --name-only --no-renames --cached >actual && |
| 307 | cat >expect <<-\EOF && |
| 308 | file |
| 309 | sub/file |
| 310 | sub2/file |
| 311 | EOF |
| 312 | test_cmp expect actual && |
| 313 | git diff --name-only --no-renames >actual && |
| 314 | echo sub/sub/file >expect && |
| 315 | test_cmp expect actual |
| 316 | ' |
| 317 | |
| 318 | test_expect_success 'clean with all negative' ' |
| 319 | H=$(git rev-parse HEAD) && |
| 320 | git reset --hard $H && |
| 321 | test_when_finished "git reset --hard $H && git clean -f" && |
| 322 | git clean -f && |
| 323 | for path in file9 sub/file9 sub/sub/file9 sub2/file9 |
| 324 | do |
| 325 | echo cruft >"$path" || return 1 |
| 326 | done && |
| 327 | git -C sub clean -f -- ":!sub" && |
| 328 | test_path_is_file file9 && |
| 329 | test_path_is_missing sub/file9 && |
| 330 | test_path_is_file sub/sub/file9 && |
| 331 | test_path_is_file sub2/file9 |
| 332 | ' |
| 333 | |
| 334 | test_expect_success 'commit with all negative' ' |
| 335 | H=$(git rev-parse HEAD) && |
| 336 | git reset --hard $H && |
| 337 | test_when_finished "git reset --hard $H" && |
| 338 | for path in file sub/file sub/sub/file sub2/file |
| 339 | do |
| 340 | echo smudge >>"$path" || return 1 |
| 341 | done && |
| 342 | git -C sub commit -m sample -- ":!sub/" && |
| 343 | git diff --name-only --no-renames HEAD^ HEAD >actual && |
| 344 | cat >expect <<-\EOF && |
| 345 | file |
| 346 | sub/file |
| 347 | sub2/file |
| 348 | EOF |
| 349 | test_cmp expect actual && |
| 350 | git diff --name-only --no-renames HEAD >actual && |
| 351 | echo sub/sub/file >expect && |
| 352 | test_cmp expect actual |
| 353 | ' |
| 354 | |
| 355 | test_expect_success 'reset with all negative' ' |
| 356 | H=$(git rev-parse HEAD) && |
| 357 | git reset --hard $H && |
| 358 | test_when_finished "git reset --hard $H" && |
| 359 | for path in file sub/file sub/sub/file sub2/file |
| 360 | do |
| 361 | echo smudge >>"$path" && |
| 362 | git add "$path" || return 1 |
| 363 | done && |
| 364 | git -C sub reset --quiet -- ":!sub/" && |
| 365 | git diff --name-only --no-renames --cached >actual && |
| 366 | echo sub/sub/file >expect && |
| 367 | test_cmp expect actual |
| 368 | ' |
| 369 | |
| 370 | test_expect_success 'grep with all negative' ' |
| 371 | H=$(git rev-parse HEAD) && |
| 372 | git reset --hard $H && |
| 373 | test_when_finished "git reset --hard $H" && |
| 374 | for path in file sub/file sub/sub/file sub2/file |
| 375 | do |
| 376 | echo "needle $path" >>"$path" || return 1 |
| 377 | done && |
| 378 | git -C sub grep -h needle -- ":!sub/" >actual && |
| 379 | cat >expect <<-\EOF && |
| 380 | needle sub/file |
| 381 | EOF |
| 382 | test_cmp expect actual |
| 383 | ' |
| 384 | |
| 385 | test_expect_success 'ls-files with all negative' ' |
| 386 | git reset --hard && |
| 387 | git -C sub ls-files -- ":!sub/" >actual && |
| 388 | cat >expect <<-\EOF && |
| 389 | file |
| 390 | file2 |
| 391 | EOF |
| 392 | test_cmp expect actual |
| 393 | ' |
| 394 | |
| 395 | test_expect_success 'rm with all negative' ' |
| 396 | git reset --hard && |
| 397 | test_when_finished "git reset --hard" && |
| 398 | git -C sub rm -r --cached -- ":!sub/" >actual && |
| 399 | git diff --name-only --no-renames --diff-filter=D --cached >actual && |
| 400 | cat >expect <<-\EOF && |
| 401 | sub/file |
| 402 | sub/file2 |
| 403 | EOF |
| 404 | test_cmp expect actual |
| 405 | ' |
| 406 | |
| 407 | test_expect_success 'stash with all negative' ' |
| 408 | H=$(git rev-parse HEAD) && |
| 409 | git reset --hard $H && |
| 410 | test_when_finished "git reset --hard $H" && |
| 411 | for path in file sub/file sub/sub/file sub2/file |
| 412 | do |
| 413 | echo smudge >>"$path" || return 1 |
| 414 | done && |
| 415 | git -C sub stash push -m sample -- ":!sub/" && |
| 416 | git diff --name-only --no-renames HEAD >actual && |
| 417 | echo sub/sub/file >expect && |
| 418 | test_cmp expect actual && |
| 419 | git stash show --name-only >actual && |
| 420 | cat >expect <<-\EOF && |
| 421 | file |
| 422 | sub/file |
| 423 | sub2/file |
| 424 | EOF |
| 425 | test_cmp expect actual |
| 426 | ' |
| 427 | |
Nguyễn Thái Ngọc Duy | ef79b1f | 2013-12-06 14:30:48 +0700 | [diff] [blame] | 428 | test_done |