t / t2025-worktree-add.shon commit Merge branch 'sd/t3200-branch-m-test' (1565b18)
   1#!/bin/sh
   2
   3test_description='test git worktree add'
   4
   5. ./test-lib.sh
   6
   7. "$TEST_DIRECTORY"/lib-rebase.sh
   8
   9test_expect_success 'setup' '
  10        test_commit init
  11'
  12
  13test_expect_success '"add" an existing worktree' '
  14        mkdir -p existing/subtree &&
  15        test_must_fail git worktree add --detach existing master
  16'
  17
  18test_expect_success '"add" an existing empty worktree' '
  19        mkdir existing_empty &&
  20        git worktree add --detach existing_empty master
  21'
  22
  23test_expect_success '"add" using shorthand - fails when no previous branch' '
  24        test_must_fail git worktree add existing_short -
  25'
  26
  27test_expect_success '"add" using - shorthand' '
  28        git checkout -b newbranch &&
  29        echo hello >myworld &&
  30        git add myworld &&
  31        git commit -m myworld &&
  32        git checkout master &&
  33        git worktree add short-hand - &&
  34        echo refs/heads/newbranch >expect &&
  35        git -C short-hand rev-parse --symbolic-full-name HEAD >actual &&
  36        test_cmp expect actual
  37'
  38
  39test_expect_success '"add" refuses to checkout locked branch' '
  40        test_must_fail git worktree add zere master &&
  41        ! test -d zere &&
  42        ! test -d .git/worktrees/zere
  43'
  44
  45test_expect_success 'checking out paths not complaining about linked checkouts' '
  46        (
  47        cd existing_empty &&
  48        echo dirty >>init.t &&
  49        git checkout master -- init.t
  50        )
  51'
  52
  53test_expect_success '"add" worktree' '
  54        git rev-parse HEAD >expect &&
  55        git worktree add --detach here master &&
  56        (
  57                cd here &&
  58                test_cmp ../init.t init.t &&
  59                test_must_fail git symbolic-ref HEAD &&
  60                git rev-parse HEAD >actual &&
  61                test_cmp ../expect actual &&
  62                git fsck
  63        )
  64'
  65
  66test_expect_success '"add" worktree with lock' '
  67        git rev-parse HEAD >expect &&
  68        git worktree add --detach --lock here-with-lock master &&
  69        test -f .git/worktrees/here-with-lock/locked
  70'
  71
  72test_expect_success '"add" worktree from a subdir' '
  73        (
  74                mkdir sub &&
  75                cd sub &&
  76                git worktree add --detach here master &&
  77                cd here &&
  78                test_cmp ../../init.t init.t
  79        )
  80'
  81
  82test_expect_success '"add" from a linked checkout' '
  83        (
  84                cd here &&
  85                git worktree add --detach nested-here master &&
  86                cd nested-here &&
  87                git fsck
  88        )
  89'
  90
  91test_expect_success '"add" worktree creating new branch' '
  92        git worktree add -b newmaster there master &&
  93        (
  94                cd there &&
  95                test_cmp ../init.t init.t &&
  96                git symbolic-ref HEAD >actual &&
  97                echo refs/heads/newmaster >expect &&
  98                test_cmp expect actual &&
  99                git fsck
 100        )
 101'
 102
 103test_expect_success 'die the same branch is already checked out' '
 104        (
 105                cd here &&
 106                test_must_fail git checkout newmaster
 107        )
 108'
 109
 110test_expect_success SYMLINKS 'die the same branch is already checked out (symlink)' '
 111        head=$(git -C there rev-parse --git-path HEAD) &&
 112        ref=$(git -C there symbolic-ref HEAD) &&
 113        rm "$head" &&
 114        ln -s "$ref" "$head" &&
 115        test_must_fail git -C here checkout newmaster
 116'
 117
 118test_expect_success 'not die the same branch is already checked out' '
 119        (
 120                cd here &&
 121                git worktree add --force anothernewmaster newmaster
 122        )
 123'
 124
 125test_expect_success 'not die on re-checking out current branch' '
 126        (
 127                cd there &&
 128                git checkout newmaster
 129        )
 130'
 131
 132test_expect_success '"add" from a bare repo' '
 133        (
 134                git clone --bare . bare &&
 135                cd bare &&
 136                git worktree add -b bare-master ../there2 master
 137        )
 138'
 139
 140test_expect_success 'checkout from a bare repo without "add"' '
 141        (
 142                cd bare &&
 143                test_must_fail git checkout master
 144        )
 145'
 146
 147test_expect_success '"add" default branch of a bare repo' '
 148        (
 149                git clone --bare . bare2 &&
 150                cd bare2 &&
 151                git worktree add ../there3 master
 152        )
 153'
 154
 155test_expect_success 'checkout with grafts' '
 156        test_when_finished rm .git/info/grafts &&
 157        test_commit abc &&
 158        SHA1=$(git rev-parse HEAD) &&
 159        test_commit def &&
 160        test_commit xyz &&
 161        echo "$(git rev-parse HEAD) $SHA1" >.git/info/grafts &&
 162        cat >expected <<-\EOF &&
 163        xyz
 164        abc
 165        EOF
 166        git log --format=%s -2 >actual &&
 167        test_cmp expected actual &&
 168        git worktree add --detach grafted master &&
 169        git --git-dir=grafted/.git log --format=%s -2 >actual &&
 170        test_cmp expected actual
 171'
 172
 173test_expect_success '"add" from relative HEAD' '
 174        test_commit a &&
 175        test_commit b &&
 176        test_commit c &&
 177        git rev-parse HEAD~1 >expected &&
 178        git worktree add relhead HEAD~1 &&
 179        git -C relhead rev-parse HEAD >actual &&
 180        test_cmp expected actual
 181'
 182
 183test_expect_success '"add -b" with <branch> omitted' '
 184        git worktree add -b burble flornk &&
 185        test_cmp_rev HEAD burble
 186'
 187
 188test_expect_success '"add --detach" with <branch> omitted' '
 189        git worktree add --detach fishhook &&
 190        git rev-parse HEAD >expected &&
 191        git -C fishhook rev-parse HEAD >actual &&
 192        test_cmp expected actual &&
 193        test_must_fail git -C fishhook symbolic-ref HEAD
 194'
 195
 196test_expect_success '"add" with <branch> omitted' '
 197        git worktree add wiffle/bat &&
 198        test_cmp_rev HEAD bat
 199'
 200
 201test_expect_success '"add" auto-vivify does not clobber existing branch' '
 202        test_commit c1 &&
 203        test_commit c2 &&
 204        git branch precious HEAD~1 &&
 205        test_must_fail git worktree add precious &&
 206        test_cmp_rev HEAD~1 precious &&
 207        test_path_is_missing precious
 208'
 209
 210test_expect_success '"add" no auto-vivify with --detach and <branch> omitted' '
 211        git worktree add --detach mish/mash &&
 212        test_must_fail git rev-parse mash -- &&
 213        test_must_fail git -C mish/mash symbolic-ref HEAD
 214'
 215
 216test_expect_success '"add" -b/-B mutually exclusive' '
 217        test_must_fail git worktree add -b poodle -B poodle bamboo master
 218'
 219
 220test_expect_success '"add" -b/--detach mutually exclusive' '
 221        test_must_fail git worktree add -b poodle --detach bamboo master
 222'
 223
 224test_expect_success '"add" -B/--detach mutually exclusive' '
 225        test_must_fail git worktree add -B poodle --detach bamboo master
 226'
 227
 228test_expect_success '"add -B" fails if the branch is checked out' '
 229        git rev-parse newmaster >before &&
 230        test_must_fail git worktree add -B newmaster bamboo master &&
 231        git rev-parse newmaster >after &&
 232        test_cmp before after
 233'
 234
 235test_expect_success 'add -B' '
 236        git worktree add -B poodle bamboo2 master^ &&
 237        git -C bamboo2 symbolic-ref HEAD >actual &&
 238        echo refs/heads/poodle >expected &&
 239        test_cmp expected actual &&
 240        test_cmp_rev master^ poodle
 241'
 242
 243test_expect_success 'local clone from linked checkout' '
 244        git clone --local here here-clone &&
 245        ( cd here-clone && git fsck )
 246'
 247
 248test_expect_success '"add" worktree with --no-checkout' '
 249        git worktree add --no-checkout -b swamp swamp &&
 250        ! test -e swamp/init.t &&
 251        git -C swamp reset --hard &&
 252        test_cmp init.t swamp/init.t
 253'
 254
 255test_expect_success '"add" worktree with --checkout' '
 256        git worktree add --checkout -b swmap2 swamp2 &&
 257        test_cmp init.t swamp2/init.t
 258'
 259
 260test_expect_success 'put a worktree under rebase' '
 261        git worktree add under-rebase &&
 262        (
 263                cd under-rebase &&
 264                set_fake_editor &&
 265                FAKE_LINES="edit 1" git rebase -i HEAD^ &&
 266                git worktree list | grep "under-rebase.*detached HEAD"
 267        )
 268'
 269
 270test_expect_success 'add a worktree, checking out a rebased branch' '
 271        test_must_fail git worktree add new-rebase under-rebase &&
 272        ! test -d new-rebase
 273'
 274
 275test_expect_success 'checking out a rebased branch from another worktree' '
 276        git worktree add new-place &&
 277        test_must_fail git -C new-place checkout under-rebase
 278'
 279
 280test_expect_success 'not allow to delete a branch under rebase' '
 281        (
 282                cd under-rebase &&
 283                test_must_fail git branch -D under-rebase
 284        )
 285'
 286
 287test_expect_success 'rename a branch under rebase not allowed' '
 288        test_must_fail git branch -M under-rebase rebase-with-new-name
 289'
 290
 291test_expect_success 'check out from current worktree branch ok' '
 292        (
 293                cd under-rebase &&
 294                git checkout under-rebase &&
 295                git checkout - &&
 296                git rebase --abort
 297        )
 298'
 299
 300test_expect_success 'checkout a branch under bisect' '
 301        git worktree add under-bisect &&
 302        (
 303                cd under-bisect &&
 304                git bisect start &&
 305                git bisect bad &&
 306                git bisect good HEAD~2 &&
 307                git worktree list | grep "under-bisect.*detached HEAD" &&
 308                test_must_fail git worktree add new-bisect under-bisect &&
 309                ! test -d new-bisect
 310        )
 311'
 312
 313test_expect_success 'rename a branch under bisect not allowed' '
 314        test_must_fail git branch -M under-bisect bisect-with-new-name
 315'
 316
 317test_done