2936d52a9c7f860ea9fe3c195b18e9891fc5908f
   1#!/bin/sh
   2
   3test_description='prune $GIT_DIR/worktrees'
   4
   5. ./test-lib.sh
   6
   7test_expect_success 'prune --worktrees on normal repo' '
   8        git prune --worktrees &&
   9        test_must_fail git prune --worktrees abc
  10'
  11
  12test_expect_success 'prune files inside $GIT_DIR/worktrees' '
  13        mkdir .git/worktrees &&
  14        : >.git/worktrees/abc &&
  15        git prune --worktrees --verbose >actual &&
  16        cat >expect <<EOF &&
  17Removing worktrees/abc: not a valid directory
  18EOF
  19        test_i18ncmp expect actual &&
  20        ! test -f .git/worktrees/abc &&
  21        ! test -d .git/worktrees
  22'
  23
  24test_expect_success 'prune directories without gitdir' '
  25        mkdir -p .git/worktrees/def/abc &&
  26        : >.git/worktrees/def/def &&
  27        cat >expect <<EOF &&
  28Removing worktrees/def: gitdir file does not exist
  29EOF
  30        git prune --worktrees --verbose >actual &&
  31        test_i18ncmp expect actual &&
  32        ! test -d .git/worktrees/def &&
  33        ! test -d .git/worktrees
  34'
  35
  36test_expect_success SANITY 'prune directories with unreadable gitdir' '
  37        mkdir -p .git/worktrees/def/abc &&
  38        : >.git/worktrees/def/def &&
  39        : >.git/worktrees/def/gitdir &&
  40        chmod u-r .git/worktrees/def/gitdir &&
  41        git prune --worktrees --verbose >actual &&
  42        test_i18ngrep "Removing worktrees/def: unable to read gitdir file" actual &&
  43        ! test -d .git/worktrees/def &&
  44        ! test -d .git/worktrees
  45'
  46
  47test_expect_success 'prune directories with invalid gitdir' '
  48        mkdir -p .git/worktrees/def/abc &&
  49        : >.git/worktrees/def/def &&
  50        : >.git/worktrees/def/gitdir &&
  51        git prune --worktrees --verbose >actual &&
  52        test_i18ngrep "Removing worktrees/def: invalid gitdir file" actual &&
  53        ! test -d .git/worktrees/def &&
  54        ! test -d .git/worktrees
  55'
  56
  57test_expect_success 'prune directories with gitdir pointing to nowhere' '
  58        mkdir -p .git/worktrees/def/abc &&
  59        : >.git/worktrees/def/def &&
  60        echo "$(pwd)"/nowhere >.git/worktrees/def/gitdir &&
  61        git prune --worktrees --verbose >actual &&
  62        test_i18ngrep "Removing worktrees/def: gitdir file points to non-existent location" actual &&
  63        ! test -d .git/worktrees/def &&
  64        ! test -d .git/worktrees
  65'
  66
  67test_expect_success 'not prune locked checkout' '
  68        test_when_finished rm -r .git/worktrees
  69        mkdir -p .git/worktrees/ghi &&
  70        : >.git/worktrees/ghi/locked &&
  71        git prune --worktrees &&
  72        test -d .git/worktrees/ghi
  73'
  74
  75test_expect_success 'not prune recent checkouts' '
  76        test_when_finished rm -r .git/worktrees
  77        mkdir zz &&
  78        mkdir -p .git/worktrees/jlm &&
  79        echo "$(pwd)"/zz >.git/worktrees/jlm/gitdir &&
  80        git prune --worktrees --verbose --expire=2.days.ago &&
  81        test -d .git/worktrees/jlm
  82'
  83
  84test_done