t / t7300-clean.shon commit fsck: detect null sha1 in tree entries (c479d14)
   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 -X' '
 302
 303        mkdir -p build docs &&
 304        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
 305        git clean -X &&
 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 -f docs/manual.txt &&
 313        test ! -f obj.o &&
 314        test -f build/lib.so
 315
 316'
 317
 318test_expect_success 'git clean -d -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 -d -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 ! -d build
 332
 333'
 334
 335test_expect_success 'clean.requireForce defaults to true' '
 336
 337        git config --unset clean.requireForce &&
 338        test_must_fail git clean
 339
 340'
 341
 342test_expect_success 'clean.requireForce' '
 343
 344        git config clean.requireForce true &&
 345        test_must_fail git clean
 346
 347'
 348
 349test_expect_success 'clean.requireForce and -n' '
 350
 351        mkdir -p build docs &&
 352        touch a.out src/part3.c docs/manual.txt obj.o build/lib.so &&
 353        git clean -n &&
 354        test -f Makefile &&
 355        test -f README &&
 356        test -f src/part1.c &&
 357        test -f src/part2.c &&
 358        test -f a.out &&
 359        test -f src/part3.c &&
 360        test -f docs/manual.txt &&
 361        test -f obj.o &&
 362        test -f build/lib.so
 363
 364'
 365
 366test_expect_success 'clean.requireForce and -f' '
 367
 368        git clean -f &&
 369        test -f README &&
 370        test -f src/part1.c &&
 371        test -f src/part2.c &&
 372        test ! -f a.out &&
 373        test ! -f src/part3.c &&
 374        test -f docs/manual.txt &&
 375        test -f obj.o &&
 376        test -f build/lib.so
 377
 378'
 379
 380test_expect_success C_LOCALE_OUTPUT 'core.excludesfile' '
 381
 382        echo excludes >excludes &&
 383        echo included >included &&
 384        git config core.excludesfile excludes &&
 385        output=$(git clean -n excludes included 2>&1) &&
 386        expr "$output" : ".*included" >/dev/null &&
 387        ! expr "$output" : ".*excludes" >/dev/null
 388
 389'
 390
 391test_expect_success SANITY 'removal failure' '
 392
 393        mkdir foo &&
 394        touch foo/bar &&
 395        (exec <foo/bar &&
 396         chmod 0 foo &&
 397         test_must_fail git clean -f -d &&
 398         chmod 755 foo)
 399'
 400
 401test_expect_success 'nested git work tree' '
 402        rm -fr foo bar &&
 403        mkdir foo bar &&
 404        (
 405                cd foo &&
 406                git init &&
 407                >hello.world
 408                git add . &&
 409                git commit -a -m nested
 410        ) &&
 411        (
 412                cd bar &&
 413                >goodbye.people
 414        ) &&
 415        git clean -f -d &&
 416        test -f foo/.git/index &&
 417        test -f foo/hello.world &&
 418        ! test -d bar
 419'
 420
 421test_expect_success 'force removal of nested git work tree' '
 422        rm -fr foo bar &&
 423        mkdir foo bar &&
 424        (
 425                cd foo &&
 426                git init &&
 427                >hello.world
 428                git add . &&
 429                git commit -a -m nested
 430        ) &&
 431        (
 432                cd bar &&
 433                >goodbye.people
 434        ) &&
 435        git clean -f -f -d &&
 436        ! test -d foo &&
 437        ! test -d bar
 438'
 439
 440test_expect_success 'git clean -e' '
 441        rm -fr repo &&
 442        mkdir repo &&
 443        (
 444                cd repo &&
 445                git init &&
 446                touch known 1 2 3 &&
 447                git add known &&
 448                git clean -f -e 1 -e 2 &&
 449                test -e 1 &&
 450                test -e 2 &&
 451                ! (test -e 3) &&
 452                test -e known
 453        )
 454'
 455
 456test_expect_success SANITY 'git clean -d with an unreadable empty directory' '
 457        mkdir foo &&
 458        chmod a= foo &&
 459        git clean -dfx foo &&
 460        ! test -d foo
 461'
 462
 463test_done