Git fork
at reftables-rust 428 lines 9.4 kB view raw
1#!/bin/sh 2 3test_description='test case exclude pathspec' 4 5. ./test-lib.sh 6 7test_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 10 mkdir -p $(dirname $p) 11 fi && 12 : >$p && 13 git add $p && 14 git commit -m $p || return 1 15 done && 16 git log --oneline --format=%s >actual && 17 cat <<EOF >expect && 18sub2/file 19sub/sub/sub/file 20sub/file2 21sub/sub/file 22sub/file 23file 24EOF 25 test_cmp expect actual 26' 27 28test_expect_success 'exclude only pathspec uses default implicit pathspec' ' 29 git log --oneline --format=%s -- . ":(exclude)sub" >expect && 30 git log --oneline --format=%s -- ":(exclude)sub" >actual && 31 test_cmp expect actual 32' 33 34test_expect_success 't_e_i() exclude sub' ' 35 git log --oneline --format=%s -- . ":(exclude)sub" >actual && 36 cat <<EOF >expect && 37sub2/file 38file 39EOF 40 test_cmp expect actual 41' 42 43test_expect_success 't_e_i() exclude sub/sub/file' ' 44 git log --oneline --format=%s -- . ":(exclude)sub/sub/file" >actual && 45 cat <<EOF >expect && 46sub2/file 47sub/sub/sub/file 48sub/file2 49sub/file 50file 51EOF 52 test_cmp expect actual 53' 54 55test_expect_success 't_e_i() exclude sub using mnemonic' ' 56 git log --oneline --format=%s -- . ":!sub" >actual && 57 cat <<EOF >expect && 58sub2/file 59file 60EOF 61 test_cmp expect actual 62' 63 64test_expect_success 't_e_i() exclude :(icase)SUB' ' 65 git log --oneline --format=%s -- . ":(exclude,icase)SUB" >actual && 66 cat <<EOF >expect && 67sub2/file 68file 69EOF 70 test_cmp expect actual 71' 72 73test_expect_success 't_e_i() exclude sub2 from sub' ' 74 ( 75 cd sub && 76 git log --oneline --format=%s -- :/ ":/!sub2" >actual && 77 cat <<EOF >expect && 78sub/sub/sub/file 79sub/file2 80sub/sub/file 81sub/file 82file 83EOF 84 test_cmp expect actual 85 ) 86' 87 88test_expect_success 't_e_i() exclude sub/*file' ' 89 git log --oneline --format=%s -- . ":(exclude)sub/*file" >actual && 90 cat <<EOF >expect && 91sub2/file 92sub/file2 93file 94EOF 95 test_cmp expect actual 96' 97 98test_expect_success 't_e_i() exclude :(glob)sub/*/file' ' 99 git log --oneline --format=%s -- . ":(exclude,glob)sub/*/file" >actual && 100 cat <<EOF >expect && 101sub2/file 102sub/sub/sub/file 103sub/file2 104sub/file 105file 106EOF 107 test_cmp expect actual 108' 109 110test_expect_success 'm_p_d() exclude sub' ' 111 git ls-files -- . ":(exclude)sub" >actual && 112 cat <<EOF >expect && 113file 114sub2/file 115EOF 116 test_cmp expect actual 117' 118 119test_expect_success 'm_p_d() exclude sub/sub/file' ' 120 git ls-files -- . ":(exclude)sub/sub/file" >actual && 121 cat <<EOF >expect && 122file 123sub/file 124sub/file2 125sub/sub/sub/file 126sub2/file 127EOF 128 test_cmp expect actual 129' 130 131test_expect_success 'm_p_d() exclude sub using mnemonic' ' 132 git ls-files -- . ":!sub" >actual && 133 cat <<EOF >expect && 134file 135sub2/file 136EOF 137 test_cmp expect actual 138' 139 140test_expect_success 'm_p_d() exclude :(icase)SUB' ' 141 git ls-files -- . ":(exclude,icase)SUB" >actual && 142 cat <<EOF >expect && 143file 144sub2/file 145EOF 146 test_cmp expect actual 147' 148 149test_expect_success 'm_p_d() exclude sub2 from sub' ' 150 ( 151 cd sub && 152 git ls-files -- :/ ":/!sub2" >actual && 153 cat <<EOF >expect && 154../file 155file 156file2 157sub/file 158sub/sub/file 159EOF 160 test_cmp expect actual 161 ) 162' 163 164test_expect_success 'm_p_d() exclude sub/*file' ' 165 git ls-files -- . ":(exclude)sub/*file" >actual && 166 cat <<EOF >expect && 167file 168sub/file2 169sub2/file 170EOF 171 test_cmp expect actual 172' 173 174test_expect_success 'm_p_d() exclude :(glob)sub/*/file' ' 175 git ls-files -- . ":(exclude,glob)sub/*/file" >actual && 176 cat <<EOF >expect && 177file 178sub/file 179sub/file2 180sub/sub/sub/file 181sub2/file 182EOF 183 test_cmp expect actual 184' 185 186test_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 197test_expect_success 't_e_i() exclude case #8' ' 198 test_when_finished "rm -fr case8" && 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 215test_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 230test_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 239test_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 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 262test_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 274test_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 296test_expect_success 'add -p with all negative' ' 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 318test_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 334test_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 355test_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 370test_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 385test_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 395test_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 407test_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 428test_done