t / t2025-worktree-add.shon commit Merge branch 'mh/init-delete-refs-api' (be9cb56)
   1#!/bin/sh
   2
   3test_description='test git worktree add'
   4
   5. ./test-lib.sh
   6
   7test_expect_success 'setup' '
   8        test_commit init
   9'
  10
  11test_expect_success '"add" an existing worktree' '
  12        mkdir -p existing/subtree &&
  13        test_must_fail git worktree add --detach existing master
  14'
  15
  16test_expect_success '"add" an existing empty worktree' '
  17        mkdir existing_empty &&
  18        git worktree add --detach existing_empty master
  19'
  20
  21test_expect_success '"add" refuses to checkout locked branch' '
  22        test_must_fail git worktree add zere master &&
  23        ! test -d zere &&
  24        ! test -d .git/worktrees/zere
  25'
  26
  27test_expect_success 'checking out paths not complaining about linked checkouts' '
  28        (
  29        cd existing_empty &&
  30        echo dirty >>init.t &&
  31        git checkout master -- init.t
  32        )
  33'
  34
  35test_expect_success '"add" worktree' '
  36        git rev-parse HEAD >expect &&
  37        git worktree add --detach here master &&
  38        (
  39                cd here &&
  40                test_cmp ../init.t init.t &&
  41                test_must_fail git symbolic-ref HEAD &&
  42                git rev-parse HEAD >actual &&
  43                test_cmp ../expect actual &&
  44                git fsck
  45        )
  46'
  47
  48test_expect_success '"add" worktree from a subdir' '
  49        (
  50                mkdir sub &&
  51                cd sub &&
  52                git worktree add --detach here master &&
  53                cd here &&
  54                test_cmp ../../init.t init.t
  55        )
  56'
  57
  58test_expect_success '"add" from a linked checkout' '
  59        (
  60                cd here &&
  61                git worktree add --detach nested-here master &&
  62                cd nested-here &&
  63                git fsck
  64        )
  65'
  66
  67test_expect_success '"add" worktree creating new branch' '
  68        git worktree add -b newmaster there master &&
  69        (
  70                cd there &&
  71                test_cmp ../init.t init.t &&
  72                git symbolic-ref HEAD >actual &&
  73                echo refs/heads/newmaster >expect &&
  74                test_cmp expect actual &&
  75                git fsck
  76        )
  77'
  78
  79test_expect_success 'die the same branch is already checked out' '
  80        (
  81                cd here &&
  82                test_must_fail git checkout newmaster
  83        )
  84'
  85
  86test_expect_success 'not die the same branch is already checked out' '
  87        (
  88                cd here &&
  89                git worktree add --force anothernewmaster newmaster
  90        )
  91'
  92
  93test_expect_success 'not die on re-checking out current branch' '
  94        (
  95                cd there &&
  96                git checkout newmaster
  97        )
  98'
  99
 100test_expect_success '"add" from a bare repo' '
 101        (
 102                git clone --bare . bare &&
 103                cd bare &&
 104                git worktree add -b bare-master ../there2 master
 105        )
 106'
 107
 108test_expect_success 'checkout from a bare repo without "add"' '
 109        (
 110                cd bare &&
 111                test_must_fail git checkout master
 112        )
 113'
 114
 115test_expect_success 'checkout with grafts' '
 116        test_when_finished rm .git/info/grafts &&
 117        test_commit abc &&
 118        SHA1=`git rev-parse HEAD` &&
 119        test_commit def &&
 120        test_commit xyz &&
 121        echo "`git rev-parse HEAD` $SHA1" >.git/info/grafts &&
 122        cat >expected <<-\EOF &&
 123        xyz
 124        abc
 125        EOF
 126        git log --format=%s -2 >actual &&
 127        test_cmp expected actual &&
 128        git worktree add --detach grafted master &&
 129        git --git-dir=grafted/.git log --format=%s -2 >actual &&
 130        test_cmp expected actual
 131'
 132
 133test_expect_success '"add" from relative HEAD' '
 134        test_commit a &&
 135        test_commit b &&
 136        test_commit c &&
 137        git rev-parse HEAD~1 >expected &&
 138        git worktree add relhead HEAD~1 &&
 139        git -C relhead rev-parse HEAD >actual &&
 140        test_cmp expected actual
 141'
 142
 143test_expect_success '"add -b" with <branch> omitted' '
 144        git worktree add -b burble flornk &&
 145        test_cmp_rev HEAD burble
 146'
 147
 148test_expect_success '"add" with <branch> omitted' '
 149        git worktree add wiffle/bat &&
 150        test_cmp_rev HEAD bat
 151'
 152
 153test_expect_success '"add" auto-vivify does not clobber existing branch' '
 154        test_commit c1 &&
 155        test_commit c2 &&
 156        git branch precious HEAD~1 &&
 157        test_must_fail git worktree add precious &&
 158        test_cmp_rev HEAD~1 precious &&
 159        test_path_is_missing precious
 160'
 161
 162test_done