t / t7300-clean.shon commit diff: do not quit early on stat-dirty files (f34b205)
   1#!/bin/sh
   2#
   3# Copyright (c) 2007 Michael Spang
   4#
   5
   6test_description='git clean basic tests'
   7
   8. ./test-lib.sh
   9
  10git config clean.requireForce no
  11
  12test_expect_success 'setup' '
  13
  14        mkdir -p src &&
  15        touch src/part1.c Makefile &&
  16        echo build >.gitignore &&
  17        echo \*.o >>.gitignore &&
  18        git add . &&
  19        git commit -m setup &&
  20        touch src/part2.c README &&
  21        git add .
  22
  23'
  24
  25test_expect_success 'git clean with skip-worktree .gitignore' '
  26        git update-index --skip-worktree .gitignore &&
  27        rm .gitignore &&
  28        mkdir -p build docs &&
  29        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
  30        git clean &&
  31        test -f Makefile &&
  32        test -f README &&
  33        test -f src/part1.c &&
  34        test -f src/part2.c &&
  35        test ! -f a.out &&
  36        test ! -f src/part3.c &&
  37        test -f docs/manual.txt &&
  38        test -f obj.o &&
  39        test -f build/lib.so &&
  40        git update-index --no-skip-worktree .gitignore &&
  41        git checkout .gitignore
  42'
  43
  44test_expect_success 'git clean' '
  45
  46        mkdir -p build docs &&
  47        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
  48        git clean &&
  49        test -f Makefile &&
  50        test -f README &&
  51        test -f src/part1.c &&
  52        test -f src/part2.c &&
  53        test ! -f a.out &&
  54        test ! -f src/part3.c &&
  55        test -f docs/manual.txt &&
  56        test -f obj.o &&
  57        test -f build/lib.so
  58
  59'
  60
  61test_expect_success 'git clean src/' '
  62
  63        mkdir -p build docs &&
  64        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
  65        git clean src/ &&
  66        test -f Makefile &&
  67        test -f README &&
  68        test -f src/part1.c &&
  69        test -f src/part2.c &&
  70        test -f a.out &&
  71        test ! -f src/part3.c &&
  72        test -f docs/manual.txt &&
  73        test -f obj.o &&
  74        test -f build/lib.so
  75
  76'
  77
  78test_expect_success 'git clean src/ src/' '
  79
  80        mkdir -p build docs &&
  81        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
  82        git clean src/ src/ &&
  83        test -f Makefile &&
  84        test -f README &&
  85        test -f src/part1.c &&
  86        test -f src/part2.c &&
  87        test -f a.out &&
  88        test ! -f src/part3.c &&
  89        test -f docs/manual.txt &&
  90        test -f obj.o &&
  91        test -f build/lib.so
  92
  93'
  94
  95test_expect_success 'git clean with prefix' '
  96
  97        mkdir -p build docs src/test &&
  98        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so src/test/1.c &&
  99        (cd src/ && git clean) &&
 100        test -f Makefile &&
 101        test -f README &&
 102        test -f src/part1.c &&
 103        test -f src/part2.c &&
 104        test -f a.out &&
 105        test ! -f src/part3.c &&
 106        test -f src/test/1.c &&
 107        test -f docs/manual.txt &&
 108        test -f obj.o &&
 109        test -f build/lib.so
 110
 111'
 112
 113test_expect_success C_LOCALE_OUTPUT 'git clean with relative prefix' '
 114
 115        mkdir -p build docs &&
 116        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
 117        would_clean=$(
 118                cd docs &&
 119                git clean -n ../src |
 120                sed -n -e "s|^Would remove ||p"
 121        ) &&
 122        test "$would_clean" = ../src/part3.c || {
 123                echo "OOps <$would_clean>"
 124                false
 125        }
 126'
 127
 128test_expect_success C_LOCALE_OUTPUT 'git clean with absolute path' '
 129
 130        mkdir -p build docs &&
 131        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
 132        would_clean=$(
 133                cd docs &&
 134                git clean -n "$(pwd)/../src" |
 135                sed -n -e "s|^Would remove ||p"
 136        ) &&
 137        test "$would_clean" = ../src/part3.c || {
 138                echo "OOps <$would_clean>"
 139                false
 140        }
 141'
 142
 143test_expect_success 'git clean with out of work tree relative path' '
 144
 145        mkdir -p build docs &&
 146        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
 147        (
 148                cd docs &&
 149                test_must_fail git clean -n ../..
 150        )
 151'
 152
 153test_expect_success 'git clean with out of work tree absolute path' '
 154
 155        mkdir -p build docs &&
 156        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
 157        dd=$(cd .. && pwd) &&
 158        (
 159                cd docs &&
 160                test_must_fail git clean -n $dd
 161        )
 162'
 163
 164test_expect_success 'git clean -d with prefix and path' '
 165
 166        mkdir -p build docs src/feature &&
 167        touch a.out src/part3.c src/feature/file.c docs/manual.txt obj.o build/lib.so &&
 168        (cd src/ && git clean -d feature/) &&
 169        test -f Makefile &&
 170        test -f README &&
 171        test -f src/part1.c &&
 172        test -f src/part2.c &&
 173        test -f a.out &&
 174        test -f src/part3.c &&
 175        test ! -f src/feature/file.c &&
 176        test -f docs/manual.txt &&
 177        test -f obj.o &&
 178        test -f build/lib.so
 179
 180'
 181
 182test_expect_success SYMLINKS 'git clean symbolic link' '
 183
 184        mkdir -p build docs &&
 185        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
 186        ln -s docs/manual.txt src/part4.c &&
 187        git clean &&
 188        test -f Makefile &&
 189        test -f README &&
 190        test -f src/part1.c &&
 191        test -f src/part2.c &&
 192        test ! -f a.out &&
 193        test ! -f src/part3.c &&
 194        test ! -f src/part4.c &&
 195        test -f docs/manual.txt &&
 196        test -f obj.o &&
 197        test -f build/lib.so
 198
 199'
 200
 201test_expect_success 'git clean with wildcard' '
 202
 203        touch a.clean b.clean other.c &&
 204        git clean "*.clean" &&
 205        test -f Makefile &&
 206        test -f README &&
 207        test -f src/part1.c &&
 208        test -f src/part2.c &&
 209        test ! -f a.clean &&
 210        test ! -f b.clean &&
 211        test -f other.c
 212
 213'
 214
 215test_expect_success 'git clean -n' '
 216
 217        mkdir -p build docs &&
 218        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
 219        git clean -n &&
 220        test -f Makefile &&
 221        test -f README &&
 222        test -f src/part1.c &&
 223        test -f src/part2.c &&
 224        test -f a.out &&
 225        test -f src/part3.c &&
 226        test -f docs/manual.txt &&
 227        test -f obj.o &&
 228        test -f build/lib.so
 229
 230'
 231
 232test_expect_success 'git clean -d' '
 233
 234        mkdir -p build docs &&
 235        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
 236        git clean -d &&
 237        test -f Makefile &&
 238        test -f README &&
 239        test -f src/part1.c &&
 240        test -f src/part2.c &&
 241        test ! -f a.out &&
 242        test ! -f src/part3.c &&
 243        test ! -d docs &&
 244        test -f obj.o &&
 245        test -f build/lib.so
 246
 247'
 248
 249test_expect_success 'git clean -d src/ examples/' '
 250
 251        mkdir -p build docs examples &&
 252        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so examples/1.c &&
 253        git clean -d src/ examples/ &&
 254        test -f Makefile &&
 255        test -f README &&
 256        test -f src/part1.c &&
 257        test -f src/part2.c &&
 258        test -f a.out &&
 259        test ! -f src/part3.c &&
 260        test ! -f examples/1.c &&
 261        test -f docs/manual.txt &&
 262        test -f obj.o &&
 263        test -f build/lib.so
 264
 265'
 266
 267test_expect_success 'git clean -x' '
 268
 269        mkdir -p build docs &&
 270        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
 271        git clean -x &&
 272        test -f Makefile &&
 273        test -f README &&
 274        test -f src/part1.c &&
 275        test -f src/part2.c &&
 276        test ! -f a.out &&
 277        test ! -f src/part3.c &&
 278        test -f docs/manual.txt &&
 279        test ! -f obj.o &&
 280        test -f build/lib.so
 281
 282'
 283
 284test_expect_success 'git clean -d -x' '
 285
 286        mkdir -p build docs &&
 287        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
 288        git clean -d -x &&
 289        test -f Makefile &&
 290        test -f README &&
 291        test -f src/part1.c &&
 292        test -f src/part2.c &&
 293        test ! -f a.out &&
 294        test ! -f src/part3.c &&
 295        test ! -d docs &&
 296        test ! -f obj.o &&
 297        test ! -d build
 298
 299'
 300
 301test_expect_success 'git clean -d -x with ignored tracked directory' '
 302
 303        mkdir -p build docs &&
 304        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
 305        git clean -d -x -e src &&
 306        test -f Makefile &&
 307        test -f README &&
 308        test -f src/part1.c &&
 309        test -f src/part2.c &&
 310        test ! -f a.out &&
 311        test -f src/part3.c &&
 312        test ! -d docs &&
 313        test ! -f obj.o &&
 314        test ! -d build
 315
 316'
 317
 318test_expect_success 'git clean -X' '
 319
 320        mkdir -p build docs &&
 321        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
 322        git clean -X &&
 323        test -f Makefile &&
 324        test -f README &&
 325        test -f src/part1.c &&
 326        test -f src/part2.c &&
 327        test -f a.out &&
 328        test -f src/part3.c &&
 329        test -f docs/manual.txt &&
 330        test ! -f obj.o &&
 331        test -f build/lib.so
 332
 333'
 334
 335test_expect_success 'git clean -d -X' '
 336
 337        mkdir -p build docs &&
 338        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
 339        git clean -d -X &&
 340        test -f Makefile &&
 341        test -f README &&
 342        test -f src/part1.c &&
 343        test -f src/part2.c &&
 344        test -f a.out &&
 345        test -f src/part3.c &&
 346        test -f docs/manual.txt &&
 347        test ! -f obj.o &&
 348        test ! -d build
 349
 350'
 351
 352test_expect_success 'git clean -d -X with ignored tracked directory' '
 353
 354        mkdir -p build docs &&
 355        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
 356        git clean -d -X -e src &&
 357        test -f Makefile &&
 358        test -f README &&
 359        test -f src/part1.c &&
 360        test -f src/part2.c &&
 361        test -f a.out &&
 362        test ! -f src/part3.c &&
 363        test -f docs/manual.txt &&
 364        test ! -f obj.o &&
 365        test ! -d build
 366
 367'
 368
 369test_expect_success 'clean.requireForce defaults to true' '
 370
 371        git config --unset clean.requireForce &&
 372        test_must_fail git clean
 373
 374'
 375
 376test_expect_success 'clean.requireForce' '
 377
 378        git config clean.requireForce true &&
 379        test_must_fail git clean
 380
 381'
 382
 383test_expect_success 'clean.requireForce and -n' '
 384
 385        mkdir -p build docs &&
 386        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
 387        git clean -n &&
 388        test -f Makefile &&
 389        test -f README &&
 390        test -f src/part1.c &&
 391        test -f src/part2.c &&
 392        test -f a.out &&
 393        test -f src/part3.c &&
 394        test -f docs/manual.txt &&
 395        test -f obj.o &&
 396        test -f build/lib.so
 397
 398'
 399
 400test_expect_success 'clean.requireForce and -f' '
 401
 402        git clean -f &&
 403        test -f README &&
 404        test -f src/part1.c &&
 405        test -f src/part2.c &&
 406        test ! -f a.out &&
 407        test ! -f src/part3.c &&
 408        test -f docs/manual.txt &&
 409        test -f obj.o &&
 410        test -f build/lib.so
 411
 412'
 413
 414test_expect_success C_LOCALE_OUTPUT 'core.excludesfile' '
 415
 416        echo excludes >excludes &&
 417        echo included >included &&
 418        git config core.excludesfile excludes &&
 419        output=$(git clean -n excludes included 2>&1) &&
 420        expr "$output" : ".*included" >/dev/null &&
 421        ! expr "$output" : ".*excludes" >/dev/null
 422
 423'
 424
 425test_expect_success SANITY 'removal failure' '
 426
 427        mkdir foo &&
 428        touch foo/bar &&
 429        (exec <foo/bar &&
 430         chmod 0 foo &&
 431         test_must_fail git clean -f -d &&
 432         chmod 755 foo)
 433'
 434
 435test_expect_success 'nested git work tree' '
 436        rm -fr foo bar baz &&
 437        mkdir -p foo bar baz/boo &&
 438        (
 439                cd foo &&
 440                git init &&
 441                >hello.world
 442                git add . &&
 443                git commit -a -m nested
 444        ) &&
 445        (
 446                cd bar &&
 447                >goodbye.people
 448        ) &&
 449        (
 450                cd baz/boo &&
 451                git init &&
 452                >deeper.world
 453                git add . &&
 454                git commit -a -m deeply.nested
 455        ) &&
 456        git clean -f -d &&
 457        test -f foo/.git/index &&
 458        test -f foo/hello.world &&
 459        test -f baz/boo/.git/index &&
 460        test -f baz/boo/deeper.world &&
 461        ! test -d bar
 462'
 463
 464test_expect_success 'force removal of nested git work tree' '
 465        rm -fr foo bar baz &&
 466        mkdir -p foo bar baz/boo &&
 467        (
 468                cd foo &&
 469                git init &&
 470                >hello.world
 471                git add . &&
 472                git commit -a -m nested
 473        ) &&
 474        (
 475                cd bar &&
 476                >goodbye.people
 477        ) &&
 478        (
 479                cd baz/boo &&
 480                git init &&
 481                >deeper.world
 482                git add . &&
 483                git commit -a -m deeply.nested
 484        ) &&
 485        git clean -f -f -d &&
 486        ! test -d foo &&
 487        ! test -d bar &&
 488        ! test -d baz
 489'
 490
 491test_expect_success 'git clean -e' '
 492        rm -fr repo &&
 493        mkdir repo &&
 494        (
 495                cd repo &&
 496                git init &&
 497                touch known 1 2 3 &&
 498                git add known &&
 499                git clean -f -e 1 -e 2 &&
 500                test -e 1 &&
 501                test -e 2 &&
 502                ! (test -e 3) &&
 503                test -e known
 504        )
 505'
 506
 507test_expect_success SANITY 'git clean -d with an unreadable empty directory' '
 508        mkdir foo &&
 509        chmod a= foo &&
 510        git clean -dfx foo &&
 511        ! test -d foo
 512'
 513
 514test_done