t / t2027-worktree-list.shon commit Merge branch 'ab/doc-no-option-notation-fix' (9f43095)
   1#!/bin/sh
   2
   3test_description='test git worktree list'
   4
   5. ./test-lib.sh
   6
   7test_expect_success 'setup' '
   8        test_commit init
   9'
  10
  11test_expect_success 'rev-parse --git-common-dir on main worktree' '
  12        git rev-parse --git-common-dir >actual &&
  13        echo .git >expected &&
  14        test_cmp expected actual &&
  15        mkdir sub &&
  16        git -C sub rev-parse --git-common-dir >actual2 &&
  17        echo ../.git >expected2 &&
  18        test_cmp expected2 actual2
  19'
  20
  21test_expect_success 'rev-parse --git-path objects linked worktree' '
  22        echo "$(git rev-parse --show-toplevel)/.git/objects" >expect &&
  23        test_when_finished "rm -rf linked-tree && git worktree prune" &&
  24        git worktree add --detach linked-tree master &&
  25        git -C linked-tree rev-parse --git-path objects >actual &&
  26        test_cmp expect actual
  27'
  28
  29test_expect_success '"list" all worktrees from main' '
  30        echo "$(git rev-parse --show-toplevel) $(git rev-parse --short HEAD) [$(git symbolic-ref --short HEAD)]" >expect &&
  31        test_when_finished "rm -rf here && git worktree prune" &&
  32        git worktree add --detach here master &&
  33        echo "$(git -C here rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD)" >>expect &&
  34        git worktree list | sed "s/  */ /g" >actual &&
  35        test_cmp expect actual
  36'
  37
  38test_expect_success '"list" all worktrees from linked' '
  39        echo "$(git rev-parse --show-toplevel) $(git rev-parse --short HEAD) [$(git symbolic-ref --short HEAD)]" >expect &&
  40        test_when_finished "rm -rf here && git worktree prune" &&
  41        git worktree add --detach here master &&
  42        echo "$(git -C here rev-parse --show-toplevel) $(git rev-parse --short HEAD) (detached HEAD)" >>expect &&
  43        git -C here worktree list | sed "s/  */ /g" >actual &&
  44        test_cmp expect actual
  45'
  46
  47test_expect_success '"list" all worktrees --porcelain' '
  48        echo "worktree $(git rev-parse --show-toplevel)" >expect &&
  49        echo "HEAD $(git rev-parse HEAD)" >>expect &&
  50        echo "branch $(git symbolic-ref HEAD)" >>expect &&
  51        echo >>expect &&
  52        test_when_finished "rm -rf here && git worktree prune" &&
  53        git worktree add --detach here master &&
  54        echo "worktree $(git -C here rev-parse --show-toplevel)" >>expect &&
  55        echo "HEAD $(git rev-parse HEAD)" >>expect &&
  56        echo "detached" >>expect &&
  57        echo >>expect &&
  58        git worktree list --porcelain >actual &&
  59        test_cmp expect actual
  60'
  61
  62test_expect_success 'bare repo setup' '
  63        git init --bare bare1 &&
  64        echo "data" >file1 &&
  65        git add file1 &&
  66        git commit -m"File1: add data" &&
  67        git push bare1 master &&
  68        git reset --hard HEAD^
  69'
  70
  71test_expect_success '"list" all worktrees from bare main' '
  72        test_when_finished "rm -rf there && git -C bare1 worktree prune" &&
  73        git -C bare1 worktree add --detach ../there master &&
  74        echo "$(pwd)/bare1 (bare)" >expect &&
  75        echo "$(git -C there rev-parse --show-toplevel) $(git -C there rev-parse --short HEAD) (detached HEAD)" >>expect &&
  76        git -C bare1 worktree list | sed "s/  */ /g" >actual &&
  77        test_cmp expect actual
  78'
  79
  80test_expect_success '"list" all worktrees --porcelain from bare main' '
  81        test_when_finished "rm -rf there && git -C bare1 worktree prune" &&
  82        git -C bare1 worktree add --detach ../there master &&
  83        echo "worktree $(pwd)/bare1" >expect &&
  84        echo "bare" >>expect &&
  85        echo >>expect &&
  86        echo "worktree $(git -C there rev-parse --show-toplevel)" >>expect &&
  87        echo "HEAD $(git -C there rev-parse HEAD)" >>expect &&
  88        echo "detached" >>expect &&
  89        echo >>expect &&
  90        git -C bare1 worktree list --porcelain >actual &&
  91        test_cmp expect actual
  92'
  93
  94test_expect_success '"list" all worktrees from linked with a bare main' '
  95        test_when_finished "rm -rf there && git -C bare1 worktree prune" &&
  96        git -C bare1 worktree add --detach ../there master &&
  97        echo "$(pwd)/bare1 (bare)" >expect &&
  98        echo "$(git -C there rev-parse --show-toplevel) $(git -C there rev-parse --short HEAD) (detached HEAD)" >>expect &&
  99        git -C there worktree list | sed "s/  */ /g" >actual &&
 100        test_cmp expect actual
 101'
 102
 103test_expect_success 'bare repo cleanup' '
 104        rm -rf bare1
 105'
 106
 107test_expect_success 'broken main worktree still at the top' '
 108        git init broken-main &&
 109        (
 110                cd broken-main &&
 111                test_commit new &&
 112                git worktree add linked &&
 113                cat >expected <<-EOF &&
 114                worktree $(pwd)
 115                HEAD $_z40
 116
 117                EOF
 118                cd linked &&
 119                echo "worktree $(pwd)" >expected &&
 120                echo "ref: .broken" >../.git/HEAD &&
 121                git worktree list --porcelain | head -n 3 >actual &&
 122                test_cmp ../expected actual &&
 123                git worktree list | head -n 1 >actual.2 &&
 124                grep -F "(error)" actual.2
 125        )
 126'
 127
 128test_expect_success 'linked worktrees are sorted' '
 129        mkdir sorted &&
 130        git init sorted/main &&
 131        (
 132                cd sorted/main &&
 133                test_tick &&
 134                test_commit new &&
 135                git worktree add ../first &&
 136                git worktree add ../second &&
 137                git worktree list --porcelain | grep ^worktree >actual
 138        ) &&
 139        cat >expected <<-EOF &&
 140        worktree $(pwd)/sorted/main
 141        worktree $(pwd)/sorted/first
 142        worktree $(pwd)/sorted/second
 143        EOF
 144        test_cmp expected sorted/main/actual
 145'
 146
 147test_done