t / t1510-repo-setup.shon commit Merge branch 'rj/test-fixes' (7810c6b)
   1#!/bin/sh
   2
   3test_description='Tests of cwd/prefix/worktree/gitdir setup in all cases'
   4
   5. ./test-lib.sh
   6
   7#
   8# A few rules for repo setup:
   9#
  10# 1. GIT_DIR is relative to user's cwd. --git-dir is equivalent to
  11#    GIT_DIR.
  12#
  13# 2. .git file is relative to parent directory. .git file is basically
  14#    symlink in disguise. The directory where .git file points to will
  15#    become new git_dir.
  16#
  17# 3. core.worktree is relative to git_dir.
  18#
  19# 4. GIT_WORK_TREE is relative to user's cwd. --work-tree is
  20#    equivalent to GIT_WORK_TREE.
  21#
  22# 5. GIT_WORK_TREE/core.worktree is only effective if GIT_DIR is set
  23#    Uneffective worktree settings should be warned.
  24#
  25# 6. Effective GIT_WORK_TREE overrides core.worktree and core.bare
  26#
  27# 7. Effective core.worktree conflicts with core.bare
  28#
  29# 8. If GIT_DIR is set but neither worktree nor bare setting is given,
  30#    original cwd becomes worktree.
  31#
  32# 9. If .git discovery is done inside a repo, the repo becomes a bare
  33#    repo. .git discovery is performed if GIT_DIR is not set.
  34#
  35# 10. If no worktree is available, cwd remains unchanged, prefix is
  36#     NULL.
  37#
  38# 11. When user's cwd is outside worktree, cwd remains unchanged,
  39#     prefix is NULL.
  40#
  41
  42test_repo() {
  43        (
  44        cd "$1" &&
  45        if test -n "$2"; then GIT_DIR="$2" && export GIT_DIR; fi &&
  46        if test -n "$3"; then GIT_WORK_TREE="$3" && export GIT_WORK_TREE; fi &&
  47        rm -f trace &&
  48        GIT_TRACE="`pwd`/trace" git symbolic-ref HEAD >/dev/null &&
  49        grep '^setup: ' trace >result &&
  50        test_cmp expected result
  51        )
  52}
  53
  54# Bit 0 = GIT_WORK_TREE
  55# Bit 1 = GIT_DIR
  56# Bit 2 = core.worktree
  57# Bit 3 = .git is a file
  58# Bit 4 = bare repo
  59# Case# = encoding of the above 5 bits
  60
  61#
  62# Case #0
  63#
  64############################################################
  65#
  66# Input:
  67#
  68#  - GIT_WORK_TREE is not set
  69#  - GIT_DIR is not set
  70#  - core.worktree is not set
  71#  - .git is a directory
  72#  - core.bare is not set, cwd is outside .git
  73#
  74# Output:
  75#
  76#  - worktree is .git's parent directory
  77#  - cwd is at worktree root dir
  78#  - prefix is calculated
  79#  - git_dir is set to ".git"
  80#  - cwd can't be outside worktree
  81
  82test_expect_success '#0: setup' '
  83        sane_unset GIT_DIR GIT_WORK_TREE &&
  84        mkdir 0 0/sub &&
  85        cd 0 && git init && cd ..
  86'
  87
  88test_expect_success '#0: at root' '
  89        cat >0/expected <<EOF &&
  90setup: git_dir: .git
  91setup: worktree: $TRASH_DIRECTORY/0
  92setup: cwd: $TRASH_DIRECTORY/0
  93setup: prefix: (null)
  94EOF
  95        test_repo 0
  96'
  97
  98test_expect_success '#0: in subdir' '
  99        cat >0/sub/expected <<EOF &&
 100setup: git_dir: .git
 101setup: worktree: $TRASH_DIRECTORY/0
 102setup: cwd: $TRASH_DIRECTORY/0
 103setup: prefix: sub/
 104EOF
 105        test_repo 0/sub
 106'
 107
 108#
 109# case #1
 110#
 111############################################################
 112#
 113# Input:
 114#
 115#  - GIT_WORK_TREE is set
 116#  - GIT_DIR is not set
 117#  - core.worktree is not set
 118#  - .git is a directory
 119#  - core.bare is not set, cwd is outside .git
 120#
 121# Output:
 122#
 123# GIT_WORK_TREE is ignored -> #0
 124
 125test_expect_success '#1: setup' '
 126        sane_unset GIT_DIR GIT_WORK_TREE &&
 127        mkdir 1 1/sub 1.wt 1.wt/sub 1/wt 1/wt/sub &&
 128        cd 1 &&
 129        git init &&
 130        GIT_WORK_TREE=non-existent &&
 131        export GIT_WORK_TREE &&
 132        cd ..
 133'
 134
 135test_expect_success '#1: at root' '
 136        cat >1/expected <<EOF &&
 137setup: git_dir: .git
 138setup: worktree: $TRASH_DIRECTORY/1
 139setup: cwd: $TRASH_DIRECTORY/1
 140setup: prefix: (null)
 141EOF
 142        test_repo 1
 143'
 144
 145test_expect_success '#1: in subdir' '
 146        cat >1/sub/expected <<EOF &&
 147setup: git_dir: .git
 148setup: worktree: $TRASH_DIRECTORY/1
 149setup: cwd: $TRASH_DIRECTORY/1
 150setup: prefix: sub/
 151EOF
 152        test_repo 1/sub
 153'
 154
 155#
 156# case #2
 157#
 158############################################################
 159#
 160# Input:
 161#
 162#  - GIT_WORK_TREE is not set
 163#  - GIT_DIR is set
 164#  - core.worktree is not set
 165#  - .git is a directory
 166#  - core.bare is not set, cwd is outside .git
 167#
 168# Output:
 169#
 170#  - worktree is at original cwd
 171#  - cwd is unchanged
 172#  - prefix is NULL
 173#  - git_dir is set to $GIT_DIR
 174#  - cwd can't be outside worktree
 175
 176test_expect_success '#2: setup' '
 177        sane_unset GIT_DIR GIT_WORK_TREE &&
 178        mkdir 2 2/sub &&
 179        cd 2 && git init && cd ..
 180'
 181
 182test_expect_success '#2: at root' '
 183        cat >2/expected <<EOF &&
 184setup: git_dir: $TRASH_DIRECTORY/2/.git
 185setup: worktree: $TRASH_DIRECTORY/2
 186setup: cwd: $TRASH_DIRECTORY/2
 187setup: prefix: (null)
 188EOF
 189        test_repo 2 "$TRASH_DIRECTORY/2/.git"
 190'
 191
 192test_expect_success '#2: in subdir' '
 193        cat >2/sub/expected <<EOF &&
 194setup: git_dir: $TRASH_DIRECTORY/2/.git
 195setup: worktree: $TRASH_DIRECTORY/2/sub
 196setup: cwd: $TRASH_DIRECTORY/2/sub
 197setup: prefix: (null)
 198EOF
 199        test_repo 2/sub "$TRASH_DIRECTORY/2/.git"
 200'
 201
 202test_expect_success '#2: relative GIT_DIR at root' '
 203        cat >2/expected <<EOF &&
 204setup: git_dir: .git
 205setup: worktree: $TRASH_DIRECTORY/2
 206setup: cwd: $TRASH_DIRECTORY/2
 207setup: prefix: (null)
 208EOF
 209        test_repo 2 .git
 210'
 211
 212test_expect_success '#2: relative GIT_DIR in subdir' '
 213        cat >2/sub/expected <<EOF &&
 214setup: git_dir: ../.git
 215setup: worktree: $TRASH_DIRECTORY/2/sub
 216setup: cwd: $TRASH_DIRECTORY/2/sub
 217setup: prefix: (null)
 218EOF
 219        test_repo 2/sub ../.git
 220'
 221
 222#
 223# case #3
 224#
 225############################################################
 226#
 227# Input:
 228#
 229#  - GIT_WORK_TREE is set
 230#  - GIT_DIR is set
 231#  - core.worktree is not set
 232#  - .git is a directory
 233#  - core.bare is not set, cwd is outside .git
 234#
 235# Output:
 236#
 237#  - worktree is set to $GIT_WORK_TREE
 238#  - cwd is at worktree root
 239#  - prefix is calculated
 240#  - git_dir is set to $GIT_DIR
 241#  - cwd can be outside worktree
 242
 243test_expect_success '#3: setup' '
 244        sane_unset GIT_DIR GIT_WORK_TREE &&
 245        mkdir 3 3/sub 3/sub/sub 3.wt 3.wt/sub 3/wt 3/wt/sub &&
 246        cd 3 && git init && cd ..
 247'
 248
 249test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=root at root' '
 250        cat >3/expected <<EOF &&
 251setup: git_dir: .git
 252setup: worktree: $TRASH_DIRECTORY/3
 253setup: cwd: $TRASH_DIRECTORY/3
 254setup: prefix: (null)
 255EOF
 256        test_repo 3 .git "$TRASH_DIRECTORY/3"
 257'
 258
 259test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' '
 260        cat >3/expected <<EOF &&
 261setup: git_dir: .git
 262setup: worktree: $TRASH_DIRECTORY/3
 263setup: cwd: $TRASH_DIRECTORY/3
 264setup: prefix: (null)
 265EOF
 266        test_repo 3 .git .
 267'
 268
 269test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=root at root' '
 270        cat >3/expected <<EOF &&
 271setup: git_dir: $TRASH_DIRECTORY/3/.git
 272setup: worktree: $TRASH_DIRECTORY/3
 273setup: cwd: $TRASH_DIRECTORY/3
 274setup: prefix: (null)
 275EOF
 276        test_repo 3 "$TRASH_DIRECTORY/3/.git" "$TRASH_DIRECTORY/3"
 277'
 278
 279test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=root(rel) at root' '
 280        cat >3/expected <<EOF &&
 281setup: git_dir: $TRASH_DIRECTORY/3/.git
 282setup: worktree: $TRASH_DIRECTORY/3
 283setup: cwd: $TRASH_DIRECTORY/3
 284setup: prefix: (null)
 285EOF
 286        test_repo 3 "$TRASH_DIRECTORY/3/.git" .
 287'
 288
 289test_expect_success '#3: GIT_DIR(rel), GIT_WORKTREE=root in subdir' '
 290        cat >3/sub/sub/expected <<EOF &&
 291setup: git_dir: $TRASH_DIRECTORY/3/.git
 292setup: worktree: $TRASH_DIRECTORY/3
 293setup: cwd: $TRASH_DIRECTORY/3
 294setup: prefix: sub/sub/
 295EOF
 296        test_repo 3/sub/sub ../../.git "$TRASH_DIRECTORY/3"
 297'
 298
 299test_expect_success '#3: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' '
 300        cat >3/sub/sub/expected <<EOF &&
 301setup: git_dir: $TRASH_DIRECTORY/3/.git
 302setup: worktree: $TRASH_DIRECTORY/3
 303setup: cwd: $TRASH_DIRECTORY/3
 304setup: prefix: sub/sub/
 305EOF
 306        test_repo 3/sub/sub ../../.git ../..
 307'
 308
 309test_expect_success '#3: GIT_DIR, GIT_WORKTREE=root in subdir' '
 310        cat >3/sub/expected <<EOF &&
 311setup: git_dir: $TRASH_DIRECTORY/3/.git
 312setup: worktree: $TRASH_DIRECTORY/3
 313setup: cwd: $TRASH_DIRECTORY/3
 314setup: prefix: sub/
 315EOF
 316        test_repo 3/sub "$TRASH_DIRECTORY/3/.git" "$TRASH_DIRECTORY/3"
 317'
 318
 319test_expect_success '#3: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' '
 320        cat >3/sub/sub/expected <<EOF &&
 321setup: git_dir: $TRASH_DIRECTORY/3/.git
 322setup: worktree: $TRASH_DIRECTORY/3
 323setup: cwd: $TRASH_DIRECTORY/3
 324setup: prefix: sub/sub/
 325EOF
 326        test_repo 3/sub/sub "$TRASH_DIRECTORY/3/.git" ../..
 327'
 328
 329test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=wt at root' '
 330        cat >3/expected <<EOF &&
 331setup: git_dir: .git
 332setup: worktree: $TRASH_DIRECTORY/3/wt
 333setup: cwd: $TRASH_DIRECTORY/3
 334setup: prefix: (null)
 335EOF
 336        test_repo 3 .git "$TRASH_DIRECTORY/3/wt"
 337'
 338
 339test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' '
 340        cat >3/expected <<EOF &&
 341setup: git_dir: .git
 342setup: worktree: $TRASH_DIRECTORY/3/wt
 343setup: cwd: $TRASH_DIRECTORY/3
 344setup: prefix: (null)
 345EOF
 346        test_repo 3 .git wt
 347'
 348
 349test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' '
 350        cat >3/expected <<EOF &&
 351setup: git_dir: $TRASH_DIRECTORY/3/.git
 352setup: worktree: $TRASH_DIRECTORY/3/wt
 353setup: cwd: $TRASH_DIRECTORY/3
 354setup: prefix: (null)
 355EOF
 356        test_repo 3 "$TRASH_DIRECTORY/3/.git" wt
 357'
 358
 359test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=wt at root' '
 360        cat >3/expected <<EOF &&
 361setup: git_dir: $TRASH_DIRECTORY/3/.git
 362setup: worktree: $TRASH_DIRECTORY/3/wt
 363setup: cwd: $TRASH_DIRECTORY/3
 364setup: prefix: (null)
 365EOF
 366        test_repo 3 "$TRASH_DIRECTORY/3/.git" "$TRASH_DIRECTORY/3/wt"
 367'
 368
 369test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' '
 370        cat >3/sub/sub/expected <<EOF &&
 371setup: git_dir: ../../.git
 372setup: worktree: $TRASH_DIRECTORY/3/wt
 373setup: cwd: $TRASH_DIRECTORY/3/sub/sub
 374setup: prefix: (null)
 375EOF
 376        test_repo 3/sub/sub ../../.git "$TRASH_DIRECTORY/3/wt"
 377'
 378
 379test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' '
 380        cat >3/sub/sub/expected <<EOF &&
 381setup: git_dir: ../../.git
 382setup: worktree: $TRASH_DIRECTORY/3/wt
 383setup: cwd: $TRASH_DIRECTORY/3/sub/sub
 384setup: prefix: (null)
 385EOF
 386        test_repo 3/sub/sub ../../.git ../../wt
 387'
 388
 389test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' '
 390        cat >3/sub/sub/expected <<EOF &&
 391setup: git_dir: $TRASH_DIRECTORY/3/.git
 392setup: worktree: $TRASH_DIRECTORY/3/wt
 393setup: cwd: $TRASH_DIRECTORY/3/sub/sub
 394setup: prefix: (null)
 395EOF
 396        test_repo 3/sub/sub "$TRASH_DIRECTORY/3/.git" ../../wt
 397'
 398
 399test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=wt in subdir' '
 400        cat >3/sub/sub/expected <<EOF &&
 401setup: git_dir: $TRASH_DIRECTORY/3/.git
 402setup: worktree: $TRASH_DIRECTORY/3/wt
 403setup: cwd: $TRASH_DIRECTORY/3/sub/sub
 404setup: prefix: (null)
 405EOF
 406        test_repo 3/sub/sub "$TRASH_DIRECTORY/3/.git" "$TRASH_DIRECTORY/3/wt"
 407'
 408
 409test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=.. at root' '
 410        cat >3/expected <<EOF &&
 411setup: git_dir: $TRASH_DIRECTORY/3/.git
 412setup: worktree: $TRASH_DIRECTORY
 413setup: cwd: $TRASH_DIRECTORY
 414setup: prefix: 3/
 415EOF
 416        test_repo 3 .git "$TRASH_DIRECTORY"
 417'
 418
 419test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' '
 420        cat >3/expected <<EOF &&
 421setup: git_dir: $TRASH_DIRECTORY/3/.git
 422setup: worktree: $TRASH_DIRECTORY
 423setup: cwd: $TRASH_DIRECTORY
 424setup: prefix: 3/
 425EOF
 426        test_repo 3 .git ..
 427'
 428
 429test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=..(rel) at root' '
 430        cat >3/expected <<EOF &&
 431setup: git_dir: $TRASH_DIRECTORY/3/.git
 432setup: worktree: $TRASH_DIRECTORY
 433setup: cwd: $TRASH_DIRECTORY
 434setup: prefix: 3/
 435EOF
 436        test_repo 3 "$TRASH_DIRECTORY/3/.git" ..
 437'
 438
 439test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=.. at root' '
 440        cat >3/expected <<EOF &&
 441setup: git_dir: $TRASH_DIRECTORY/3/.git
 442setup: worktree: $TRASH_DIRECTORY
 443setup: cwd: $TRASH_DIRECTORY
 444setup: prefix: 3/
 445EOF
 446        test_repo 3 "$TRASH_DIRECTORY/3/.git" "$TRASH_DIRECTORY"
 447'
 448
 449test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' '
 450        cat >3/sub/sub/expected <<EOF &&
 451setup: git_dir: $TRASH_DIRECTORY/3/.git
 452setup: worktree: $TRASH_DIRECTORY
 453setup: cwd: $TRASH_DIRECTORY
 454setup: prefix: 3/sub/sub/
 455EOF
 456        test_repo 3/sub/sub ../../.git "$TRASH_DIRECTORY"
 457'
 458
 459test_expect_success '#3: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' '
 460        cat >3/sub/sub/expected <<EOF &&
 461setup: git_dir: $TRASH_DIRECTORY/3/.git
 462setup: worktree: $TRASH_DIRECTORY
 463setup: cwd: $TRASH_DIRECTORY
 464setup: prefix: 3/sub/sub/
 465EOF
 466        test_repo 3/sub/sub ../../.git ../../..
 467'
 468
 469test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' '
 470        cat >3/sub/sub/expected <<EOF &&
 471setup: git_dir: $TRASH_DIRECTORY/3/.git
 472setup: worktree: $TRASH_DIRECTORY
 473setup: cwd: $TRASH_DIRECTORY
 474setup: prefix: 3/sub/sub/
 475EOF
 476        test_repo 3/sub/sub "$TRASH_DIRECTORY/3/.git" ../../../
 477'
 478
 479test_expect_success '#3: GIT_DIR, GIT_WORK_TREE=.. in subdir' '
 480        cat >3/sub/sub/expected <<EOF &&
 481setup: git_dir: $TRASH_DIRECTORY/3/.git
 482setup: worktree: $TRASH_DIRECTORY
 483setup: cwd: $TRASH_DIRECTORY
 484setup: prefix: 3/sub/sub/
 485EOF
 486        test_repo 3/sub/sub "$TRASH_DIRECTORY/3/.git" "$TRASH_DIRECTORY"
 487'
 488
 489#
 490# case #4
 491#
 492############################################################
 493#
 494# Input:
 495#
 496#  - GIT_WORK_TREE is not set
 497#  - GIT_DIR is not set
 498#  - core.worktree is set
 499#  - .git is a directory
 500#  - core.bare is not set, cwd is outside .git
 501#
 502# Output:
 503#
 504# core.worktree is ignored -> #0
 505
 506test_expect_success '#4: setup' '
 507        sane_unset GIT_DIR GIT_WORK_TREE &&
 508        mkdir 4 4/sub &&
 509        cd 4 &&
 510        git init &&
 511        git config core.worktree non-existent &&
 512        cd ..
 513'
 514
 515test_expect_success '#4: at root' '
 516        cat >4/expected <<EOF &&
 517setup: git_dir: .git
 518setup: worktree: $TRASH_DIRECTORY/4
 519setup: cwd: $TRASH_DIRECTORY/4
 520setup: prefix: (null)
 521EOF
 522        test_repo 4
 523'
 524
 525test_expect_success '#4: in subdir' '
 526        cat >4/sub/expected <<EOF &&
 527setup: git_dir: .git
 528setup: worktree: $TRASH_DIRECTORY/4
 529setup: cwd: $TRASH_DIRECTORY/4
 530setup: prefix: sub/
 531EOF
 532        test_repo 4/sub
 533'
 534
 535#
 536# case #5
 537#
 538############################################################
 539#
 540# Input:
 541#
 542#  - GIT_WORK_TREE is set
 543#  - GIT_DIR is not set
 544#  - core.worktree is set
 545#  - .git is a directory
 546#  - core.bare is not set, cwd is outside .git
 547#
 548# Output:
 549#
 550# GIT_WORK_TREE/core.worktree are ignored -> #0
 551
 552test_expect_success '#5: setup' '
 553        sane_unset GIT_DIR GIT_WORK_TREE &&
 554        mkdir 5 5/sub &&
 555        cd 5 &&
 556        git init &&
 557        git config core.worktree non-existent &&
 558        GIT_WORK_TREE=non-existent-too &&
 559        export GIT_WORK_TREE &&
 560        cd ..
 561'
 562
 563test_expect_success '#5: at root' '
 564        cat >5/expected <<EOF &&
 565setup: git_dir: .git
 566setup: worktree: $TRASH_DIRECTORY/5
 567setup: cwd: $TRASH_DIRECTORY/5
 568setup: prefix: (null)
 569EOF
 570        test_repo 5
 571'
 572
 573test_expect_success '#5: in subdir' '
 574        cat >5/sub/expected <<EOF &&
 575setup: git_dir: .git
 576setup: worktree: $TRASH_DIRECTORY/5
 577setup: cwd: $TRASH_DIRECTORY/5
 578setup: prefix: sub/
 579EOF
 580        test_repo 5/sub
 581'
 582
 583#
 584# case #6
 585#
 586############################################################
 587#
 588# Input:
 589#
 590#  - GIT_WORK_TREE is not set
 591#  - GIT_DIR is set
 592#  - core.worktree is set
 593#  - .git is a directory
 594#  - core.bare is not set, cwd is outside .git
 595#
 596# Output:
 597#
 598#  - worktree is at core.worktree
 599#  - cwd is at worktree root
 600#  - prefix is calculated
 601#  - git_dir is at $GIT_DIR
 602#  - cwd can be outside worktree
 603
 604test_expect_success '#6: setup' '
 605        sane_unset GIT_DIR GIT_WORK_TREE &&
 606        mkdir 6 6/sub 6/sub/sub 6.wt 6.wt/sub 6/wt 6/wt/sub &&
 607        cd 6 && git init && cd ..
 608'
 609
 610test_expect_success '#6: GIT_DIR(rel), core.worktree=.. at root' '
 611        cat >6/expected <<EOF &&
 612setup: git_dir: .git
 613setup: worktree: $TRASH_DIRECTORY/6
 614setup: cwd: $TRASH_DIRECTORY/6
 615setup: prefix: (null)
 616EOF
 617        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6" &&
 618        test_repo 6 .git
 619'
 620
 621test_expect_success '#6: GIT_DIR(rel), core.worktree=..(rel) at root' '
 622        cat >6/expected <<EOF &&
 623setup: git_dir: .git
 624setup: worktree: $TRASH_DIRECTORY/6
 625setup: cwd: $TRASH_DIRECTORY/6
 626setup: prefix: (null)
 627EOF
 628        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree .. &&
 629        test_repo 6 .git
 630'
 631
 632test_expect_success '#6: GIT_DIR, core.worktree=.. at root' '
 633        cat >6/expected <<EOF &&
 634setup: git_dir: $TRASH_DIRECTORY/6/.git
 635setup: worktree: $TRASH_DIRECTORY/6
 636setup: cwd: $TRASH_DIRECTORY/6
 637setup: prefix: (null)
 638EOF
 639        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6" &&
 640        test_repo 6 "$TRASH_DIRECTORY/6/.git"
 641'
 642
 643test_expect_success '#6: GIT_DIR, core.worktree=..(rel) at root' '
 644        cat >6/expected <<EOF &&
 645setup: git_dir: $TRASH_DIRECTORY/6/.git
 646setup: worktree: $TRASH_DIRECTORY/6
 647setup: cwd: $TRASH_DIRECTORY/6
 648setup: prefix: (null)
 649EOF
 650        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree .. &&
 651        test_repo 6 "$TRASH_DIRECTORY/6/.git"
 652'
 653
 654test_expect_success '#6: GIT_DIR(rel), core.worktree=.. in subdir' '
 655        cat >6/sub/sub/expected <<EOF &&
 656setup: git_dir: $TRASH_DIRECTORY/6/.git
 657setup: worktree: $TRASH_DIRECTORY/6
 658setup: cwd: $TRASH_DIRECTORY/6
 659setup: prefix: sub/sub/
 660EOF
 661        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6" &&
 662        test_repo 6/sub/sub ../../.git
 663'
 664
 665test_expect_success '#6: GIT_DIR(rel), core.worktree=..(rel) in subdir' '
 666        cat >6/sub/sub/expected <<EOF &&
 667setup: git_dir: $TRASH_DIRECTORY/6/.git
 668setup: worktree: $TRASH_DIRECTORY/6
 669setup: cwd: $TRASH_DIRECTORY/6
 670setup: prefix: sub/sub/
 671EOF
 672        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree .. &&
 673        test_repo 6/sub/sub ../../.git
 674'
 675
 676test_expect_success '#6: GIT_DIR, core.worktree=.. in subdir' '
 677        cat >6/sub/expected <<EOF &&
 678setup: git_dir: $TRASH_DIRECTORY/6/.git
 679setup: worktree: $TRASH_DIRECTORY/6
 680setup: cwd: $TRASH_DIRECTORY/6
 681setup: prefix: sub/
 682EOF
 683        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6" &&
 684        test_repo 6/sub "$TRASH_DIRECTORY/6/.git"
 685'
 686
 687test_expect_success '#6: GIT_DIR, core.worktree=..(rel) in subdir' '
 688        cat >6/sub/sub/expected <<EOF &&
 689setup: git_dir: $TRASH_DIRECTORY/6/.git
 690setup: worktree: $TRASH_DIRECTORY/6
 691setup: cwd: $TRASH_DIRECTORY/6
 692setup: prefix: sub/sub/
 693EOF
 694        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree .. &&
 695        test_repo 6/sub/sub "$TRASH_DIRECTORY/6/.git"
 696'
 697
 698test_expect_success '#6: GIT_DIR(rel), core.worktree=../wt at root' '
 699        cat >6/expected <<EOF &&
 700setup: git_dir: .git
 701setup: worktree: $TRASH_DIRECTORY/6/wt
 702setup: cwd: $TRASH_DIRECTORY/6
 703setup: prefix: (null)
 704EOF
 705        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6/wt" &&
 706        test_repo 6 .git
 707'
 708
 709test_expect_success '#6: GIT_DIR(rel), core.worktree=../wt(rel) at root' '
 710        cat >6/expected <<EOF &&
 711setup: git_dir: .git
 712setup: worktree: $TRASH_DIRECTORY/6/wt
 713setup: cwd: $TRASH_DIRECTORY/6
 714setup: prefix: (null)
 715EOF
 716        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../wt &&
 717        test_repo 6 .git
 718'
 719
 720test_expect_success '#6: GIT_DIR, core.worktree=../wt(rel) at root' '
 721        cat >6/expected <<EOF &&
 722setup: git_dir: $TRASH_DIRECTORY/6/.git
 723setup: worktree: $TRASH_DIRECTORY/6/wt
 724setup: cwd: $TRASH_DIRECTORY/6
 725setup: prefix: (null)
 726EOF
 727        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../wt &&
 728        test_repo 6 "$TRASH_DIRECTORY/6/.git"
 729'
 730
 731test_expect_success '#6: GIT_DIR, core.worktree=../wt at root' '
 732        cat >6/expected <<EOF &&
 733setup: git_dir: $TRASH_DIRECTORY/6/.git
 734setup: worktree: $TRASH_DIRECTORY/6/wt
 735setup: cwd: $TRASH_DIRECTORY/6
 736setup: prefix: (null)
 737EOF
 738        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6/wt" &&
 739        test_repo 6 "$TRASH_DIRECTORY/6/.git"
 740'
 741
 742test_expect_success '#6: GIT_DIR(rel), core.worktree=../wt in subdir' '
 743        cat >6/sub/sub/expected <<EOF &&
 744setup: git_dir: ../../.git
 745setup: worktree: $TRASH_DIRECTORY/6/wt
 746setup: cwd: $TRASH_DIRECTORY/6/sub/sub
 747setup: prefix: (null)
 748EOF
 749        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6/wt" &&
 750        test_repo 6/sub/sub ../../.git
 751'
 752
 753test_expect_success '#6: GIT_DIR(rel), core.worktree=../wt(rel) in subdir' '
 754        cat >6/sub/sub/expected <<EOF &&
 755setup: git_dir: ../../.git
 756setup: worktree: $TRASH_DIRECTORY/6/wt
 757setup: cwd: $TRASH_DIRECTORY/6/sub/sub
 758setup: prefix: (null)
 759EOF
 760        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../wt &&
 761        test_repo 6/sub/sub ../../.git
 762'
 763
 764test_expect_success '#6: GIT_DIR, core.worktree=../wt(rel) in subdir' '
 765        cat >6/sub/sub/expected <<EOF &&
 766setup: git_dir: $TRASH_DIRECTORY/6/.git
 767setup: worktree: $TRASH_DIRECTORY/6/wt
 768setup: cwd: $TRASH_DIRECTORY/6/sub/sub
 769setup: prefix: (null)
 770EOF
 771        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../wt &&
 772        test_repo 6/sub/sub "$TRASH_DIRECTORY/6/.git"
 773'
 774
 775test_expect_success '#6: GIT_DIR, core.worktree=../wt in subdir' '
 776        cat >6/sub/sub/expected <<EOF &&
 777setup: git_dir: $TRASH_DIRECTORY/6/.git
 778setup: worktree: $TRASH_DIRECTORY/6/wt
 779setup: cwd: $TRASH_DIRECTORY/6/sub/sub
 780setup: prefix: (null)
 781EOF
 782        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY/6/wt" &&
 783        test_repo 6/sub/sub "$TRASH_DIRECTORY/6/.git"
 784'
 785
 786test_expect_success '#6: GIT_DIR(rel), core.worktree=../.. at root' '
 787        cat >6/expected <<EOF &&
 788setup: git_dir: $TRASH_DIRECTORY/6/.git
 789setup: worktree: $TRASH_DIRECTORY
 790setup: cwd: $TRASH_DIRECTORY
 791setup: prefix: 6/
 792EOF
 793        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY" &&
 794        test_repo 6 .git
 795'
 796
 797test_expect_success '#6: GIT_DIR(rel), core.worktree=../..(rel) at root' '
 798        cat >6/expected <<EOF &&
 799setup: git_dir: $TRASH_DIRECTORY/6/.git
 800setup: worktree: $TRASH_DIRECTORY
 801setup: cwd: $TRASH_DIRECTORY
 802setup: prefix: 6/
 803EOF
 804        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../../ &&
 805        test_repo 6 .git
 806'
 807
 808test_expect_success '#6: GIT_DIR, core.worktree=../..(rel) at root' '
 809        cat >6/expected <<EOF &&
 810setup: git_dir: $TRASH_DIRECTORY/6/.git
 811setup: worktree: $TRASH_DIRECTORY
 812setup: cwd: $TRASH_DIRECTORY
 813setup: prefix: 6/
 814EOF
 815        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../../ &&
 816        test_repo 6 "$TRASH_DIRECTORY/6/.git"
 817'
 818
 819test_expect_success '#6: GIT_DIR, core.worktree=../.. at root' '
 820        cat >6/expected <<EOF &&
 821setup: git_dir: $TRASH_DIRECTORY/6/.git
 822setup: worktree: $TRASH_DIRECTORY
 823setup: cwd: $TRASH_DIRECTORY
 824setup: prefix: 6/
 825EOF
 826        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY" &&
 827        test_repo 6 "$TRASH_DIRECTORY/6/.git"
 828'
 829
 830test_expect_success '#6: GIT_DIR(rel), core.worktree=../.. in subdir' '
 831        cat >6/sub/sub/expected <<EOF &&
 832setup: git_dir: $TRASH_DIRECTORY/6/.git
 833setup: worktree: $TRASH_DIRECTORY
 834setup: cwd: $TRASH_DIRECTORY
 835setup: prefix: 6/sub/sub/
 836EOF
 837        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY" &&
 838        test_repo 6/sub/sub ../../.git
 839'
 840
 841test_expect_success '#6: GIT_DIR(rel), core.worktree=../..(rel) in subdir' '
 842        cat >6/sub/sub/expected <<EOF &&
 843setup: git_dir: $TRASH_DIRECTORY/6/.git
 844setup: worktree: $TRASH_DIRECTORY
 845setup: cwd: $TRASH_DIRECTORY
 846setup: prefix: 6/sub/sub/
 847EOF
 848        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../.. &&
 849        test_repo 6/sub/sub ../../.git
 850'
 851
 852test_expect_success '#6: GIT_DIR, core.worktree=../..(rel) in subdir' '
 853        cat >6/sub/sub/expected <<EOF &&
 854setup: git_dir: $TRASH_DIRECTORY/6/.git
 855setup: worktree: $TRASH_DIRECTORY
 856setup: cwd: $TRASH_DIRECTORY
 857setup: prefix: 6/sub/sub/
 858EOF
 859        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree ../.. &&
 860        test_repo 6/sub/sub "$TRASH_DIRECTORY/6/.git"
 861'
 862
 863test_expect_success '#6: GIT_DIR, core.worktree=../.. in subdir' '
 864        cat >6/sub/sub/expected <<EOF &&
 865setup: git_dir: $TRASH_DIRECTORY/6/.git
 866setup: worktree: $TRASH_DIRECTORY
 867setup: cwd: $TRASH_DIRECTORY
 868setup: prefix: 6/sub/sub/
 869EOF
 870        git config --file="$TRASH_DIRECTORY/6/.git/config" core.worktree "$TRASH_DIRECTORY" &&
 871        test_repo 6/sub/sub "$TRASH_DIRECTORY/6/.git"
 872'
 873
 874#
 875# case #7
 876#
 877############################################################
 878#
 879# Input:
 880#
 881#  - GIT_WORK_TREE is set
 882#  - GIT_DIR is set
 883#  - core.worktree is set
 884#  - .git is a directory
 885#  - core.bare is not set, cwd is outside .git
 886#
 887# Output:
 888#
 889# core.worktree is overridden by GIT_WORK_TREE -> #3
 890
 891test_expect_success '#7: setup' '
 892        sane_unset GIT_DIR GIT_WORK_TREE &&
 893        mkdir 7 7/sub 7/sub/sub 7.wt 7.wt/sub 7/wt 7/wt/sub &&
 894        cd 7 &&
 895        git init &&
 896        git config core.worktree non-existent &&
 897        cd ..
 898'
 899
 900test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=root at root' '
 901        cat >7/expected <<EOF &&
 902setup: git_dir: .git
 903setup: worktree: $TRASH_DIRECTORY/7
 904setup: cwd: $TRASH_DIRECTORY/7
 905setup: prefix: (null)
 906EOF
 907        test_repo 7 .git "$TRASH_DIRECTORY/7"
 908'
 909
 910test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' '
 911        cat >7/expected <<EOF &&
 912setup: git_dir: .git
 913setup: worktree: $TRASH_DIRECTORY/7
 914setup: cwd: $TRASH_DIRECTORY/7
 915setup: prefix: (null)
 916EOF
 917        test_repo 7 .git .
 918'
 919
 920test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=root at root' '
 921        cat >7/expected <<EOF &&
 922setup: git_dir: $TRASH_DIRECTORY/7/.git
 923setup: worktree: $TRASH_DIRECTORY/7
 924setup: cwd: $TRASH_DIRECTORY/7
 925setup: prefix: (null)
 926EOF
 927        test_repo 7 "$TRASH_DIRECTORY/7/.git" "$TRASH_DIRECTORY/7"
 928'
 929
 930test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=root(rel) at root' '
 931        cat >7/expected <<EOF &&
 932setup: git_dir: $TRASH_DIRECTORY/7/.git
 933setup: worktree: $TRASH_DIRECTORY/7
 934setup: cwd: $TRASH_DIRECTORY/7
 935setup: prefix: (null)
 936EOF
 937        test_repo 7 "$TRASH_DIRECTORY/7/.git" .
 938'
 939
 940test_expect_success '#7: GIT_DIR(rel), GIT_WORKTREE=root in subdir' '
 941        cat >7/sub/sub/expected <<EOF &&
 942setup: git_dir: $TRASH_DIRECTORY/7/.git
 943setup: worktree: $TRASH_DIRECTORY/7
 944setup: cwd: $TRASH_DIRECTORY/7
 945setup: prefix: sub/sub/
 946EOF
 947        test_repo 7/sub/sub ../../.git "$TRASH_DIRECTORY/7"
 948'
 949
 950test_expect_success '#7: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' '
 951        cat >7/sub/sub/expected <<EOF &&
 952setup: git_dir: $TRASH_DIRECTORY/7/.git
 953setup: worktree: $TRASH_DIRECTORY/7
 954setup: cwd: $TRASH_DIRECTORY/7
 955setup: prefix: sub/sub/
 956EOF
 957        test_repo 7/sub/sub ../../.git ../..
 958'
 959
 960test_expect_success '#7: GIT_DIR, GIT_WORKTREE=root in subdir' '
 961        cat >7/sub/expected <<EOF &&
 962setup: git_dir: $TRASH_DIRECTORY/7/.git
 963setup: worktree: $TRASH_DIRECTORY/7
 964setup: cwd: $TRASH_DIRECTORY/7
 965setup: prefix: sub/
 966EOF
 967        test_repo 7/sub "$TRASH_DIRECTORY/7/.git" "$TRASH_DIRECTORY/7"
 968'
 969
 970test_expect_success '#7: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' '
 971        cat >7/sub/sub/expected <<EOF &&
 972setup: git_dir: $TRASH_DIRECTORY/7/.git
 973setup: worktree: $TRASH_DIRECTORY/7
 974setup: cwd: $TRASH_DIRECTORY/7
 975setup: prefix: sub/sub/
 976EOF
 977        test_repo 7/sub/sub "$TRASH_DIRECTORY/7/.git" ../..
 978'
 979
 980test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=wt at root' '
 981        cat >7/expected <<EOF &&
 982setup: git_dir: .git
 983setup: worktree: $TRASH_DIRECTORY/7/wt
 984setup: cwd: $TRASH_DIRECTORY/7
 985setup: prefix: (null)
 986EOF
 987        test_repo 7 .git "$TRASH_DIRECTORY/7/wt"
 988'
 989
 990test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' '
 991        cat >7/expected <<EOF &&
 992setup: git_dir: .git
 993setup: worktree: $TRASH_DIRECTORY/7/wt
 994setup: cwd: $TRASH_DIRECTORY/7
 995setup: prefix: (null)
 996EOF
 997        test_repo 7 .git wt
 998'
 999
1000test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' '
1001        cat >7/expected <<EOF &&
1002setup: git_dir: $TRASH_DIRECTORY/7/.git
1003setup: worktree: $TRASH_DIRECTORY/7/wt
1004setup: cwd: $TRASH_DIRECTORY/7
1005setup: prefix: (null)
1006EOF
1007        test_repo 7 "$TRASH_DIRECTORY/7/.git" wt
1008'
1009
1010test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=wt at root' '
1011        cat >7/expected <<EOF &&
1012setup: git_dir: $TRASH_DIRECTORY/7/.git
1013setup: worktree: $TRASH_DIRECTORY/7/wt
1014setup: cwd: $TRASH_DIRECTORY/7
1015setup: prefix: (null)
1016EOF
1017        test_repo 7 "$TRASH_DIRECTORY/7/.git" "$TRASH_DIRECTORY/7/wt"
1018'
1019
1020test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' '
1021        cat >7/sub/sub/expected <<EOF &&
1022setup: git_dir: ../../.git
1023setup: worktree: $TRASH_DIRECTORY/7/wt
1024setup: cwd: $TRASH_DIRECTORY/7/sub/sub
1025setup: prefix: (null)
1026EOF
1027        test_repo 7/sub/sub ../../.git "$TRASH_DIRECTORY/7/wt"
1028'
1029
1030test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' '
1031        cat >7/sub/sub/expected <<EOF &&
1032setup: git_dir: ../../.git
1033setup: worktree: $TRASH_DIRECTORY/7/wt
1034setup: cwd: $TRASH_DIRECTORY/7/sub/sub
1035setup: prefix: (null)
1036EOF
1037        test_repo 7/sub/sub ../../.git ../../wt
1038'
1039
1040test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' '
1041        cat >7/sub/sub/expected <<EOF &&
1042setup: git_dir: $TRASH_DIRECTORY/7/.git
1043setup: worktree: $TRASH_DIRECTORY/7/wt
1044setup: cwd: $TRASH_DIRECTORY/7/sub/sub
1045setup: prefix: (null)
1046EOF
1047        test_repo 7/sub/sub "$TRASH_DIRECTORY/7/.git" ../../wt
1048'
1049
1050test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=wt in subdir' '
1051        cat >7/sub/sub/expected <<EOF &&
1052setup: git_dir: $TRASH_DIRECTORY/7/.git
1053setup: worktree: $TRASH_DIRECTORY/7/wt
1054setup: cwd: $TRASH_DIRECTORY/7/sub/sub
1055setup: prefix: (null)
1056EOF
1057        test_repo 7/sub/sub "$TRASH_DIRECTORY/7/.git" "$TRASH_DIRECTORY/7/wt"
1058'
1059
1060test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=.. at root' '
1061        cat >7/expected <<EOF &&
1062setup: git_dir: $TRASH_DIRECTORY/7/.git
1063setup: worktree: $TRASH_DIRECTORY
1064setup: cwd: $TRASH_DIRECTORY
1065setup: prefix: 7/
1066EOF
1067        test_repo 7 .git "$TRASH_DIRECTORY"
1068'
1069
1070test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' '
1071        cat >7/expected <<EOF &&
1072setup: git_dir: $TRASH_DIRECTORY/7/.git
1073setup: worktree: $TRASH_DIRECTORY
1074setup: cwd: $TRASH_DIRECTORY
1075setup: prefix: 7/
1076EOF
1077        test_repo 7 .git ..
1078'
1079
1080test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=..(rel) at root' '
1081        cat >7/expected <<EOF &&
1082setup: git_dir: $TRASH_DIRECTORY/7/.git
1083setup: worktree: $TRASH_DIRECTORY
1084setup: cwd: $TRASH_DIRECTORY
1085setup: prefix: 7/
1086EOF
1087        test_repo 7 "$TRASH_DIRECTORY/7/.git" ..
1088'
1089
1090test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=.. at root' '
1091        cat >7/expected <<EOF &&
1092setup: git_dir: $TRASH_DIRECTORY/7/.git
1093setup: worktree: $TRASH_DIRECTORY
1094setup: cwd: $TRASH_DIRECTORY
1095setup: prefix: 7/
1096EOF
1097        test_repo 7 "$TRASH_DIRECTORY/7/.git" "$TRASH_DIRECTORY"
1098'
1099
1100test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' '
1101        cat >7/sub/sub/expected <<EOF &&
1102setup: git_dir: $TRASH_DIRECTORY/7/.git
1103setup: worktree: $TRASH_DIRECTORY
1104setup: cwd: $TRASH_DIRECTORY
1105setup: prefix: 7/sub/sub/
1106EOF
1107        test_repo 7/sub/sub ../../.git "$TRASH_DIRECTORY"
1108'
1109
1110test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' '
1111        cat >7/sub/sub/expected <<EOF &&
1112setup: git_dir: $TRASH_DIRECTORY/7/.git
1113setup: worktree: $TRASH_DIRECTORY
1114setup: cwd: $TRASH_DIRECTORY
1115setup: prefix: 7/sub/sub/
1116EOF
1117        test_repo 7/sub/sub ../../.git ../../..
1118'
1119
1120test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' '
1121        cat >7/sub/sub/expected <<EOF &&
1122setup: git_dir: $TRASH_DIRECTORY/7/.git
1123setup: worktree: $TRASH_DIRECTORY
1124setup: cwd: $TRASH_DIRECTORY
1125setup: prefix: 7/sub/sub/
1126EOF
1127        test_repo 7/sub/sub "$TRASH_DIRECTORY/7/.git" ../../../
1128'
1129
1130test_expect_success '#7: GIT_DIR, GIT_WORK_TREE=.. in subdir' '
1131        cat >7/sub/sub/expected <<EOF &&
1132setup: git_dir: $TRASH_DIRECTORY/7/.git
1133setup: worktree: $TRASH_DIRECTORY
1134setup: cwd: $TRASH_DIRECTORY
1135setup: prefix: 7/sub/sub/
1136EOF
1137        test_repo 7/sub/sub "$TRASH_DIRECTORY/7/.git" "$TRASH_DIRECTORY"
1138'
1139
1140#
1141# case #8
1142#
1143############################################################
1144#
1145# Input:
1146#
1147#  - GIT_WORK_TREE is not set
1148#  - GIT_DIR is not set
1149#  - core.worktree is not set
1150#  - .git is a file
1151#  - core.bare is not set, cwd is outside .git
1152#
1153# Output:
1154#
1155# #0 except that git_dir is set by .git file
1156
1157test_expect_success '#8: setup' '
1158        sane_unset GIT_DIR GIT_WORK_TREE &&
1159        mkdir 8 8/sub &&
1160        cd 8 &&
1161        git init &&
1162        mv .git ../8.git &&
1163        echo gitdir: ../8.git >.git &&
1164        cd ..
1165'
1166
1167test_expect_success '#8: at root' '
1168        cat >8/expected <<EOF &&
1169setup: git_dir: $TRASH_DIRECTORY/8.git
1170setup: worktree: $TRASH_DIRECTORY/8
1171setup: cwd: $TRASH_DIRECTORY/8
1172setup: prefix: (null)
1173EOF
1174        test_repo 8
1175'
1176
1177test_expect_success '#8: in subdir' '
1178        cat >8/sub/expected <<EOF &&
1179setup: git_dir: $TRASH_DIRECTORY/8.git
1180setup: worktree: $TRASH_DIRECTORY/8
1181setup: cwd: $TRASH_DIRECTORY/8
1182setup: prefix: sub/
1183EOF
1184        test_repo 8/sub
1185'
1186
1187#
1188# case #9
1189#
1190############################################################
1191#
1192# Input:
1193#
1194#  - GIT_WORK_TREE is set
1195#  - GIT_DIR is not set
1196#  - core.worktree is not set
1197#  - .git is a file
1198#  - core.bare is not set, cwd is outside .git
1199#
1200# Output:
1201#
1202# #1 except that git_dir is set by .git file
1203
1204test_expect_success '#9: setup' '
1205        sane_unset GIT_DIR GIT_WORK_TREE &&
1206        mkdir 9 9/sub 9.wt 9.wt/sub 9/wt 9/wt/sub &&
1207        cd 9 &&
1208        git init &&
1209        mv .git ../9.git &&
1210        echo gitdir: ../9.git >.git &&
1211        GIT_WORK_TREE=non-existent &&
1212        export GIT_WORK_TREE &&
1213        cd ..
1214'
1215
1216test_expect_success '#9: at root' '
1217        cat >9/expected <<EOF &&
1218setup: git_dir: $TRASH_DIRECTORY/9.git
1219setup: worktree: $TRASH_DIRECTORY/9
1220setup: cwd: $TRASH_DIRECTORY/9
1221setup: prefix: (null)
1222EOF
1223        test_repo 9
1224'
1225
1226test_expect_success '#9: in subdir' '
1227        cat >9/sub/expected <<EOF &&
1228setup: git_dir: $TRASH_DIRECTORY/9.git
1229setup: worktree: $TRASH_DIRECTORY/9
1230setup: cwd: $TRASH_DIRECTORY/9
1231setup: prefix: sub/
1232EOF
1233        test_repo 9/sub
1234'
1235
1236#
1237# case #10
1238#
1239############################################################
1240#
1241# Input:
1242#
1243#  - GIT_WORK_TREE is not set
1244#  - GIT_DIR is set
1245#  - core.worktree is not set
1246#  - .git is a file
1247#  - core.bare is not set, cwd is outside .git
1248#
1249# Output:
1250#
1251# #2 except that git_dir is set by .git file
1252
1253test_expect_success '#10: setup' '
1254        sane_unset GIT_DIR GIT_WORK_TREE &&
1255        mkdir 10 10/sub &&
1256        cd 10 &&
1257        git init &&
1258        mv .git ../10.git &&
1259        echo gitdir: ../10.git >.git &&
1260        cd ..
1261'
1262
1263test_expect_success '#10: at root' '
1264        cat >10/expected <<EOF &&
1265setup: git_dir: $TRASH_DIRECTORY/10.git
1266setup: worktree: $TRASH_DIRECTORY/10
1267setup: cwd: $TRASH_DIRECTORY/10
1268setup: prefix: (null)
1269EOF
1270        test_repo 10 "$TRASH_DIRECTORY/10/.git"
1271'
1272
1273test_expect_success '#10: in subdir' '
1274        cat >10/sub/expected <<EOF &&
1275setup: git_dir: $TRASH_DIRECTORY/10.git
1276setup: worktree: $TRASH_DIRECTORY/10/sub
1277setup: cwd: $TRASH_DIRECTORY/10/sub
1278setup: prefix: (null)
1279EOF
1280        test_repo 10/sub "$TRASH_DIRECTORY/10/.git"
1281'
1282
1283test_expect_success '#10: relative GIT_DIR at root' '
1284        cat >10/expected <<EOF &&
1285setup: git_dir: $TRASH_DIRECTORY/10.git
1286setup: worktree: $TRASH_DIRECTORY/10
1287setup: cwd: $TRASH_DIRECTORY/10
1288setup: prefix: (null)
1289EOF
1290        test_repo 10 .git
1291'
1292
1293test_expect_success '#10: relative GIT_DIR in subdir' '
1294        cat >10/sub/expected <<EOF &&
1295setup: git_dir: $TRASH_DIRECTORY/10.git
1296setup: worktree: $TRASH_DIRECTORY/10/sub
1297setup: cwd: $TRASH_DIRECTORY/10/sub
1298setup: prefix: (null)
1299EOF
1300        test_repo 10/sub ../.git
1301'
1302
1303#
1304# case #11
1305#
1306############################################################
1307#
1308# Input:
1309#
1310#  - GIT_WORK_TREE is set
1311#  - GIT_DIR is set
1312#  - core.worktree is not set
1313#  - .git is a file
1314#  - core.bare is not set, cwd is outside .git
1315#
1316# Output:
1317#
1318# #3 except that git_dir is set by .git file
1319
1320test_expect_success '#11: setup' '
1321        sane_unset GIT_DIR GIT_WORK_TREE &&
1322        mkdir 11 11/sub 11/sub/sub 11.wt 11.wt/sub 11/wt 11/wt/sub &&
1323        cd 11 &&
1324        git init &&
1325        mv .git ../11.git &&
1326        echo gitdir: ../11.git >.git &&
1327        cd ..
1328'
1329
1330test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=root at root' '
1331        cat >11/expected <<EOF &&
1332setup: git_dir: $TRASH_DIRECTORY/11.git
1333setup: worktree: $TRASH_DIRECTORY/11
1334setup: cwd: $TRASH_DIRECTORY/11
1335setup: prefix: (null)
1336EOF
1337        test_repo 11 .git "$TRASH_DIRECTORY/11"
1338'
1339
1340test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' '
1341        cat >11/expected <<EOF &&
1342setup: git_dir: $TRASH_DIRECTORY/11.git
1343setup: worktree: $TRASH_DIRECTORY/11
1344setup: cwd: $TRASH_DIRECTORY/11
1345setup: prefix: (null)
1346EOF
1347        test_repo 11 .git .
1348'
1349
1350test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=root at root' '
1351        cat >11/expected <<EOF &&
1352setup: git_dir: $TRASH_DIRECTORY/11.git
1353setup: worktree: $TRASH_DIRECTORY/11
1354setup: cwd: $TRASH_DIRECTORY/11
1355setup: prefix: (null)
1356EOF
1357        test_repo 11 "$TRASH_DIRECTORY/11/.git" "$TRASH_DIRECTORY/11"
1358'
1359
1360test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=root(rel) at root' '
1361        cat >11/expected <<EOF &&
1362setup: git_dir: $TRASH_DIRECTORY/11.git
1363setup: worktree: $TRASH_DIRECTORY/11
1364setup: cwd: $TRASH_DIRECTORY/11
1365setup: prefix: (null)
1366EOF
1367        test_repo 11 "$TRASH_DIRECTORY/11/.git" .
1368'
1369
1370test_expect_success '#11: GIT_DIR(rel), GIT_WORKTREE=root in subdir' '
1371        cat >11/sub/sub/expected <<EOF &&
1372setup: git_dir: $TRASH_DIRECTORY/11.git
1373setup: worktree: $TRASH_DIRECTORY/11
1374setup: cwd: $TRASH_DIRECTORY/11
1375setup: prefix: sub/sub/
1376EOF
1377        test_repo 11/sub/sub ../../.git "$TRASH_DIRECTORY/11"
1378'
1379
1380test_expect_success '#11: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' '
1381        cat >11/sub/sub/expected <<EOF &&
1382setup: git_dir: $TRASH_DIRECTORY/11.git
1383setup: worktree: $TRASH_DIRECTORY/11
1384setup: cwd: $TRASH_DIRECTORY/11
1385setup: prefix: sub/sub/
1386EOF
1387        test_repo 11/sub/sub ../../.git ../..
1388'
1389
1390test_expect_success '#11: GIT_DIR, GIT_WORKTREE=root in subdir' '
1391        cat >11/sub/expected <<EOF &&
1392setup: git_dir: $TRASH_DIRECTORY/11.git
1393setup: worktree: $TRASH_DIRECTORY/11
1394setup: cwd: $TRASH_DIRECTORY/11
1395setup: prefix: sub/
1396EOF
1397        test_repo 11/sub "$TRASH_DIRECTORY/11/.git" "$TRASH_DIRECTORY/11"
1398'
1399
1400test_expect_success '#11: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' '
1401        cat >11/sub/sub/expected <<EOF &&
1402setup: git_dir: $TRASH_DIRECTORY/11.git
1403setup: worktree: $TRASH_DIRECTORY/11
1404setup: cwd: $TRASH_DIRECTORY/11
1405setup: prefix: sub/sub/
1406EOF
1407        test_repo 11/sub/sub "$TRASH_DIRECTORY/11/.git" ../..
1408'
1409
1410test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=wt at root' '
1411        cat >11/expected <<EOF &&
1412setup: git_dir: $TRASH_DIRECTORY/11.git
1413setup: worktree: $TRASH_DIRECTORY/11/wt
1414setup: cwd: $TRASH_DIRECTORY/11
1415setup: prefix: (null)
1416EOF
1417        test_repo 11 .git "$TRASH_DIRECTORY/11/wt"
1418'
1419
1420test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' '
1421        cat >11/expected <<EOF &&
1422setup: git_dir: $TRASH_DIRECTORY/11.git
1423setup: worktree: $TRASH_DIRECTORY/11/wt
1424setup: cwd: $TRASH_DIRECTORY/11
1425setup: prefix: (null)
1426EOF
1427        test_repo 11 .git wt
1428'
1429
1430test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' '
1431        cat >11/expected <<EOF &&
1432setup: git_dir: $TRASH_DIRECTORY/11.git
1433setup: worktree: $TRASH_DIRECTORY/11/wt
1434setup: cwd: $TRASH_DIRECTORY/11
1435setup: prefix: (null)
1436EOF
1437        test_repo 11 "$TRASH_DIRECTORY/11/.git" wt
1438'
1439
1440test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=wt at root' '
1441        cat >11/expected <<EOF &&
1442setup: git_dir: $TRASH_DIRECTORY/11.git
1443setup: worktree: $TRASH_DIRECTORY/11/wt
1444setup: cwd: $TRASH_DIRECTORY/11
1445setup: prefix: (null)
1446EOF
1447        test_repo 11 "$TRASH_DIRECTORY/11/.git" "$TRASH_DIRECTORY/11/wt"
1448'
1449
1450test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' '
1451        cat >11/sub/sub/expected <<EOF &&
1452setup: git_dir: $TRASH_DIRECTORY/11.git
1453setup: worktree: $TRASH_DIRECTORY/11/wt
1454setup: cwd: $TRASH_DIRECTORY/11/sub/sub
1455setup: prefix: (null)
1456EOF
1457        test_repo 11/sub/sub ../../.git "$TRASH_DIRECTORY/11/wt"
1458'
1459
1460test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' '
1461        cat >11/sub/sub/expected <<EOF &&
1462setup: git_dir: $TRASH_DIRECTORY/11.git
1463setup: worktree: $TRASH_DIRECTORY/11/wt
1464setup: cwd: $TRASH_DIRECTORY/11/sub/sub
1465setup: prefix: (null)
1466EOF
1467        test_repo 11/sub/sub ../../.git ../../wt
1468'
1469
1470test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' '
1471        cat >11/sub/sub/expected <<EOF &&
1472setup: git_dir: $TRASH_DIRECTORY/11.git
1473setup: worktree: $TRASH_DIRECTORY/11/wt
1474setup: cwd: $TRASH_DIRECTORY/11/sub/sub
1475setup: prefix: (null)
1476EOF
1477        test_repo 11/sub/sub "$TRASH_DIRECTORY/11/.git" ../../wt
1478'
1479
1480test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=wt in subdir' '
1481        cat >11/sub/sub/expected <<EOF &&
1482setup: git_dir: $TRASH_DIRECTORY/11.git
1483setup: worktree: $TRASH_DIRECTORY/11/wt
1484setup: cwd: $TRASH_DIRECTORY/11/sub/sub
1485setup: prefix: (null)
1486EOF
1487        test_repo 11/sub/sub "$TRASH_DIRECTORY/11/.git" "$TRASH_DIRECTORY/11/wt"
1488'
1489
1490test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=.. at root' '
1491        cat >11/expected <<EOF &&
1492setup: git_dir: $TRASH_DIRECTORY/11.git
1493setup: worktree: $TRASH_DIRECTORY
1494setup: cwd: $TRASH_DIRECTORY
1495setup: prefix: 11/
1496EOF
1497        test_repo 11 .git "$TRASH_DIRECTORY"
1498'
1499
1500test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' '
1501        cat >11/expected <<EOF &&
1502setup: git_dir: $TRASH_DIRECTORY/11.git
1503setup: worktree: $TRASH_DIRECTORY
1504setup: cwd: $TRASH_DIRECTORY
1505setup: prefix: 11/
1506EOF
1507        test_repo 11 .git ..
1508'
1509
1510test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=..(rel) at root' '
1511        cat >11/expected <<EOF &&
1512setup: git_dir: $TRASH_DIRECTORY/11.git
1513setup: worktree: $TRASH_DIRECTORY
1514setup: cwd: $TRASH_DIRECTORY
1515setup: prefix: 11/
1516EOF
1517        test_repo 11 "$TRASH_DIRECTORY/11/.git" ..
1518'
1519
1520test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=.. at root' '
1521        cat >11/expected <<EOF &&
1522setup: git_dir: $TRASH_DIRECTORY/11.git
1523setup: worktree: $TRASH_DIRECTORY
1524setup: cwd: $TRASH_DIRECTORY
1525setup: prefix: 11/
1526EOF
1527        test_repo 11 "$TRASH_DIRECTORY/11/.git" "$TRASH_DIRECTORY"
1528'
1529
1530test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' '
1531        cat >11/sub/sub/expected <<EOF &&
1532setup: git_dir: $TRASH_DIRECTORY/11.git
1533setup: worktree: $TRASH_DIRECTORY
1534setup: cwd: $TRASH_DIRECTORY
1535setup: prefix: 11/sub/sub/
1536EOF
1537        test_repo 11/sub/sub ../../.git "$TRASH_DIRECTORY"
1538'
1539
1540test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' '
1541        cat >11/sub/sub/expected <<EOF &&
1542setup: git_dir: $TRASH_DIRECTORY/11.git
1543setup: worktree: $TRASH_DIRECTORY
1544setup: cwd: $TRASH_DIRECTORY
1545setup: prefix: 11/sub/sub/
1546EOF
1547        test_repo 11/sub/sub ../../.git ../../..
1548'
1549
1550test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' '
1551        cat >11/sub/sub/expected <<EOF &&
1552setup: git_dir: $TRASH_DIRECTORY/11.git
1553setup: worktree: $TRASH_DIRECTORY
1554setup: cwd: $TRASH_DIRECTORY
1555setup: prefix: 11/sub/sub/
1556EOF
1557        test_repo 11/sub/sub "$TRASH_DIRECTORY/11/.git" ../../../
1558'
1559
1560test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=.. in subdir' '
1561        cat >11/sub/sub/expected <<EOF &&
1562setup: git_dir: $TRASH_DIRECTORY/11.git
1563setup: worktree: $TRASH_DIRECTORY
1564setup: cwd: $TRASH_DIRECTORY
1565setup: prefix: 11/sub/sub/
1566EOF
1567        test_repo 11/sub/sub "$TRASH_DIRECTORY/11/.git" "$TRASH_DIRECTORY"
1568'
1569
1570#
1571# case #12
1572#
1573############################################################
1574#
1575# Input:
1576#
1577#  - GIT_WORK_TREE is not set
1578#  - GIT_DIR is not set
1579#  - core.worktree is set
1580#  - .git is a file
1581#  - core.bare is not set, cwd is outside .git
1582#
1583# Output:
1584#
1585# #4 except that git_dir is set by .git file
1586
1587
1588test_expect_success '#12: setup' '
1589        sane_unset GIT_DIR GIT_WORK_TREE &&
1590        mkdir 12 12/sub 12/sub/sub 12.wt 12.wt/sub 12/wt 12/wt/sub &&
1591        cd 12 &&
1592        git init &&
1593        git config core.worktree non-existent &&
1594        mv .git ../12.git &&
1595        echo gitdir: ../12.git >.git &&
1596        cd ..
1597'
1598
1599test_expect_success '#12: at root' '
1600        cat >12/expected <<EOF &&
1601setup: git_dir: $TRASH_DIRECTORY/12.git
1602setup: worktree: $TRASH_DIRECTORY/12
1603setup: cwd: $TRASH_DIRECTORY/12
1604setup: prefix: (null)
1605EOF
1606        test_repo 12
1607'
1608
1609test_expect_success '#12: in subdir' '
1610        cat >12/sub/expected <<EOF &&
1611setup: git_dir: $TRASH_DIRECTORY/12.git
1612setup: worktree: $TRASH_DIRECTORY/12
1613setup: cwd: $TRASH_DIRECTORY/12
1614setup: prefix: sub/
1615EOF
1616        test_repo 12/sub
1617'
1618
1619#
1620# case #13
1621#
1622############################################################
1623#
1624# Input:
1625#
1626#  - GIT_WORK_TREE is set
1627#  - GIT_DIR is not set
1628#  - core.worktree is set
1629#  - .git is a file
1630#  - core.bare is not set, cwd is outside .git
1631#
1632# Output:
1633#
1634# #5 except that git_dir is set by .git file
1635
1636test_expect_success '#13: setup' '
1637        sane_unset GIT_DIR GIT_WORK_TREE &&
1638        mkdir 13 13/sub 13/sub/sub 13.wt 13.wt/sub 13/wt 13/wt/sub &&
1639        cd 13 &&
1640        git init &&
1641        git config core.worktree non-existent &&
1642        GIT_WORK_TREE=non-existent-too &&
1643        export GIT_WORK_TREE &&
1644        mv .git ../13.git &&
1645        echo gitdir: ../13.git >.git &&
1646        cd ..
1647'
1648
1649test_expect_success '#13: at root' '
1650        cat >13/expected <<EOF &&
1651setup: git_dir: $TRASH_DIRECTORY/13.git
1652setup: worktree: $TRASH_DIRECTORY/13
1653setup: cwd: $TRASH_DIRECTORY/13
1654setup: prefix: (null)
1655EOF
1656        test_repo 13
1657'
1658
1659test_expect_success '#13: in subdir' '
1660        cat >13/sub/expected <<EOF &&
1661setup: git_dir: $TRASH_DIRECTORY/13.git
1662setup: worktree: $TRASH_DIRECTORY/13
1663setup: cwd: $TRASH_DIRECTORY/13
1664setup: prefix: sub/
1665EOF
1666        test_repo 13/sub
1667'
1668
1669#
1670# case #14
1671#
1672############################################################
1673#
1674# Input:
1675#
1676#  - GIT_WORK_TREE is not set
1677#  - GIT_DIR is set
1678#  - core.worktree is set
1679#  - .git is a file
1680#  - core.bare is not set, cwd is outside .git
1681#
1682# Output:
1683#
1684# #6 except that git_dir is set by .git file
1685
1686test_expect_success '#14: setup' '
1687        sane_unset GIT_DIR GIT_WORK_TREE &&
1688        mkdir 14 14/sub 14/sub/sub 14.wt 14.wt/sub 14/wt 14/wt/sub &&
1689        cd 14 &&
1690        git init &&
1691        mv .git ../14.git &&
1692        echo gitdir: ../14.git >.git &&
1693        cd ..
1694'
1695
1696test_expect_success '#14: GIT_DIR(rel), core.worktree=../14 at root' '
1697        cat >14/expected <<EOF &&
1698setup: git_dir: $TRASH_DIRECTORY/14.git
1699setup: worktree: $TRASH_DIRECTORY/14
1700setup: cwd: $TRASH_DIRECTORY/14
1701setup: prefix: (null)
1702EOF
1703        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY/14" &&
1704        test_repo 14 .git
1705'
1706
1707test_expect_success '#14: GIT_DIR(rel), core.worktree=../14(rel) at root' '
1708        cat >14/expected <<EOF &&
1709setup: git_dir: $TRASH_DIRECTORY/14.git
1710setup: worktree: $TRASH_DIRECTORY/14
1711setup: cwd: $TRASH_DIRECTORY/14
1712setup: prefix: (null)
1713EOF
1714        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree ../14 &&
1715        test_repo 14 .git
1716'
1717
1718test_expect_success '#14: GIT_DIR, core.worktree=../14 at root' '
1719        cat >14/expected <<EOF &&
1720setup: git_dir: $TRASH_DIRECTORY/14.git
1721setup: worktree: $TRASH_DIRECTORY/14
1722setup: cwd: $TRASH_DIRECTORY/14
1723setup: prefix: (null)
1724EOF
1725        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY/14" &&
1726        test_repo 14 "$TRASH_DIRECTORY/14/.git"
1727'
1728
1729test_expect_success '#14: GIT_DIR, core.worktree=../14(rel) at root' '
1730        cat >14/expected <<EOF &&
1731setup: git_dir: $TRASH_DIRECTORY/14.git
1732setup: worktree: $TRASH_DIRECTORY/14
1733setup: cwd: $TRASH_DIRECTORY/14
1734setup: prefix: (null)
1735EOF
1736        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree ../14 &&
1737        test_repo 14 "$TRASH_DIRECTORY/14/.git"
1738'
1739
1740test_expect_success '#14: GIT_DIR(rel), core.worktree=../14 in subdir' '
1741        cat >14/sub/sub/expected <<EOF &&
1742setup: git_dir: $TRASH_DIRECTORY/14.git
1743setup: worktree: $TRASH_DIRECTORY/14
1744setup: cwd: $TRASH_DIRECTORY/14
1745setup: prefix: sub/sub/
1746EOF
1747        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY/14" &&
1748        test_repo 14/sub/sub ../../.git
1749'
1750
1751test_expect_success '#14: GIT_DIR(rel), core.worktree=../14(rel) in subdir' '
1752        cat >14/sub/sub/expected <<EOF &&
1753setup: git_dir: $TRASH_DIRECTORY/14.git
1754setup: worktree: $TRASH_DIRECTORY/14
1755setup: cwd: $TRASH_DIRECTORY/14
1756setup: prefix: sub/sub/
1757EOF
1758        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree ../14 &&
1759        test_repo 14/sub/sub ../../.git
1760'
1761
1762test_expect_success '#14: GIT_DIR, core.worktree=../14 in subdir' '
1763        cat >14/sub/expected <<EOF &&
1764setup: git_dir: $TRASH_DIRECTORY/14.git
1765setup: worktree: $TRASH_DIRECTORY/14
1766setup: cwd: $TRASH_DIRECTORY/14
1767setup: prefix: sub/
1768EOF
1769        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY/14" &&
1770        test_repo 14/sub "$TRASH_DIRECTORY/14/.git"
1771'
1772
1773test_expect_success '#14: GIT_DIR, core.worktree=../14(rel) in subdir' '
1774        cat >14/sub/sub/expected <<EOF &&
1775setup: git_dir: $TRASH_DIRECTORY/14.git
1776setup: worktree: $TRASH_DIRECTORY/14
1777setup: cwd: $TRASH_DIRECTORY/14
1778setup: prefix: sub/sub/
1779EOF
1780        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree ../14 &&
1781        test_repo 14/sub/sub "$TRASH_DIRECTORY/14/.git"
1782'
1783
1784test_expect_success '#14: GIT_DIR(rel), core.worktree=../14/wt at root' '
1785        cat >14/expected <<EOF &&
1786setup: git_dir: $TRASH_DIRECTORY/14.git
1787setup: worktree: $TRASH_DIRECTORY/14/wt
1788setup: cwd: $TRASH_DIRECTORY/14
1789setup: prefix: (null)
1790EOF
1791        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY/14/wt" &&
1792        test_repo 14 .git
1793'
1794
1795test_expect_success '#14: GIT_DIR(rel), core.worktree=../14/wt(rel) at root' '
1796        cat >14/expected <<EOF &&
1797setup: git_dir: $TRASH_DIRECTORY/14.git
1798setup: worktree: $TRASH_DIRECTORY/14/wt
1799setup: cwd: $TRASH_DIRECTORY/14
1800setup: prefix: (null)
1801EOF
1802        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree ../14/wt &&
1803        test_repo 14 .git
1804'
1805
1806test_expect_success '#14: GIT_DIR, core.worktree=../14/wt(rel) at root' '
1807        cat >14/expected <<EOF &&
1808setup: git_dir: $TRASH_DIRECTORY/14.git
1809setup: worktree: $TRASH_DIRECTORY/14/wt
1810setup: cwd: $TRASH_DIRECTORY/14
1811setup: prefix: (null)
1812EOF
1813        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree ../14/wt &&
1814        test_repo 14 "$TRASH_DIRECTORY/14/.git"
1815'
1816
1817test_expect_success '#14: GIT_DIR, core.worktree=../14/wt at root' '
1818        cat >14/expected <<EOF &&
1819setup: git_dir: $TRASH_DIRECTORY/14.git
1820setup: worktree: $TRASH_DIRECTORY/14/wt
1821setup: cwd: $TRASH_DIRECTORY/14
1822setup: prefix: (null)
1823EOF
1824        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY/14/wt" &&
1825        test_repo 14 "$TRASH_DIRECTORY/14/.git"
1826'
1827
1828test_expect_success '#14: GIT_DIR(rel), core.worktree=../14/wt in subdir' '
1829        cat >14/sub/sub/expected <<EOF &&
1830setup: git_dir: $TRASH_DIRECTORY/14.git
1831setup: worktree: $TRASH_DIRECTORY/14/wt
1832setup: cwd: $TRASH_DIRECTORY/14/sub/sub
1833setup: prefix: (null)
1834EOF
1835        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY/14/wt" &&
1836        test_repo 14/sub/sub ../../.git
1837'
1838
1839test_expect_success '#14: GIT_DIR(rel), core.worktree=../14/wt(rel) in subdir' '
1840        cat >14/sub/sub/expected <<EOF &&
1841setup: git_dir: $TRASH_DIRECTORY/14.git
1842setup: worktree: $TRASH_DIRECTORY/14/wt
1843setup: cwd: $TRASH_DIRECTORY/14/sub/sub
1844setup: prefix: (null)
1845EOF
1846        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree ../14/wt &&
1847        test_repo 14/sub/sub ../../.git
1848'
1849
1850test_expect_success '#14: GIT_DIR, core.worktree=../14/wt(rel) in subdir' '
1851        cat >14/sub/sub/expected <<EOF &&
1852setup: git_dir: $TRASH_DIRECTORY/14.git
1853setup: worktree: $TRASH_DIRECTORY/14/wt
1854setup: cwd: $TRASH_DIRECTORY/14/sub/sub
1855setup: prefix: (null)
1856EOF
1857        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree ../14/wt &&
1858        test_repo 14/sub/sub "$TRASH_DIRECTORY/14/.git"
1859'
1860
1861test_expect_success '#14: GIT_DIR, core.worktree=../14/wt in subdir' '
1862        cat >14/sub/sub/expected <<EOF &&
1863setup: git_dir: $TRASH_DIRECTORY/14.git
1864setup: worktree: $TRASH_DIRECTORY/14/wt
1865setup: cwd: $TRASH_DIRECTORY/14/sub/sub
1866setup: prefix: (null)
1867EOF
1868        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY/14/wt" &&
1869        test_repo 14/sub/sub "$TRASH_DIRECTORY/14/.git"
1870'
1871
1872test_expect_success '#14: GIT_DIR(rel), core.worktree=.. at root' '
1873        cat >14/expected <<EOF &&
1874setup: git_dir: $TRASH_DIRECTORY/14.git
1875setup: worktree: $TRASH_DIRECTORY
1876setup: cwd: $TRASH_DIRECTORY
1877setup: prefix: 14/
1878EOF
1879        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY" &&
1880        test_repo 14 .git
1881'
1882
1883test_expect_success '#14: GIT_DIR(rel), core.worktree=..(rel) at root' '
1884        cat >14/expected <<EOF &&
1885setup: git_dir: $TRASH_DIRECTORY/14.git
1886setup: worktree: $TRASH_DIRECTORY
1887setup: cwd: $TRASH_DIRECTORY
1888setup: prefix: 14/
1889EOF
1890        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree .. &&
1891        test_repo 14 .git
1892'
1893
1894test_expect_success '#14: GIT_DIR, core.worktree=..(rel) at root' '
1895        cat >14/expected <<EOF &&
1896setup: git_dir: $TRASH_DIRECTORY/14.git
1897setup: worktree: $TRASH_DIRECTORY
1898setup: cwd: $TRASH_DIRECTORY
1899setup: prefix: 14/
1900EOF
1901        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree .. &&
1902        test_repo 14 "$TRASH_DIRECTORY/14/.git"
1903'
1904
1905test_expect_success '#14: GIT_DIR, core.worktree=.. at root' '
1906        cat >14/expected <<EOF &&
1907setup: git_dir: $TRASH_DIRECTORY/14.git
1908setup: worktree: $TRASH_DIRECTORY
1909setup: cwd: $TRASH_DIRECTORY
1910setup: prefix: 14/
1911EOF
1912        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY" &&
1913        test_repo 14 "$TRASH_DIRECTORY/14/.git"
1914'
1915
1916test_expect_success '#14: GIT_DIR(rel), core.worktree=.. in subdir' '
1917        cat >14/sub/sub/expected <<EOF &&
1918setup: git_dir: $TRASH_DIRECTORY/14.git
1919setup: worktree: $TRASH_DIRECTORY
1920setup: cwd: $TRASH_DIRECTORY
1921setup: prefix: 14/sub/sub/
1922EOF
1923        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY" &&
1924        test_repo 14/sub/sub ../../.git
1925'
1926
1927test_expect_success '#14: GIT_DIR(rel), core.worktree=..(rel) in subdir' '
1928        cat >14/sub/sub/expected <<EOF &&
1929setup: git_dir: $TRASH_DIRECTORY/14.git
1930setup: worktree: $TRASH_DIRECTORY
1931setup: cwd: $TRASH_DIRECTORY
1932setup: prefix: 14/sub/sub/
1933EOF
1934        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree .. &&
1935        test_repo 14/sub/sub ../../.git
1936'
1937
1938test_expect_success '#14: GIT_DIR, core.worktree=..(rel) in subdir' '
1939        cat >14/sub/sub/expected <<EOF &&
1940setup: git_dir: $TRASH_DIRECTORY/14.git
1941setup: worktree: $TRASH_DIRECTORY
1942setup: cwd: $TRASH_DIRECTORY
1943setup: prefix: 14/sub/sub/
1944EOF
1945        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree .. &&
1946        test_repo 14/sub/sub "$TRASH_DIRECTORY/14/.git"
1947'
1948
1949test_expect_success '#14: GIT_DIR, core.worktree=.. in subdir' '
1950        cat >14/sub/sub/expected <<EOF &&
1951setup: git_dir: $TRASH_DIRECTORY/14.git
1952setup: worktree: $TRASH_DIRECTORY
1953setup: cwd: $TRASH_DIRECTORY
1954setup: prefix: 14/sub/sub/
1955EOF
1956        git config --file="$TRASH_DIRECTORY/14.git/config" core.worktree "$TRASH_DIRECTORY" &&
1957        test_repo 14/sub/sub "$TRASH_DIRECTORY/14/.git"
1958'
1959
1960#
1961# case #15
1962#
1963############################################################
1964#
1965# Input:
1966#
1967#  - GIT_WORK_TREE is set
1968#  - GIT_DIR is set
1969#  - core.worktree is set
1970#  - .git is a file
1971#  - core.bare is not set, cwd is outside .git
1972#
1973# Output:
1974#
1975# #7 except that git_dir is set by .git file
1976
1977test_expect_success '#15: setup' '
1978        sane_unset GIT_DIR GIT_WORK_TREE &&
1979        mkdir 15 15/sub 15/sub/sub 15.wt 15.wt/sub 15/wt 15/wt/sub &&
1980        cd 15 &&
1981        git init &&
1982        git config core.worktree non-existent &&
1983        mv .git ../15.git &&
1984        echo gitdir: ../15.git >.git &&
1985        cd ..
1986'
1987
1988test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=root at root' '
1989        cat >15/expected <<EOF &&
1990setup: git_dir: $TRASH_DIRECTORY/15.git
1991setup: worktree: $TRASH_DIRECTORY/15
1992setup: cwd: $TRASH_DIRECTORY/15
1993setup: prefix: (null)
1994EOF
1995        test_repo 15 .git "$TRASH_DIRECTORY/15"
1996'
1997
1998test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' '
1999        cat >15/expected <<EOF &&
2000setup: git_dir: $TRASH_DIRECTORY/15.git
2001setup: worktree: $TRASH_DIRECTORY/15
2002setup: cwd: $TRASH_DIRECTORY/15
2003setup: prefix: (null)
2004EOF
2005        test_repo 15 .git .
2006'
2007
2008test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=root at root' '
2009        cat >15/expected <<EOF &&
2010setup: git_dir: $TRASH_DIRECTORY/15.git
2011setup: worktree: $TRASH_DIRECTORY/15
2012setup: cwd: $TRASH_DIRECTORY/15
2013setup: prefix: (null)
2014EOF
2015        test_repo 15 "$TRASH_DIRECTORY/15/.git" "$TRASH_DIRECTORY/15"
2016'
2017
2018test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=root(rel) at root' '
2019        cat >15/expected <<EOF &&
2020setup: git_dir: $TRASH_DIRECTORY/15.git
2021setup: worktree: $TRASH_DIRECTORY/15
2022setup: cwd: $TRASH_DIRECTORY/15
2023setup: prefix: (null)
2024EOF
2025        test_repo 15 "$TRASH_DIRECTORY/15/.git" .
2026'
2027
2028test_expect_success '#15: GIT_DIR(rel), GIT_WORKTREE=root in subdir' '
2029        cat >15/sub/sub/expected <<EOF &&
2030setup: git_dir: $TRASH_DIRECTORY/15.git
2031setup: worktree: $TRASH_DIRECTORY/15
2032setup: cwd: $TRASH_DIRECTORY/15
2033setup: prefix: sub/sub/
2034EOF
2035        test_repo 15/sub/sub ../../.git "$TRASH_DIRECTORY/15"
2036'
2037
2038test_expect_success '#15: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' '
2039        cat >15/sub/sub/expected <<EOF &&
2040setup: git_dir: $TRASH_DIRECTORY/15.git
2041setup: worktree: $TRASH_DIRECTORY/15
2042setup: cwd: $TRASH_DIRECTORY/15
2043setup: prefix: sub/sub/
2044EOF
2045        test_repo 15/sub/sub ../../.git ../..
2046'
2047
2048test_expect_success '#15: GIT_DIR, GIT_WORKTREE=root in subdir' '
2049        cat >15/sub/expected <<EOF &&
2050setup: git_dir: $TRASH_DIRECTORY/15.git
2051setup: worktree: $TRASH_DIRECTORY/15
2052setup: cwd: $TRASH_DIRECTORY/15
2053setup: prefix: sub/
2054EOF
2055        test_repo 15/sub "$TRASH_DIRECTORY/15/.git" "$TRASH_DIRECTORY/15"
2056'
2057
2058test_expect_success '#15: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' '
2059        cat >15/sub/sub/expected <<EOF &&
2060setup: git_dir: $TRASH_DIRECTORY/15.git
2061setup: worktree: $TRASH_DIRECTORY/15
2062setup: cwd: $TRASH_DIRECTORY/15
2063setup: prefix: sub/sub/
2064EOF
2065        test_repo 15/sub/sub "$TRASH_DIRECTORY/15/.git" ../..
2066'
2067
2068test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=wt at root' '
2069        cat >15/expected <<EOF &&
2070setup: git_dir: $TRASH_DIRECTORY/15.git
2071setup: worktree: $TRASH_DIRECTORY/15/wt
2072setup: cwd: $TRASH_DIRECTORY/15
2073setup: prefix: (null)
2074EOF
2075        test_repo 15 .git "$TRASH_DIRECTORY/15/wt"
2076'
2077
2078test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' '
2079        cat >15/expected <<EOF &&
2080setup: git_dir: $TRASH_DIRECTORY/15.git
2081setup: worktree: $TRASH_DIRECTORY/15/wt
2082setup: cwd: $TRASH_DIRECTORY/15
2083setup: prefix: (null)
2084EOF
2085        test_repo 15 .git wt
2086'
2087
2088test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' '
2089        cat >15/expected <<EOF &&
2090setup: git_dir: $TRASH_DIRECTORY/15.git
2091setup: worktree: $TRASH_DIRECTORY/15/wt
2092setup: cwd: $TRASH_DIRECTORY/15
2093setup: prefix: (null)
2094EOF
2095        test_repo 15 "$TRASH_DIRECTORY/15/.git" wt
2096'
2097
2098test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=wt at root' '
2099        cat >15/expected <<EOF &&
2100setup: git_dir: $TRASH_DIRECTORY/15.git
2101setup: worktree: $TRASH_DIRECTORY/15/wt
2102setup: cwd: $TRASH_DIRECTORY/15
2103setup: prefix: (null)
2104EOF
2105        test_repo 15 "$TRASH_DIRECTORY/15/.git" "$TRASH_DIRECTORY/15/wt"
2106'
2107
2108test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' '
2109        cat >15/sub/sub/expected <<EOF &&
2110setup: git_dir: $TRASH_DIRECTORY/15.git
2111setup: worktree: $TRASH_DIRECTORY/15/wt
2112setup: cwd: $TRASH_DIRECTORY/15/sub/sub
2113setup: prefix: (null)
2114EOF
2115        test_repo 15/sub/sub ../../.git "$TRASH_DIRECTORY/15/wt"
2116'
2117
2118test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' '
2119        cat >15/sub/sub/expected <<EOF &&
2120setup: git_dir: $TRASH_DIRECTORY/15.git
2121setup: worktree: $TRASH_DIRECTORY/15/wt
2122setup: cwd: $TRASH_DIRECTORY/15/sub/sub
2123setup: prefix: (null)
2124EOF
2125        test_repo 15/sub/sub ../../.git ../../wt
2126'
2127
2128test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' '
2129        cat >15/sub/sub/expected <<EOF &&
2130setup: git_dir: $TRASH_DIRECTORY/15.git
2131setup: worktree: $TRASH_DIRECTORY/15/wt
2132setup: cwd: $TRASH_DIRECTORY/15/sub/sub
2133setup: prefix: (null)
2134EOF
2135        test_repo 15/sub/sub "$TRASH_DIRECTORY/15/.git" ../../wt
2136'
2137
2138test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=wt in subdir' '
2139        cat >15/sub/sub/expected <<EOF &&
2140setup: git_dir: $TRASH_DIRECTORY/15.git
2141setup: worktree: $TRASH_DIRECTORY/15/wt
2142setup: cwd: $TRASH_DIRECTORY/15/sub/sub
2143setup: prefix: (null)
2144EOF
2145        test_repo 15/sub/sub "$TRASH_DIRECTORY/15/.git" "$TRASH_DIRECTORY/15/wt"
2146'
2147
2148test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=.. at root' '
2149        cat >15/expected <<EOF &&
2150setup: git_dir: $TRASH_DIRECTORY/15.git
2151setup: worktree: $TRASH_DIRECTORY
2152setup: cwd: $TRASH_DIRECTORY
2153setup: prefix: 15/
2154EOF
2155        test_repo 15 .git "$TRASH_DIRECTORY"
2156'
2157
2158test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' '
2159        cat >15/expected <<EOF &&
2160setup: git_dir: $TRASH_DIRECTORY/15.git
2161setup: worktree: $TRASH_DIRECTORY
2162setup: cwd: $TRASH_DIRECTORY
2163setup: prefix: 15/
2164EOF
2165        test_repo 15 .git ..
2166'
2167
2168test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=..(rel) at root' '
2169        cat >15/expected <<EOF &&
2170setup: git_dir: $TRASH_DIRECTORY/15.git
2171setup: worktree: $TRASH_DIRECTORY
2172setup: cwd: $TRASH_DIRECTORY
2173setup: prefix: 15/
2174EOF
2175        test_repo 15 "$TRASH_DIRECTORY/15/.git" ..
2176'
2177
2178test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=.. at root' '
2179        cat >15/expected <<EOF &&
2180setup: git_dir: $TRASH_DIRECTORY/15.git
2181setup: worktree: $TRASH_DIRECTORY
2182setup: cwd: $TRASH_DIRECTORY
2183setup: prefix: 15/
2184EOF
2185        test_repo 15 "$TRASH_DIRECTORY/15/.git" "$TRASH_DIRECTORY"
2186'
2187
2188test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' '
2189        cat >15/sub/sub/expected <<EOF &&
2190setup: git_dir: $TRASH_DIRECTORY/15.git
2191setup: worktree: $TRASH_DIRECTORY
2192setup: cwd: $TRASH_DIRECTORY
2193setup: prefix: 15/sub/sub/
2194EOF
2195        test_repo 15/sub/sub ../../.git "$TRASH_DIRECTORY"
2196'
2197
2198test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' '
2199        cat >15/sub/sub/expected <<EOF &&
2200setup: git_dir: $TRASH_DIRECTORY/15.git
2201setup: worktree: $TRASH_DIRECTORY
2202setup: cwd: $TRASH_DIRECTORY
2203setup: prefix: 15/sub/sub/
2204EOF
2205        test_repo 15/sub/sub ../../.git ../../..
2206'
2207
2208test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' '
2209        cat >15/sub/sub/expected <<EOF &&
2210setup: git_dir: $TRASH_DIRECTORY/15.git
2211setup: worktree: $TRASH_DIRECTORY
2212setup: cwd: $TRASH_DIRECTORY
2213setup: prefix: 15/sub/sub/
2214EOF
2215        test_repo 15/sub/sub "$TRASH_DIRECTORY/15/.git" ../../../
2216'
2217
2218test_expect_success '#15: GIT_DIR, GIT_WORK_TREE=.. in subdir' '
2219        cat >15/sub/sub/expected <<EOF &&
2220setup: git_dir: $TRASH_DIRECTORY/15.git
2221setup: worktree: $TRASH_DIRECTORY
2222setup: cwd: $TRASH_DIRECTORY
2223setup: prefix: 15/sub/sub/
2224EOF
2225        test_repo 15/sub/sub "$TRASH_DIRECTORY/15/.git" "$TRASH_DIRECTORY"
2226'
2227
2228#
2229# case #16.1
2230#
2231############################################################
2232#
2233# Input:
2234#
2235#  - GIT_WORK_TREE is not set
2236#  - GIT_DIR is not set
2237#  - core.worktree is not set
2238#  - .git is a directory
2239#  - cwd is inside .git
2240#
2241# Output:
2242#
2243#  - no worktree
2244#  - cwd is unchanged
2245#  - prefix is NULL
2246#  - git_dir is set
2247#  - cwd can't be outside worktree
2248
2249test_expect_success '#16.1: setup' '
2250        sane_unset GIT_DIR GIT_WORK_TREE &&
2251        mkdir 16 16/sub &&
2252        cd 16 &&
2253        git init &&
2254        mkdir .git/wt .git/wt/sub &&
2255        cd ..
2256'
2257
2258test_expect_success '#16.1: at .git' '
2259        cat >16/.git/expected <<EOF &&
2260setup: git_dir: .
2261setup: worktree: (null)
2262setup: cwd: $TRASH_DIRECTORY/16/.git
2263setup: prefix: (null)
2264EOF
2265        test_repo 16/.git
2266'
2267
2268test_expect_success '#16.1: in .git/wt' '
2269        cat >16/.git/wt/expected <<EOF &&
2270setup: git_dir: $TRASH_DIRECTORY/16/.git
2271setup: worktree: (null)
2272setup: cwd: $TRASH_DIRECTORY/16/.git/wt
2273setup: prefix: (null)
2274EOF
2275        test_repo 16/.git/wt
2276'
2277
2278test_expect_success '#16.1: in .git/wt/sub' '
2279        cat >16/.git/wt/sub/expected <<EOF &&
2280setup: git_dir: $TRASH_DIRECTORY/16/.git
2281setup: worktree: (null)
2282setup: cwd: $TRASH_DIRECTORY/16/.git/wt/sub
2283setup: prefix: (null)
2284EOF
2285        test_repo 16/.git/wt/sub
2286'
2287
2288#
2289# case #16.2
2290#
2291############################################################
2292#
2293# Input:
2294#
2295#  - GIT_WORK_TREE is not set
2296#  - GIT_DIR is not set
2297#  - core.worktree is not set
2298#  - .git is a directory
2299#  - core.bare is set
2300#
2301# Output:
2302#
2303#  - no worktree
2304#  - cwd is unchanged
2305#  - prefix is NULL
2306#  - git_dir is set
2307#  - cwd can't be outside worktree
2308
2309test_expect_success '#16.2: setup' '
2310        git config --file="$TRASH_DIRECTORY/16/.git/config" core.bare true
2311'
2312
2313test_expect_success '#16.2: at .git' '
2314        cat >16/.git/expected <<EOF &&
2315setup: git_dir: .
2316setup: worktree: (null)
2317setup: cwd: $TRASH_DIRECTORY/16/.git
2318setup: prefix: (null)
2319EOF
2320        test_repo 16/.git
2321'
2322
2323test_expect_success '#16.2: in .git/wt' '
2324        cat >16/.git/wt/expected <<EOF &&
2325setup: git_dir: $TRASH_DIRECTORY/16/.git
2326setup: worktree: (null)
2327setup: cwd: $TRASH_DIRECTORY/16/.git/wt
2328setup: prefix: (null)
2329EOF
2330        test_repo 16/.git/wt
2331'
2332
2333test_expect_success '#16.2: in .git/wt/sub' '
2334        cat >16/.git/wt/sub/expected <<EOF &&
2335setup: git_dir: $TRASH_DIRECTORY/16/.git
2336setup: worktree: (null)
2337setup: cwd: $TRASH_DIRECTORY/16/.git/wt/sub
2338setup: prefix: (null)
2339EOF
2340        test_repo 16/.git/wt/sub
2341'
2342
2343test_expect_success '#16.2: at root' '
2344        cat >16/expected <<EOF &&
2345setup: git_dir: .git
2346setup: worktree: (null)
2347setup: cwd: $TRASH_DIRECTORY/16
2348setup: prefix: (null)
2349EOF
2350        test_repo 16
2351'
2352
2353test_expect_success '#16.2: in subdir' '
2354        cat >16/sub/expected <<EOF &&
2355setup: git_dir: $TRASH_DIRECTORY/16/.git
2356setup: worktree: (null)
2357setup: cwd: $TRASH_DIRECTORY/16/sub
2358setup: prefix: (null)
2359EOF
2360        test_repo 16/sub
2361'
2362
2363#
2364# case #17.1
2365#
2366############################################################
2367#
2368# Input:
2369#
2370#  - GIT_WORK_TREE is set
2371#  - GIT_DIR is not set
2372#  - core.worktree is not set
2373#  - .git is a directory
2374#  - cwd is inside .git
2375#
2376# Output:
2377#
2378# GIT_WORK_TREE is ignored -> #16.1 (with warnings perhaps)
2379
2380test_expect_success '#17.1: setup' '
2381        sane_unset GIT_DIR GIT_WORK_TREE &&
2382        mkdir 17 17/sub &&
2383        cd 17 &&
2384        git init &&
2385        mkdir .git/wt .git/wt/sub &&
2386        GIT_WORK_TREE=non-existent &&
2387        export GIT_WORK_TREE &&
2388        cd ..
2389'
2390
2391test_expect_success '#17.1: at .git' '
2392        cat >17/.git/expected <<EOF &&
2393setup: git_dir: .
2394setup: worktree: (null)
2395setup: cwd: $TRASH_DIRECTORY/17/.git
2396setup: prefix: (null)
2397EOF
2398        test_repo 17/.git
2399'
2400
2401test_expect_success '#17.1: in .git/wt' '
2402        cat >17/.git/wt/expected <<EOF &&
2403setup: git_dir: $TRASH_DIRECTORY/17/.git
2404setup: worktree: (null)
2405setup: cwd: $TRASH_DIRECTORY/17/.git/wt
2406setup: prefix: (null)
2407EOF
2408        test_repo 17/.git/wt
2409'
2410
2411test_expect_success '#17.1: in .git/wt/sub' '
2412        cat >17/.git/wt/sub/expected <<EOF &&
2413setup: git_dir: $TRASH_DIRECTORY/17/.git
2414setup: worktree: (null)
2415setup: cwd: $TRASH_DIRECTORY/17/.git/wt/sub
2416setup: prefix: (null)
2417EOF
2418        test_repo 17/.git/wt/sub
2419'
2420
2421#
2422# case #17.2
2423#
2424############################################################
2425#
2426# Input:
2427#
2428#  - GIT_WORK_TREE is set
2429#  - GIT_DIR is not set
2430#  - core.worktree is not set
2431#  - .git is a directory
2432#  - core.bare is set
2433#
2434# Output:
2435#
2436# GIT_WORK_TREE is ignored -> #16.2 (with warnings perhaps)
2437
2438test_expect_success '#17.2: setup' '
2439        git config --file="$TRASH_DIRECTORY/17/.git/config" core.bare true
2440'
2441
2442test_expect_success '#17.2: at .git' '
2443        cat >17/.git/expected <<EOF &&
2444setup: git_dir: .
2445setup: worktree: (null)
2446setup: cwd: $TRASH_DIRECTORY/17/.git
2447setup: prefix: (null)
2448EOF
2449        test_repo 17/.git
2450'
2451
2452test_expect_success '#17.2: in .git/wt' '
2453        cat >17/.git/wt/expected <<EOF &&
2454setup: git_dir: $TRASH_DIRECTORY/17/.git
2455setup: worktree: (null)
2456setup: cwd: $TRASH_DIRECTORY/17/.git/wt
2457setup: prefix: (null)
2458EOF
2459        test_repo 17/.git/wt
2460'
2461
2462test_expect_success '#17.2: in .git/wt/sub' '
2463        cat >17/.git/wt/sub/expected <<EOF &&
2464setup: git_dir: $TRASH_DIRECTORY/17/.git
2465setup: worktree: (null)
2466setup: cwd: $TRASH_DIRECTORY/17/.git/wt/sub
2467setup: prefix: (null)
2468EOF
2469        test_repo 17/.git/wt/sub
2470'
2471
2472test_expect_success '#17.2: at root' '
2473        cat >17/expected <<EOF &&
2474setup: git_dir: .git
2475setup: worktree: (null)
2476setup: cwd: $TRASH_DIRECTORY/17
2477setup: prefix: (null)
2478EOF
2479        test_repo 17
2480'
2481
2482test_expect_success '#17.2: in subdir' '
2483        cat >17/sub/expected <<EOF &&
2484setup: git_dir: $TRASH_DIRECTORY/17/.git
2485setup: worktree: (null)
2486setup: cwd: $TRASH_DIRECTORY/17/sub
2487setup: prefix: (null)
2488EOF
2489        test_repo 17/sub
2490'
2491
2492#
2493# case #18
2494#
2495############################################################
2496#
2497# Input:
2498#
2499#  - GIT_WORK_TREE is not set
2500#  - GIT_DIR is set
2501#  - core.worktree is not set
2502#  - .git is a directory
2503#  - core.bare is set
2504#
2505# Output:
2506#
2507#  - no worktree (rule #8)
2508#  - cwd is unchanged
2509#  - prefix is NULL
2510#  - git_dir is set to $GIT_DIR
2511#  - cwd can't be outside worktree
2512
2513test_expect_success '#18: setup' '
2514        sane_unset GIT_DIR GIT_WORK_TREE &&
2515        mkdir 18 18/sub &&
2516        cd 18 &&
2517        git init &&
2518        mkdir .git/wt .git/wt/sub &&
2519        git config core.bare true &&
2520        cd ..
2521'
2522
2523test_expect_success '#18: (rel) at root' '
2524        cat >18/expected <<EOF &&
2525setup: git_dir: .git
2526setup: worktree: (null)
2527setup: cwd: $TRASH_DIRECTORY/18
2528setup: prefix: (null)
2529EOF
2530         test_repo 18 .git
2531'
2532
2533test_expect_success '#18: at root' '
2534        cat >18/expected <<EOF &&
2535setup: git_dir: $TRASH_DIRECTORY/18/.git
2536setup: worktree: (null)
2537setup: cwd: $TRASH_DIRECTORY/18
2538setup: prefix: (null)
2539EOF
2540         test_repo 18 "$TRASH_DIRECTORY/18/.git"
2541'
2542
2543test_expect_success '#18: (rel) in subdir' '
2544        cat >18/sub/expected <<EOF &&
2545setup: git_dir: ../.git
2546setup: worktree: (null)
2547setup: cwd: $TRASH_DIRECTORY/18/sub
2548setup: prefix: (null)
2549EOF
2550        test_repo 18/sub ../.git
2551'
2552
2553test_expect_success '#18: in subdir' '
2554        cat >18/sub/expected <<EOF &&
2555setup: git_dir: $TRASH_DIRECTORY/18/.git
2556setup: worktree: (null)
2557setup: cwd: $TRASH_DIRECTORY/18/sub
2558setup: prefix: (null)
2559EOF
2560        test_repo 18/sub "$TRASH_DIRECTORY/18/.git"
2561'
2562
2563#
2564# case #19
2565#
2566############################################################
2567#
2568# Input:
2569#
2570#  - GIT_WORK_TREE is set
2571#  - GIT_DIR is set
2572#  - .git is a directory
2573#  - core.worktree is not set
2574#  - core.bare is set
2575#
2576# Output:
2577#
2578# bare repo is overridden by GIT_WORK_TREE -> #3
2579
2580test_expect_success '#19: setup' '
2581        sane_unset GIT_DIR GIT_WORK_TREE &&
2582        mkdir 19 19/sub 19/sub/sub 19.wt 19.wt/sub 19/wt 19/wt/sub &&
2583        cd 19 &&
2584        git init &&
2585        git config core.bare true &&
2586        cd ..
2587'
2588
2589test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=root at root' '
2590        cat >19/expected <<EOF &&
2591setup: git_dir: .git
2592setup: worktree: $TRASH_DIRECTORY/19
2593setup: cwd: $TRASH_DIRECTORY/19
2594setup: prefix: (null)
2595EOF
2596        test_repo 19 .git "$TRASH_DIRECTORY/19"
2597'
2598
2599test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' '
2600        cat >19/expected <<EOF &&
2601setup: git_dir: .git
2602setup: worktree: $TRASH_DIRECTORY/19
2603setup: cwd: $TRASH_DIRECTORY/19
2604setup: prefix: (null)
2605EOF
2606        test_repo 19 .git .
2607'
2608
2609test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=root at root' '
2610        cat >19/expected <<EOF &&
2611setup: git_dir: $TRASH_DIRECTORY/19/.git
2612setup: worktree: $TRASH_DIRECTORY/19
2613setup: cwd: $TRASH_DIRECTORY/19
2614setup: prefix: (null)
2615EOF
2616        test_repo 19 "$TRASH_DIRECTORY/19/.git" "$TRASH_DIRECTORY/19"
2617'
2618
2619test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=root(rel) at root' '
2620        cat >19/expected <<EOF &&
2621setup: git_dir: $TRASH_DIRECTORY/19/.git
2622setup: worktree: $TRASH_DIRECTORY/19
2623setup: cwd: $TRASH_DIRECTORY/19
2624setup: prefix: (null)
2625EOF
2626        test_repo 19 "$TRASH_DIRECTORY/19/.git" .
2627'
2628
2629test_expect_success '#19: GIT_DIR(rel), GIT_WORKTREE=root in subdir' '
2630        cat >19/sub/sub/expected <<EOF &&
2631setup: git_dir: $TRASH_DIRECTORY/19/.git
2632setup: worktree: $TRASH_DIRECTORY/19
2633setup: cwd: $TRASH_DIRECTORY/19
2634setup: prefix: sub/sub/
2635EOF
2636        test_repo 19/sub/sub ../../.git "$TRASH_DIRECTORY/19"
2637'
2638
2639test_expect_success '#19: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' '
2640        cat >19/sub/sub/expected <<EOF &&
2641setup: git_dir: $TRASH_DIRECTORY/19/.git
2642setup: worktree: $TRASH_DIRECTORY/19
2643setup: cwd: $TRASH_DIRECTORY/19
2644setup: prefix: sub/sub/
2645EOF
2646        test_repo 19/sub/sub ../../.git ../..
2647'
2648
2649test_expect_success '#19: GIT_DIR, GIT_WORKTREE=root in subdir' '
2650        cat >19/sub/expected <<EOF &&
2651setup: git_dir: $TRASH_DIRECTORY/19/.git
2652setup: worktree: $TRASH_DIRECTORY/19
2653setup: cwd: $TRASH_DIRECTORY/19
2654setup: prefix: sub/
2655EOF
2656        test_repo 19/sub "$TRASH_DIRECTORY/19/.git" "$TRASH_DIRECTORY/19"
2657'
2658
2659test_expect_success '#19: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' '
2660        cat >19/sub/sub/expected <<EOF &&
2661setup: git_dir: $TRASH_DIRECTORY/19/.git
2662setup: worktree: $TRASH_DIRECTORY/19
2663setup: cwd: $TRASH_DIRECTORY/19
2664setup: prefix: sub/sub/
2665EOF
2666        test_repo 19/sub/sub "$TRASH_DIRECTORY/19/.git" ../..
2667'
2668
2669test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=wt at root' '
2670        cat >19/expected <<EOF &&
2671setup: git_dir: .git
2672setup: worktree: $TRASH_DIRECTORY/19/wt
2673setup: cwd: $TRASH_DIRECTORY/19
2674setup: prefix: (null)
2675EOF
2676        test_repo 19 .git "$TRASH_DIRECTORY/19/wt"
2677'
2678
2679test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' '
2680        cat >19/expected <<EOF &&
2681setup: git_dir: .git
2682setup: worktree: $TRASH_DIRECTORY/19/wt
2683setup: cwd: $TRASH_DIRECTORY/19
2684setup: prefix: (null)
2685EOF
2686        test_repo 19 .git wt
2687'
2688
2689test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' '
2690        cat >19/expected <<EOF &&
2691setup: git_dir: $TRASH_DIRECTORY/19/.git
2692setup: worktree: $TRASH_DIRECTORY/19/wt
2693setup: cwd: $TRASH_DIRECTORY/19
2694setup: prefix: (null)
2695EOF
2696        test_repo 19 "$TRASH_DIRECTORY/19/.git" wt
2697'
2698
2699test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=wt at root' '
2700        cat >19/expected <<EOF &&
2701setup: git_dir: $TRASH_DIRECTORY/19/.git
2702setup: worktree: $TRASH_DIRECTORY/19/wt
2703setup: cwd: $TRASH_DIRECTORY/19
2704setup: prefix: (null)
2705EOF
2706        test_repo 19 "$TRASH_DIRECTORY/19/.git" "$TRASH_DIRECTORY/19/wt"
2707'
2708
2709test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' '
2710        cat >19/sub/sub/expected <<EOF &&
2711setup: git_dir: ../../.git
2712setup: worktree: $TRASH_DIRECTORY/19/wt
2713setup: cwd: $TRASH_DIRECTORY/19/sub/sub
2714setup: prefix: (null)
2715EOF
2716        test_repo 19/sub/sub ../../.git "$TRASH_DIRECTORY/19/wt"
2717'
2718
2719test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' '
2720        cat >19/sub/sub/expected <<EOF &&
2721setup: git_dir: ../../.git
2722setup: worktree: $TRASH_DIRECTORY/19/wt
2723setup: cwd: $TRASH_DIRECTORY/19/sub/sub
2724setup: prefix: (null)
2725EOF
2726        test_repo 19/sub/sub ../../.git ../../wt
2727'
2728
2729test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' '
2730        cat >19/sub/sub/expected <<EOF &&
2731setup: git_dir: $TRASH_DIRECTORY/19/.git
2732setup: worktree: $TRASH_DIRECTORY/19/wt
2733setup: cwd: $TRASH_DIRECTORY/19/sub/sub
2734setup: prefix: (null)
2735EOF
2736        test_repo 19/sub/sub "$TRASH_DIRECTORY/19/.git" ../../wt
2737'
2738
2739test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=wt in subdir' '
2740        cat >19/sub/sub/expected <<EOF &&
2741setup: git_dir: $TRASH_DIRECTORY/19/.git
2742setup: worktree: $TRASH_DIRECTORY/19/wt
2743setup: cwd: $TRASH_DIRECTORY/19/sub/sub
2744setup: prefix: (null)
2745EOF
2746        test_repo 19/sub/sub "$TRASH_DIRECTORY/19/.git" "$TRASH_DIRECTORY/19/wt"
2747'
2748
2749test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=.. at root' '
2750        cat >19/expected <<EOF &&
2751setup: git_dir: $TRASH_DIRECTORY/19/.git
2752setup: worktree: $TRASH_DIRECTORY
2753setup: cwd: $TRASH_DIRECTORY
2754setup: prefix: 19/
2755EOF
2756        test_repo 19 .git "$TRASH_DIRECTORY"
2757'
2758
2759test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' '
2760        cat >19/expected <<EOF &&
2761setup: git_dir: $TRASH_DIRECTORY/19/.git
2762setup: worktree: $TRASH_DIRECTORY
2763setup: cwd: $TRASH_DIRECTORY
2764setup: prefix: 19/
2765EOF
2766        test_repo 19 .git ..
2767'
2768
2769test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=..(rel) at root' '
2770        cat >19/expected <<EOF &&
2771setup: git_dir: $TRASH_DIRECTORY/19/.git
2772setup: worktree: $TRASH_DIRECTORY
2773setup: cwd: $TRASH_DIRECTORY
2774setup: prefix: 19/
2775EOF
2776        test_repo 19 "$TRASH_DIRECTORY/19/.git" ..
2777'
2778
2779test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=.. at root' '
2780        cat >19/expected <<EOF &&
2781setup: git_dir: $TRASH_DIRECTORY/19/.git
2782setup: worktree: $TRASH_DIRECTORY
2783setup: cwd: $TRASH_DIRECTORY
2784setup: prefix: 19/
2785EOF
2786        test_repo 19 "$TRASH_DIRECTORY/19/.git" "$TRASH_DIRECTORY"
2787'
2788
2789test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' '
2790        cat >19/sub/sub/expected <<EOF &&
2791setup: git_dir: $TRASH_DIRECTORY/19/.git
2792setup: worktree: $TRASH_DIRECTORY
2793setup: cwd: $TRASH_DIRECTORY
2794setup: prefix: 19/sub/sub/
2795EOF
2796        test_repo 19/sub/sub ../../.git "$TRASH_DIRECTORY"
2797'
2798
2799test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' '
2800        cat >19/sub/sub/expected <<EOF &&
2801setup: git_dir: $TRASH_DIRECTORY/19/.git
2802setup: worktree: $TRASH_DIRECTORY
2803setup: cwd: $TRASH_DIRECTORY
2804setup: prefix: 19/sub/sub/
2805EOF
2806        test_repo 19/sub/sub ../../.git ../../..
2807'
2808
2809test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' '
2810        cat >19/sub/sub/expected <<EOF &&
2811setup: git_dir: $TRASH_DIRECTORY/19/.git
2812setup: worktree: $TRASH_DIRECTORY
2813setup: cwd: $TRASH_DIRECTORY
2814setup: prefix: 19/sub/sub/
2815EOF
2816        test_repo 19/sub/sub "$TRASH_DIRECTORY/19/.git" ../../../
2817'
2818
2819test_expect_success '#19: GIT_DIR, GIT_WORK_TREE=.. in subdir' '
2820        cat >19/sub/sub/expected <<EOF &&
2821setup: git_dir: $TRASH_DIRECTORY/19/.git
2822setup: worktree: $TRASH_DIRECTORY
2823setup: cwd: $TRASH_DIRECTORY
2824setup: prefix: 19/sub/sub/
2825EOF
2826        test_repo 19/sub/sub "$TRASH_DIRECTORY/19/.git" "$TRASH_DIRECTORY"
2827'
2828
2829#
2830# case #20.1
2831#
2832############################################################
2833#
2834# Input:
2835#
2836#  - GIT_WORK_TREE is not set
2837#  - GIT_DIR is not set
2838#  - core.worktree is set
2839#  - .git is a directory
2840#  - cwd is inside .git
2841#
2842# Output:
2843#
2844# core.worktree is ignored -> #16.1
2845
2846test_expect_success '#20.1: setup' '
2847        sane_unset GIT_DIR GIT_WORK_TREE &&
2848        mkdir 20 20/sub &&
2849        cd 20 &&
2850        git init &&
2851        git config core.worktree non-existent &&
2852        mkdir .git/wt .git/wt/sub &&
2853        cd ..
2854'
2855
2856test_expect_success '#20.1: at .git' '
2857        cat >20/.git/expected <<EOF &&
2858setup: git_dir: .
2859setup: worktree: (null)
2860setup: cwd: $TRASH_DIRECTORY/20/.git
2861setup: prefix: (null)
2862EOF
2863        test_repo 20/.git
2864'
2865
2866test_expect_success '#20.1: in .git/wt' '
2867        cat >20/.git/wt/expected <<EOF &&
2868setup: git_dir: $TRASH_DIRECTORY/20/.git
2869setup: worktree: (null)
2870setup: cwd: $TRASH_DIRECTORY/20/.git/wt
2871setup: prefix: (null)
2872EOF
2873        test_repo 20/.git/wt
2874'
2875
2876test_expect_success '#20.1: in .git/wt/sub' '
2877        cat >20/.git/wt/sub/expected <<EOF &&
2878setup: git_dir: $TRASH_DIRECTORY/20/.git
2879setup: worktree: (null)
2880setup: cwd: $TRASH_DIRECTORY/20/.git/wt/sub
2881setup: prefix: (null)
2882EOF
2883        test_repo 20/.git/wt/sub
2884'
2885
2886#
2887# case #20.2
2888#
2889############################################################
2890#
2891# Input:
2892#
2893#  - GIT_WORK_TREE is not set
2894#  - GIT_DIR is not set
2895#  - core.worktree is set
2896#  - .git is a directory
2897#  - core.bare is set
2898#
2899# Output:
2900#
2901# core.worktree is ignored -> #16.2
2902
2903test_expect_success '#20.2: setup' '
2904        git config --file="$TRASH_DIRECTORY/20/.git/config" core.bare true
2905'
2906
2907test_expect_success '#20.2: at .git' '
2908        cat >20/.git/expected <<EOF &&
2909setup: git_dir: .
2910setup: worktree: (null)
2911setup: cwd: $TRASH_DIRECTORY/20/.git
2912setup: prefix: (null)
2913EOF
2914        test_repo 20/.git
2915'
2916
2917test_expect_success '#20.2: in .git/wt' '
2918        cat >20/.git/wt/expected <<EOF &&
2919setup: git_dir: $TRASH_DIRECTORY/20/.git
2920setup: worktree: (null)
2921setup: cwd: $TRASH_DIRECTORY/20/.git/wt
2922setup: prefix: (null)
2923EOF
2924        test_repo 20/.git/wt
2925'
2926
2927test_expect_success '#20.2: in .git/wt/sub' '
2928        cat >20/.git/wt/sub/expected <<EOF &&
2929setup: git_dir: $TRASH_DIRECTORY/20/.git
2930setup: worktree: (null)
2931setup: cwd: $TRASH_DIRECTORY/20/.git/wt/sub
2932setup: prefix: (null)
2933EOF
2934        test_repo 20/.git/wt/sub
2935'
2936
2937test_expect_success '#20.2: at root' '
2938        cat >20/expected <<EOF &&
2939setup: git_dir: .git
2940setup: worktree: (null)
2941setup: cwd: $TRASH_DIRECTORY/20
2942setup: prefix: (null)
2943EOF
2944        test_repo 20
2945'
2946
2947test_expect_success '#20.2: in subdir' '
2948        cat >20/sub/expected <<EOF &&
2949setup: git_dir: $TRASH_DIRECTORY/20/.git
2950setup: worktree: (null)
2951setup: cwd: $TRASH_DIRECTORY/20/sub
2952setup: prefix: (null)
2953EOF
2954        test_repo 20/sub
2955'
2956
2957#
2958# case #21.1
2959#
2960############################################################
2961#
2962# Input:
2963#
2964#  - GIT_WORK_TREE is set
2965#  - GIT_DIR is not set
2966#  - core.worktree is set
2967#  - .git is a directory
2968#  - cwd is inside .git
2969#
2970# Output:
2971#
2972# GIT_WORK_TREE/core.worktree are ignored -> #20.1
2973
2974test_expect_success '#21.1: setup' '
2975        sane_unset GIT_DIR GIT_WORK_TREE &&
2976        mkdir 21 21/sub &&
2977        cd 21 &&
2978        git init &&
2979        git config core.worktree non-existent &&
2980        GIT_WORK_TREE=non-existent-too &&
2981        export GIT_WORK_TREE &&
2982        mkdir .git/wt .git/wt/sub &&
2983        cd ..
2984'
2985
2986test_expect_success '#21.1: at .git' '
2987        cat >21/.git/expected <<EOF &&
2988setup: git_dir: .
2989setup: worktree: (null)
2990setup: cwd: $TRASH_DIRECTORY/21/.git
2991setup: prefix: (null)
2992EOF
2993        test_repo 21/.git
2994'
2995
2996test_expect_success '#21.1: in .git/wt' '
2997        cat >21/.git/wt/expected <<EOF &&
2998setup: git_dir: $TRASH_DIRECTORY/21/.git
2999setup: worktree: (null)
3000setup: cwd: $TRASH_DIRECTORY/21/.git/wt
3001setup: prefix: (null)
3002EOF
3003        test_repo 21/.git/wt
3004'
3005
3006test_expect_success '#21.1: in .git/wt/sub' '
3007        cat >21/.git/wt/sub/expected <<EOF &&
3008setup: git_dir: $TRASH_DIRECTORY/21/.git
3009setup: worktree: (null)
3010setup: cwd: $TRASH_DIRECTORY/21/.git/wt/sub
3011setup: prefix: (null)
3012EOF
3013        test_repo 21/.git/wt/sub
3014'
3015
3016#
3017# case #21.2
3018#
3019############################################################
3020#
3021# Input:
3022#
3023#  - GIT_WORK_TREE is set
3024#  - GIT_DIR is not set
3025#  - core.worktree is set
3026#  - .git is a directory
3027#  - core.bare is set
3028#
3029# Output:
3030#
3031# GIT_WORK_TREE/core.worktree are ignored -> #20.2
3032
3033test_expect_success '#21.2: setup' '
3034        git config --file="$TRASH_DIRECTORY/21/.git/config" core.bare true
3035'
3036
3037test_expect_success '#21.2: at .git' '
3038        cat >21/.git/expected <<EOF &&
3039setup: git_dir: .
3040setup: worktree: (null)
3041setup: cwd: $TRASH_DIRECTORY/21/.git
3042setup: prefix: (null)
3043EOF
3044        test_repo 21/.git
3045'
3046
3047test_expect_success '#21.2: in .git/wt' '
3048        cat >21/.git/wt/expected <<EOF &&
3049setup: git_dir: $TRASH_DIRECTORY/21/.git
3050setup: worktree: (null)
3051setup: cwd: $TRASH_DIRECTORY/21/.git/wt
3052setup: prefix: (null)
3053EOF
3054        test_repo 21/.git/wt
3055'
3056
3057test_expect_success '#21.2: in .git/wt/sub' '
3058        cat >21/.git/wt/sub/expected <<EOF &&
3059setup: git_dir: $TRASH_DIRECTORY/21/.git
3060setup: worktree: (null)
3061setup: cwd: $TRASH_DIRECTORY/21/.git/wt/sub
3062setup: prefix: (null)
3063EOF
3064        test_repo 21/.git/wt/sub
3065'
3066
3067test_expect_success '#21.2: at root' '
3068        cat >21/expected <<EOF &&
3069setup: git_dir: .git
3070setup: worktree: (null)
3071setup: cwd: $TRASH_DIRECTORY/21
3072setup: prefix: (null)
3073EOF
3074        test_repo 21
3075'
3076
3077test_expect_success '#21.2: in subdir' '
3078        cat >21/sub/expected <<EOF &&
3079setup: git_dir: $TRASH_DIRECTORY/21/.git
3080setup: worktree: (null)
3081setup: cwd: $TRASH_DIRECTORY/21/sub
3082setup: prefix: (null)
3083EOF
3084        test_repo 21/sub
3085'
3086
3087#
3088# case #22.1
3089#
3090############################################################
3091#
3092# Input:
3093#
3094#  - GIT_WORK_TREE is not set
3095#  - GIT_DIR is set
3096#  - core.worktree is set
3097#  - .git is a directory
3098#  - cwd is inside .git
3099#
3100# Output:
3101#
3102# bare attribute is ignored
3103#
3104#  - worktree is at core.worktree
3105#  - cwd is at worktree root
3106#  - prefix is calculated
3107#  - git_dir is at $GIT_DIR
3108#  - cwd can be outside worktree
3109
3110test_expect_success '#22.1: setup' '
3111        sane_unset GIT_DIR GIT_WORK_TREE &&
3112        mkdir 22 &&
3113        cd 22 &&
3114        git init &&
3115        mkdir .git/sub .git/wt .git/wt/sub &&
3116        cd ..
3117'
3118
3119test_expect_success '#22.1: GIT_DIR(rel), core.worktree=. at .git' '
3120        cat >22/.git/expected <<EOF &&
3121setup: git_dir: .
3122setup: worktree: $TRASH_DIRECTORY/22/.git
3123setup: cwd: $TRASH_DIRECTORY/22/.git
3124setup: prefix: (null)
3125EOF
3126        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22/.git" &&
3127        test_repo 22/.git .
3128'
3129
3130test_expect_success '#22.1: GIT_DIR(rel), core.worktree=.(rel) at .git' '
3131        cat >22/.git/expected <<EOF &&
3132setup: git_dir: .
3133setup: worktree: $TRASH_DIRECTORY/22/.git
3134setup: cwd: $TRASH_DIRECTORY/22/.git
3135setup: prefix: (null)
3136EOF
3137        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree . &&
3138        test_repo 22/.git .
3139'
3140
3141test_expect_success '#22.1: GIT_DIR, core.worktree=. at .git' '
3142        cat >22/.git/expected <<EOF &&
3143setup: git_dir: $TRASH_DIRECTORY/22/.git
3144setup: worktree: $TRASH_DIRECTORY/22/.git
3145setup: cwd: $TRASH_DIRECTORY/22/.git
3146setup: prefix: (null)
3147EOF
3148        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22/.git" &&
3149        test_repo 22/.git "$TRASH_DIRECTORY/22/.git"
3150'
3151
3152test_expect_success '#22.1: GIT_DIR, core.worktree=.(rel) at root' '
3153        cat >22/.git/expected <<EOF &&
3154setup: git_dir: $TRASH_DIRECTORY/22/.git
3155setup: worktree: $TRASH_DIRECTORY/22/.git
3156setup: cwd: $TRASH_DIRECTORY/22/.git
3157setup: prefix: (null)
3158EOF
3159        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree . &&
3160        test_repo 22/.git "$TRASH_DIRECTORY/22/.git"
3161'
3162
3163test_expect_success '#22.1: GIT_DIR(rel), core.worktree=. in .git/sub' '
3164        cat >22/.git/sub/expected <<EOF &&
3165setup: git_dir: $TRASH_DIRECTORY/22/.git
3166setup: worktree: $TRASH_DIRECTORY/22/.git
3167setup: cwd: $TRASH_DIRECTORY/22/.git
3168setup: prefix: sub/
3169EOF
3170        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22/.git" &&
3171        test_repo 22/.git/sub ..
3172'
3173
3174test_expect_success '#22.1: GIT_DIR(rel), core.worktree=.(rel) in .git/sub' '
3175        cat >22/.git/sub/expected <<EOF &&
3176setup: git_dir: $TRASH_DIRECTORY/22/.git
3177setup: worktree: $TRASH_DIRECTORY/22/.git
3178setup: cwd: $TRASH_DIRECTORY/22/.git
3179setup: prefix: sub/
3180EOF
3181        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree . &&
3182        test_repo 22/.git/sub/ ..
3183'
3184
3185test_expect_success '#22.1: GIT_DIR, core.worktree=. in .git/sub' '
3186        cat >22/.git/sub/expected <<EOF &&
3187setup: git_dir: $TRASH_DIRECTORY/22/.git
3188setup: worktree: $TRASH_DIRECTORY/22/.git
3189setup: cwd: $TRASH_DIRECTORY/22/.git
3190setup: prefix: sub/
3191EOF
3192        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22/.git" &&
3193        test_repo 22/.git/sub "$TRASH_DIRECTORY/22/.git"
3194'
3195
3196test_expect_success '#22.1: GIT_DIR, core.worktree=.(rel) in .git/sub' '
3197        cat >22/.git/sub/expected <<EOF &&
3198setup: git_dir: $TRASH_DIRECTORY/22/.git
3199setup: worktree: $TRASH_DIRECTORY/22/.git
3200setup: cwd: $TRASH_DIRECTORY/22/.git
3201setup: prefix: sub/
3202EOF
3203        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree . &&
3204        test_repo 22/.git/sub "$TRASH_DIRECTORY/22/.git"
3205'
3206
3207test_expect_success '#22.1: GIT_DIR(rel), core.worktree=wt at .git' '
3208        cat >22/.git/expected <<EOF &&
3209setup: git_dir: .
3210setup: worktree: $TRASH_DIRECTORY/22/.git/wt
3211setup: cwd: $TRASH_DIRECTORY/22/.git
3212setup: prefix: (null)
3213EOF
3214        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22/.git/wt" &&
3215        test_repo 22/.git .
3216'
3217
3218test_expect_success '#22.1: GIT_DIR(rel), core.worktree=wt(rel) at .git' '
3219        cat >22/.git/expected <<EOF &&
3220setup: git_dir: .
3221setup: worktree: $TRASH_DIRECTORY/22/.git/wt
3222setup: cwd: $TRASH_DIRECTORY/22/.git
3223setup: prefix: (null)
3224EOF
3225        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree wt &&
3226        test_repo 22/.git .
3227'
3228
3229test_expect_success '#22.1: GIT_DIR, core.worktree=wt(rel) at .git' '
3230        cat >22/.git/expected <<EOF &&
3231setup: git_dir: $TRASH_DIRECTORY/22/.git
3232setup: worktree: $TRASH_DIRECTORY/22/.git/wt
3233setup: cwd: $TRASH_DIRECTORY/22/.git
3234setup: prefix: (null)
3235EOF
3236        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree wt &&
3237        test_repo 22/.git "$TRASH_DIRECTORY/22/.git"
3238'
3239
3240test_expect_success '#22.1: GIT_DIR, core.worktree=wt at .git' '
3241        cat >22/.git/expected <<EOF &&
3242setup: git_dir: $TRASH_DIRECTORY/22/.git
3243setup: worktree: $TRASH_DIRECTORY/22/.git/wt
3244setup: cwd: $TRASH_DIRECTORY/22/.git
3245setup: prefix: (null)
3246EOF
3247        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22/.git/wt" &&
3248        test_repo 22/.git "$TRASH_DIRECTORY/22/.git"
3249'
3250
3251test_expect_success '#22.1: GIT_DIR(rel), core.worktree=wt in .git/sub' '
3252        cat >22/.git/sub/expected <<EOF &&
3253setup: git_dir: ..
3254setup: worktree: $TRASH_DIRECTORY/22/.git/wt
3255setup: cwd: $TRASH_DIRECTORY/22/.git/sub
3256setup: prefix: (null)
3257EOF
3258        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22/.git/wt" &&
3259        test_repo 22/.git/sub ..
3260'
3261
3262test_expect_success '#22.1: GIT_DIR(rel), core.worktree=wt(rel) in .git/sub' '
3263        cat >22/.git/sub/expected <<EOF &&
3264setup: git_dir: ..
3265setup: worktree: $TRASH_DIRECTORY/22/.git/wt
3266setup: cwd: $TRASH_DIRECTORY/22/.git/sub
3267setup: prefix: (null)
3268EOF
3269        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree wt &&
3270        test_repo 22/.git/sub ..
3271'
3272
3273test_expect_success '#22.1: GIT_DIR, core.worktree=wt(rel) in .git/sub' '
3274        cat >22/.git/sub/expected <<EOF &&
3275setup: git_dir: $TRASH_DIRECTORY/22/.git
3276setup: worktree: $TRASH_DIRECTORY/22/.git/wt
3277setup: cwd: $TRASH_DIRECTORY/22/.git/sub
3278setup: prefix: (null)
3279EOF
3280        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree wt &&
3281        test_repo 22/.git/sub "$TRASH_DIRECTORY/22/.git"
3282'
3283
3284test_expect_success '#22.1: GIT_DIR, core.worktree=wt in .git/sub' '
3285        cat >22/.git/sub/expected <<EOF &&
3286setup: git_dir: $TRASH_DIRECTORY/22/.git
3287setup: worktree: $TRASH_DIRECTORY/22/.git/wt
3288setup: cwd: $TRASH_DIRECTORY/22/.git/sub
3289setup: prefix: (null)
3290EOF
3291        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22/.git/wt" &&
3292        test_repo 22/.git/sub "$TRASH_DIRECTORY/22/.git"
3293'
3294
3295test_expect_success '#22.1: GIT_DIR(rel), core.worktree=.. at .git' '
3296        cat >22/.git/expected <<EOF &&
3297setup: git_dir: $TRASH_DIRECTORY/22/.git
3298setup: worktree: $TRASH_DIRECTORY/22
3299setup: cwd: $TRASH_DIRECTORY/22
3300setup: prefix: .git/
3301EOF
3302        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22" &&
3303        test_repo 22/.git .
3304'
3305
3306test_expect_success '#22.1: GIT_DIR(rel), core.worktree=..(rel) at .git' '
3307        cat >22/.git/expected <<EOF &&
3308setup: git_dir: $TRASH_DIRECTORY/22/.git
3309setup: worktree: $TRASH_DIRECTORY/22
3310setup: cwd: $TRASH_DIRECTORY/22
3311setup: prefix: .git/
3312EOF
3313        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree .. &&
3314        test_repo 22/.git .
3315'
3316
3317test_expect_success '#22.1: GIT_DIR, core.worktree=..(rel) at .git' '
3318        cat >22/.git/expected <<EOF &&
3319setup: git_dir: $TRASH_DIRECTORY/22/.git
3320setup: worktree: $TRASH_DIRECTORY/22
3321setup: cwd: $TRASH_DIRECTORY/22
3322setup: prefix: .git/
3323EOF
3324        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree .. &&
3325        test_repo 22/.git "$TRASH_DIRECTORY/22/.git"
3326'
3327
3328test_expect_success '#22.1: GIT_DIR, core.worktree=.. at .git' '
3329        cat >22/.git/expected <<EOF &&
3330setup: git_dir: $TRASH_DIRECTORY/22/.git
3331setup: worktree: $TRASH_DIRECTORY/22
3332setup: cwd: $TRASH_DIRECTORY/22
3333setup: prefix: .git/
3334EOF
3335        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22" &&
3336        test_repo 22/.git "$TRASH_DIRECTORY/22/.git"
3337'
3338
3339test_expect_success '#22.1: GIT_DIR(rel), core.worktree=.. in .git/sub' '
3340        cat >22/.git/sub/expected <<EOF &&
3341setup: git_dir: $TRASH_DIRECTORY/22/.git
3342setup: worktree: $TRASH_DIRECTORY/22
3343setup: cwd: $TRASH_DIRECTORY/22
3344setup: prefix: .git/sub/
3345EOF
3346        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22" &&
3347        test_repo 22/.git/sub ..
3348'
3349
3350test_expect_success '#22.1: GIT_DIR(rel), core.worktree=..(rel) in .git/sub' '
3351        cat >22/.git/sub/expected <<EOF &&
3352setup: git_dir: $TRASH_DIRECTORY/22/.git
3353setup: worktree: $TRASH_DIRECTORY/22
3354setup: cwd: $TRASH_DIRECTORY/22
3355setup: prefix: .git/sub/
3356EOF
3357        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree .. &&
3358        test_repo 22/.git/sub ..
3359'
3360
3361test_expect_success '#22.1: GIT_DIR, core.worktree=..(rel) in .git/sub' '
3362        cat >22/.git/sub/expected <<EOF &&
3363setup: git_dir: $TRASH_DIRECTORY/22/.git
3364setup: worktree: $TRASH_DIRECTORY/22
3365setup: cwd: $TRASH_DIRECTORY/22
3366setup: prefix: .git/sub/
3367EOF
3368        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree .. &&
3369        test_repo 22/.git/sub "$TRASH_DIRECTORY/22/.git"
3370'
3371
3372test_expect_success '#22.1: GIT_DIR, core.worktree=.. in .git/sub' '
3373        cat >22/.git/sub/expected <<EOF &&
3374setup: git_dir: $TRASH_DIRECTORY/22/.git
3375setup: worktree: $TRASH_DIRECTORY/22
3376setup: cwd: $TRASH_DIRECTORY/22
3377setup: prefix: .git/sub/
3378EOF
3379        git config --file="$TRASH_DIRECTORY/22/.git/config" core.worktree "$TRASH_DIRECTORY/22" &&
3380        test_repo 22/.git/sub "$TRASH_DIRECTORY/22/.git"
3381'
3382
3383#
3384# case #22.2
3385#
3386############################################################
3387#
3388# Input:
3389#
3390#  - GIT_WORK_TREE is not set
3391#  - GIT_DIR is set
3392#  - core.worktree is set
3393#  - .git is a directory
3394#  - core.bare is set
3395#
3396# Output:
3397#
3398# core.worktree and core.bare conflict, won't fly.
3399
3400test_expect_success '#22.2: setup' '
3401        git config --file="$TRASH_DIRECTORY/22/.git/config" core.bare true
3402'
3403
3404test_expect_success '#22.2: at .git' '
3405        (
3406        cd 22/.git &&
3407        GIT_DIR=. &&
3408        export GIT_DIR &&
3409        test_must_fail git symbolic-ref HEAD 2>result &&
3410        grep "core.bare and core.worktree do not make sense" result
3411        )
3412'
3413
3414test_expect_success '#22.2: at root' '
3415        (
3416        cd 22 &&
3417        GIT_DIR=.git &&
3418        export GIT_DIR &&
3419        test_must_fail git symbolic-ref HEAD 2>result &&
3420        grep "core.bare and core.worktree do not make sense" result
3421        )
3422'
3423
3424#
3425# case #23
3426#
3427############################################################
3428#
3429# Input:
3430#
3431#  - GIT_WORK_TREE is set
3432#  - GIT_DIR is set
3433#  - core.worktree is set
3434#  - .git is a directory
3435#  - core.bare is set
3436#
3437# Output:
3438#
3439# core.worktree is overridden by GIT_WORK_TREE -> #19
3440
3441test_expect_success '#23: setup' '
3442        sane_unset GIT_DIR GIT_WORK_TREE &&
3443        mkdir 23 23/sub 23/sub/sub 23.wt 23.wt/sub 23/wt 23/wt/sub &&
3444        cd 23 &&
3445        git init &&
3446        git config core.bare true &&
3447        git config core.worktree non-existent &&
3448        cd ..
3449'
3450
3451test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=root at root' '
3452        cat >23/expected <<EOF &&
3453setup: git_dir: .git
3454setup: worktree: $TRASH_DIRECTORY/23
3455setup: cwd: $TRASH_DIRECTORY/23
3456setup: prefix: (null)
3457EOF
3458        test_repo 23 .git "$TRASH_DIRECTORY/23"
3459'
3460
3461test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' '
3462        cat >23/expected <<EOF &&
3463setup: git_dir: .git
3464setup: worktree: $TRASH_DIRECTORY/23
3465setup: cwd: $TRASH_DIRECTORY/23
3466setup: prefix: (null)
3467EOF
3468        test_repo 23 .git .
3469'
3470
3471test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=root at root' '
3472        cat >23/expected <<EOF &&
3473setup: git_dir: $TRASH_DIRECTORY/23/.git
3474setup: worktree: $TRASH_DIRECTORY/23
3475setup: cwd: $TRASH_DIRECTORY/23
3476setup: prefix: (null)
3477EOF
3478        test_repo 23 "$TRASH_DIRECTORY/23/.git" "$TRASH_DIRECTORY/23"
3479'
3480
3481test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=root(rel) at root' '
3482        cat >23/expected <<EOF &&
3483setup: git_dir: $TRASH_DIRECTORY/23/.git
3484setup: worktree: $TRASH_DIRECTORY/23
3485setup: cwd: $TRASH_DIRECTORY/23
3486setup: prefix: (null)
3487EOF
3488        test_repo 23 "$TRASH_DIRECTORY/23/.git" .
3489'
3490
3491test_expect_success '#23: GIT_DIR(rel), GIT_WORKTREE=root in subdir' '
3492        cat >23/sub/sub/expected <<EOF &&
3493setup: git_dir: $TRASH_DIRECTORY/23/.git
3494setup: worktree: $TRASH_DIRECTORY/23
3495setup: cwd: $TRASH_DIRECTORY/23
3496setup: prefix: sub/sub/
3497EOF
3498        test_repo 23/sub/sub ../../.git "$TRASH_DIRECTORY/23"
3499'
3500
3501test_expect_success '#23: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' '
3502        cat >23/sub/sub/expected <<EOF &&
3503setup: git_dir: $TRASH_DIRECTORY/23/.git
3504setup: worktree: $TRASH_DIRECTORY/23
3505setup: cwd: $TRASH_DIRECTORY/23
3506setup: prefix: sub/sub/
3507EOF
3508        test_repo 23/sub/sub ../../.git ../..
3509'
3510
3511test_expect_success '#23: GIT_DIR, GIT_WORKTREE=root in subdir' '
3512        cat >23/sub/expected <<EOF &&
3513setup: git_dir: $TRASH_DIRECTORY/23/.git
3514setup: worktree: $TRASH_DIRECTORY/23
3515setup: cwd: $TRASH_DIRECTORY/23
3516setup: prefix: sub/
3517EOF
3518        test_repo 23/sub "$TRASH_DIRECTORY/23/.git" "$TRASH_DIRECTORY/23"
3519'
3520
3521test_expect_success '#23: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' '
3522        cat >23/sub/sub/expected <<EOF &&
3523setup: git_dir: $TRASH_DIRECTORY/23/.git
3524setup: worktree: $TRASH_DIRECTORY/23
3525setup: cwd: $TRASH_DIRECTORY/23
3526setup: prefix: sub/sub/
3527EOF
3528        test_repo 23/sub/sub "$TRASH_DIRECTORY/23/.git" ../..
3529'
3530
3531test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=wt at root' '
3532        cat >23/expected <<EOF &&
3533setup: git_dir: .git
3534setup: worktree: $TRASH_DIRECTORY/23/wt
3535setup: cwd: $TRASH_DIRECTORY/23
3536setup: prefix: (null)
3537EOF
3538        test_repo 23 .git "$TRASH_DIRECTORY/23/wt"
3539'
3540
3541test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' '
3542        cat >23/expected <<EOF &&
3543setup: git_dir: .git
3544setup: worktree: $TRASH_DIRECTORY/23/wt
3545setup: cwd: $TRASH_DIRECTORY/23
3546setup: prefix: (null)
3547EOF
3548        test_repo 23 .git wt
3549'
3550
3551test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' '
3552        cat >23/expected <<EOF &&
3553setup: git_dir: $TRASH_DIRECTORY/23/.git
3554setup: worktree: $TRASH_DIRECTORY/23/wt
3555setup: cwd: $TRASH_DIRECTORY/23
3556setup: prefix: (null)
3557EOF
3558        test_repo 23 "$TRASH_DIRECTORY/23/.git" wt
3559'
3560
3561test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=wt at root' '
3562        cat >23/expected <<EOF &&
3563setup: git_dir: $TRASH_DIRECTORY/23/.git
3564setup: worktree: $TRASH_DIRECTORY/23/wt
3565setup: cwd: $TRASH_DIRECTORY/23
3566setup: prefix: (null)
3567EOF
3568        test_repo 23 "$TRASH_DIRECTORY/23/.git" "$TRASH_DIRECTORY/23/wt"
3569'
3570
3571test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' '
3572        cat >23/sub/sub/expected <<EOF &&
3573setup: git_dir: ../../.git
3574setup: worktree: $TRASH_DIRECTORY/23/wt
3575setup: cwd: $TRASH_DIRECTORY/23/sub/sub
3576setup: prefix: (null)
3577EOF
3578        test_repo 23/sub/sub ../../.git "$TRASH_DIRECTORY/23/wt"
3579'
3580
3581test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' '
3582        cat >23/sub/sub/expected <<EOF &&
3583setup: git_dir: ../../.git
3584setup: worktree: $TRASH_DIRECTORY/23/wt
3585setup: cwd: $TRASH_DIRECTORY/23/sub/sub
3586setup: prefix: (null)
3587EOF
3588        test_repo 23/sub/sub ../../.git ../../wt
3589'
3590
3591test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' '
3592        cat >23/sub/sub/expected <<EOF &&
3593setup: git_dir: $TRASH_DIRECTORY/23/.git
3594setup: worktree: $TRASH_DIRECTORY/23/wt
3595setup: cwd: $TRASH_DIRECTORY/23/sub/sub
3596setup: prefix: (null)
3597EOF
3598        test_repo 23/sub/sub "$TRASH_DIRECTORY/23/.git" ../../wt
3599'
3600
3601test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=wt in subdir' '
3602        cat >23/sub/sub/expected <<EOF &&
3603setup: git_dir: $TRASH_DIRECTORY/23/.git
3604setup: worktree: $TRASH_DIRECTORY/23/wt
3605setup: cwd: $TRASH_DIRECTORY/23/sub/sub
3606setup: prefix: (null)
3607EOF
3608        test_repo 23/sub/sub "$TRASH_DIRECTORY/23/.git" "$TRASH_DIRECTORY/23/wt"
3609'
3610
3611test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=.. at root' '
3612        cat >23/expected <<EOF &&
3613setup: git_dir: $TRASH_DIRECTORY/23/.git
3614setup: worktree: $TRASH_DIRECTORY
3615setup: cwd: $TRASH_DIRECTORY
3616setup: prefix: 23/
3617EOF
3618        test_repo 23 .git "$TRASH_DIRECTORY"
3619'
3620
3621test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' '
3622        cat >23/expected <<EOF &&
3623setup: git_dir: $TRASH_DIRECTORY/23/.git
3624setup: worktree: $TRASH_DIRECTORY
3625setup: cwd: $TRASH_DIRECTORY
3626setup: prefix: 23/
3627EOF
3628        test_repo 23 .git ..
3629'
3630
3631test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=..(rel) at root' '
3632        cat >23/expected <<EOF &&
3633setup: git_dir: $TRASH_DIRECTORY/23/.git
3634setup: worktree: $TRASH_DIRECTORY
3635setup: cwd: $TRASH_DIRECTORY
3636setup: prefix: 23/
3637EOF
3638        test_repo 23 "$TRASH_DIRECTORY/23/.git" ..
3639'
3640
3641test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=.. at root' '
3642        cat >23/expected <<EOF &&
3643setup: git_dir: $TRASH_DIRECTORY/23/.git
3644setup: worktree: $TRASH_DIRECTORY
3645setup: cwd: $TRASH_DIRECTORY
3646setup: prefix: 23/
3647EOF
3648        test_repo 23 "$TRASH_DIRECTORY/23/.git" "$TRASH_DIRECTORY"
3649'
3650
3651test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' '
3652        cat >23/sub/sub/expected <<EOF &&
3653setup: git_dir: $TRASH_DIRECTORY/23/.git
3654setup: worktree: $TRASH_DIRECTORY
3655setup: cwd: $TRASH_DIRECTORY
3656setup: prefix: 23/sub/sub/
3657EOF
3658        test_repo 23/sub/sub ../../.git "$TRASH_DIRECTORY"
3659'
3660
3661test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' '
3662        cat >23/sub/sub/expected <<EOF &&
3663setup: git_dir: $TRASH_DIRECTORY/23/.git
3664setup: worktree: $TRASH_DIRECTORY
3665setup: cwd: $TRASH_DIRECTORY
3666setup: prefix: 23/sub/sub/
3667EOF
3668        test_repo 23/sub/sub ../../.git ../../..
3669'
3670
3671test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' '
3672        cat >23/sub/sub/expected <<EOF &&
3673setup: git_dir: $TRASH_DIRECTORY/23/.git
3674setup: worktree: $TRASH_DIRECTORY
3675setup: cwd: $TRASH_DIRECTORY
3676setup: prefix: 23/sub/sub/
3677EOF
3678        test_repo 23/sub/sub "$TRASH_DIRECTORY/23/.git" ../../../
3679'
3680
3681test_expect_success '#23: GIT_DIR, GIT_WORK_TREE=.. in subdir' '
3682        cat >23/sub/sub/expected <<EOF &&
3683setup: git_dir: $TRASH_DIRECTORY/23/.git
3684setup: worktree: $TRASH_DIRECTORY
3685setup: cwd: $TRASH_DIRECTORY
3686setup: prefix: 23/sub/sub/
3687EOF
3688        test_repo 23/sub/sub "$TRASH_DIRECTORY/23/.git" "$TRASH_DIRECTORY"
3689'
3690
3691#
3692# case #24
3693#
3694############################################################
3695#
3696# Input:
3697#
3698#  - GIT_WORK_TREE is not set
3699#  - GIT_DIR is not set
3700#  - core.worktree is not set
3701#  - .git is a file
3702#  - core.bare is set
3703#
3704# Output:
3705#
3706# #16.2 except git_dir is set according to .git file
3707
3708test_expect_success '#24: setup' '
3709        sane_unset GIT_DIR GIT_WORK_TREE &&
3710        mkdir 24 24/sub &&
3711        cd 24 &&
3712        git init &&
3713        git config core.bare true &&
3714        mv .git ../24.git &&
3715        echo gitdir: ../24.git >.git &&
3716        cd ..
3717'
3718
3719test_expect_success '#24: at root' '
3720        cat >24/expected <<EOF &&
3721setup: git_dir: $TRASH_DIRECTORY/24.git
3722setup: worktree: (null)
3723setup: cwd: $TRASH_DIRECTORY/24
3724setup: prefix: (null)
3725EOF
3726        test_repo 24
3727'
3728
3729test_expect_success '#24: in subdir' '
3730        cat >24/sub/expected <<EOF &&
3731setup: git_dir: $TRASH_DIRECTORY/24.git
3732setup: worktree: (null)
3733setup: cwd: $TRASH_DIRECTORY/24/sub
3734setup: prefix: (null)
3735EOF
3736        test_repo 24/sub
3737'
3738
3739#
3740# case #25
3741#
3742############################################################
3743#
3744# Input:
3745#
3746#  - GIT_WORK_TREE is set
3747#  - GIT_DIR is not set
3748#  - core.worktree is not set
3749#  - .git is a file
3750#  - core.bare is set
3751#
3752# Output:
3753#
3754# #17.2 except git_dir is set according to .git file
3755
3756test_expect_success '#25: setup' '
3757        sane_unset GIT_DIR GIT_WORK_TREE &&
3758        mkdir 25 25/sub &&
3759        cd 25 &&
3760        git init &&
3761        git config core.bare true &&
3762        GIT_WORK_TREE=non-existent &&
3763        export GIT_WORK_TREE &&
3764        mv .git ../25.git &&
3765        echo gitdir: ../25.git >.git &&
3766        cd ..
3767'
3768
3769test_expect_success '#25: at root' '
3770        cat >25/expected <<EOF &&
3771setup: git_dir: $TRASH_DIRECTORY/25.git
3772setup: worktree: (null)
3773setup: cwd: $TRASH_DIRECTORY/25
3774setup: prefix: (null)
3775EOF
3776        test_repo 25
3777'
3778
3779test_expect_success '#25: in subdir' '
3780        cat >25/sub/expected <<EOF &&
3781setup: git_dir: $TRASH_DIRECTORY/25.git
3782setup: worktree: (null)
3783setup: cwd: $TRASH_DIRECTORY/25/sub
3784setup: prefix: (null)
3785EOF
3786        test_repo 25/sub
3787'
3788
3789#
3790# case #26
3791#
3792############################################################
3793#
3794# Input:
3795#
3796#  - GIT_WORK_TREE is not set
3797#  - GIT_DIR is set
3798#  - core.worktree is not set
3799#  - .git is a file
3800#  - core.bare is set
3801#
3802# Output:
3803#
3804# #18 except git_dir is set according to .git file
3805
3806test_expect_success '#26: setup' '
3807        sane_unset GIT_DIR GIT_WORK_TREE &&
3808        mkdir 26 26/sub &&
3809        cd 26 &&
3810        git init &&
3811        git config core.bare true &&
3812        mv .git ../26.git &&
3813        echo gitdir: ../26.git >.git &&
3814        cd ..
3815'
3816
3817test_expect_success '#26: (rel) at root' '
3818        cat >26/expected <<EOF &&
3819setup: git_dir: $TRASH_DIRECTORY/26.git
3820setup: worktree: (null)
3821setup: cwd: $TRASH_DIRECTORY/26
3822setup: prefix: (null)
3823EOF
3824         test_repo 26 .git
3825'
3826
3827test_expect_success '#26: at root' '
3828        cat >26/expected <<EOF &&
3829setup: git_dir: $TRASH_DIRECTORY/26.git
3830setup: worktree: (null)
3831setup: cwd: $TRASH_DIRECTORY/26
3832setup: prefix: (null)
3833EOF
3834         test_repo 26 "$TRASH_DIRECTORY/26/.git"
3835'
3836
3837test_expect_success '#26: (rel) in subdir' '
3838        cat >26/sub/expected <<EOF &&
3839setup: git_dir: $TRASH_DIRECTORY/26.git
3840setup: worktree: (null)
3841setup: cwd: $TRASH_DIRECTORY/26/sub
3842setup: prefix: (null)
3843EOF
3844        test_repo 26/sub ../.git
3845'
3846
3847test_expect_success '#26: in subdir' '
3848        cat >26/sub/expected <<EOF &&
3849setup: git_dir: $TRASH_DIRECTORY/26.git
3850setup: worktree: (null)
3851setup: cwd: $TRASH_DIRECTORY/26/sub
3852setup: prefix: (null)
3853EOF
3854        test_repo 26/sub "$TRASH_DIRECTORY/26/.git"
3855'
3856
3857#
3858# case #27
3859#
3860############################################################
3861#
3862# Input:
3863#
3864#  - GIT_WORK_TREE is set
3865#  - GIT_DIR is set
3866#  - .git is a file
3867#  - core.worktree is not set
3868#  - core.bare is set
3869#
3870# Output:
3871#
3872# #19 except git_dir is set according to .git file
3873
3874test_expect_success '#27: setup' '
3875        sane_unset GIT_DIR GIT_WORK_TREE &&
3876        mkdir 27 27/sub 27/sub/sub 27.wt 27.wt/sub 27/wt 27/wt/sub &&
3877        cd 27 &&
3878        git init &&
3879        git config core.bare true &&
3880        mv .git ../27.git &&
3881        echo gitdir: ../27.git >.git &&
3882        cd ..
3883'
3884
3885test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=root at root' '
3886        cat >27/expected <<EOF &&
3887setup: git_dir: $TRASH_DIRECTORY/27.git
3888setup: worktree: $TRASH_DIRECTORY/27
3889setup: cwd: $TRASH_DIRECTORY/27
3890setup: prefix: (null)
3891EOF
3892        test_repo 27 .git "$TRASH_DIRECTORY/27"
3893'
3894
3895test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' '
3896        cat >27/expected <<EOF &&
3897setup: git_dir: $TRASH_DIRECTORY/27.git
3898setup: worktree: $TRASH_DIRECTORY/27
3899setup: cwd: $TRASH_DIRECTORY/27
3900setup: prefix: (null)
3901EOF
3902        test_repo 27 .git .
3903'
3904
3905test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=root at root' '
3906        cat >27/expected <<EOF &&
3907setup: git_dir: $TRASH_DIRECTORY/27.git
3908setup: worktree: $TRASH_DIRECTORY/27
3909setup: cwd: $TRASH_DIRECTORY/27
3910setup: prefix: (null)
3911EOF
3912        test_repo 27 "$TRASH_DIRECTORY/27/.git" "$TRASH_DIRECTORY/27"
3913'
3914
3915test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=root(rel) at root' '
3916        cat >27/expected <<EOF &&
3917setup: git_dir: $TRASH_DIRECTORY/27.git
3918setup: worktree: $TRASH_DIRECTORY/27
3919setup: cwd: $TRASH_DIRECTORY/27
3920setup: prefix: (null)
3921EOF
3922        test_repo 27 "$TRASH_DIRECTORY/27/.git" .
3923'
3924
3925test_expect_success '#27: GIT_DIR(rel), GIT_WORKTREE=root in subdir' '
3926        cat >27/sub/sub/expected <<EOF &&
3927setup: git_dir: $TRASH_DIRECTORY/27.git
3928setup: worktree: $TRASH_DIRECTORY/27
3929setup: cwd: $TRASH_DIRECTORY/27
3930setup: prefix: sub/sub/
3931EOF
3932        test_repo 27/sub/sub ../../.git "$TRASH_DIRECTORY/27"
3933'
3934
3935test_expect_success '#27: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' '
3936        cat >27/sub/sub/expected <<EOF &&
3937setup: git_dir: $TRASH_DIRECTORY/27.git
3938setup: worktree: $TRASH_DIRECTORY/27
3939setup: cwd: $TRASH_DIRECTORY/27
3940setup: prefix: sub/sub/
3941EOF
3942        test_repo 27/sub/sub ../../.git ../..
3943'
3944
3945test_expect_success '#27: GIT_DIR, GIT_WORKTREE=root in subdir' '
3946        cat >27/sub/expected <<EOF &&
3947setup: git_dir: $TRASH_DIRECTORY/27.git
3948setup: worktree: $TRASH_DIRECTORY/27
3949setup: cwd: $TRASH_DIRECTORY/27
3950setup: prefix: sub/
3951EOF
3952        test_repo 27/sub "$TRASH_DIRECTORY/27/.git" "$TRASH_DIRECTORY/27"
3953'
3954
3955test_expect_success '#27: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' '
3956        cat >27/sub/sub/expected <<EOF &&
3957setup: git_dir: $TRASH_DIRECTORY/27.git
3958setup: worktree: $TRASH_DIRECTORY/27
3959setup: cwd: $TRASH_DIRECTORY/27
3960setup: prefix: sub/sub/
3961EOF
3962        test_repo 27/sub/sub "$TRASH_DIRECTORY/27/.git" ../..
3963'
3964
3965test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=wt at root' '
3966        cat >27/expected <<EOF &&
3967setup: git_dir: $TRASH_DIRECTORY/27.git
3968setup: worktree: $TRASH_DIRECTORY/27/wt
3969setup: cwd: $TRASH_DIRECTORY/27
3970setup: prefix: (null)
3971EOF
3972        test_repo 27 .git "$TRASH_DIRECTORY/27/wt"
3973'
3974
3975test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' '
3976        cat >27/expected <<EOF &&
3977setup: git_dir: $TRASH_DIRECTORY/27.git
3978setup: worktree: $TRASH_DIRECTORY/27/wt
3979setup: cwd: $TRASH_DIRECTORY/27
3980setup: prefix: (null)
3981EOF
3982        test_repo 27 .git wt
3983'
3984
3985test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' '
3986        cat >27/expected <<EOF &&
3987setup: git_dir: $TRASH_DIRECTORY/27.git
3988setup: worktree: $TRASH_DIRECTORY/27/wt
3989setup: cwd: $TRASH_DIRECTORY/27
3990setup: prefix: (null)
3991EOF
3992        test_repo 27 "$TRASH_DIRECTORY/27/.git" wt
3993'
3994
3995test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=wt at root' '
3996        cat >27/expected <<EOF &&
3997setup: git_dir: $TRASH_DIRECTORY/27.git
3998setup: worktree: $TRASH_DIRECTORY/27/wt
3999setup: cwd: $TRASH_DIRECTORY/27
4000setup: prefix: (null)
4001EOF
4002        test_repo 27 "$TRASH_DIRECTORY/27/.git" "$TRASH_DIRECTORY/27/wt"
4003'
4004
4005test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' '
4006        cat >27/sub/sub/expected <<EOF &&
4007setup: git_dir: $TRASH_DIRECTORY/27.git
4008setup: worktree: $TRASH_DIRECTORY/27/wt
4009setup: cwd: $TRASH_DIRECTORY/27/sub/sub
4010setup: prefix: (null)
4011EOF
4012        test_repo 27/sub/sub ../../.git "$TRASH_DIRECTORY/27/wt"
4013'
4014
4015test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' '
4016        cat >27/sub/sub/expected <<EOF &&
4017setup: git_dir: $TRASH_DIRECTORY/27.git
4018setup: worktree: $TRASH_DIRECTORY/27/wt
4019setup: cwd: $TRASH_DIRECTORY/27/sub/sub
4020setup: prefix: (null)
4021EOF
4022        test_repo 27/sub/sub ../../.git ../../wt
4023'
4024
4025test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' '
4026        cat >27/sub/sub/expected <<EOF &&
4027setup: git_dir: $TRASH_DIRECTORY/27.git
4028setup: worktree: $TRASH_DIRECTORY/27/wt
4029setup: cwd: $TRASH_DIRECTORY/27/sub/sub
4030setup: prefix: (null)
4031EOF
4032        test_repo 27/sub/sub "$TRASH_DIRECTORY/27/.git" ../../wt
4033'
4034
4035test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=wt in subdir' '
4036        cat >27/sub/sub/expected <<EOF &&
4037setup: git_dir: $TRASH_DIRECTORY/27.git
4038setup: worktree: $TRASH_DIRECTORY/27/wt
4039setup: cwd: $TRASH_DIRECTORY/27/sub/sub
4040setup: prefix: (null)
4041EOF
4042        test_repo 27/sub/sub "$TRASH_DIRECTORY/27/.git" "$TRASH_DIRECTORY/27/wt"
4043'
4044
4045test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=.. at root' '
4046        cat >27/expected <<EOF &&
4047setup: git_dir: $TRASH_DIRECTORY/27.git
4048setup: worktree: $TRASH_DIRECTORY
4049setup: cwd: $TRASH_DIRECTORY
4050setup: prefix: 27/
4051EOF
4052        test_repo 27 .git "$TRASH_DIRECTORY"
4053'
4054
4055test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' '
4056        cat >27/expected <<EOF &&
4057setup: git_dir: $TRASH_DIRECTORY/27.git
4058setup: worktree: $TRASH_DIRECTORY
4059setup: cwd: $TRASH_DIRECTORY
4060setup: prefix: 27/
4061EOF
4062        test_repo 27 .git ..
4063'
4064
4065test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=..(rel) at root' '
4066        cat >27/expected <<EOF &&
4067setup: git_dir: $TRASH_DIRECTORY/27.git
4068setup: worktree: $TRASH_DIRECTORY
4069setup: cwd: $TRASH_DIRECTORY
4070setup: prefix: 27/
4071EOF
4072        test_repo 27 "$TRASH_DIRECTORY/27/.git" ..
4073'
4074
4075test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=.. at root' '
4076        cat >27/expected <<EOF &&
4077setup: git_dir: $TRASH_DIRECTORY/27.git
4078setup: worktree: $TRASH_DIRECTORY
4079setup: cwd: $TRASH_DIRECTORY
4080setup: prefix: 27/
4081EOF
4082        test_repo 27 "$TRASH_DIRECTORY/27/.git" "$TRASH_DIRECTORY"
4083'
4084
4085test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' '
4086        cat >27/sub/sub/expected <<EOF &&
4087setup: git_dir: $TRASH_DIRECTORY/27.git
4088setup: worktree: $TRASH_DIRECTORY
4089setup: cwd: $TRASH_DIRECTORY
4090setup: prefix: 27/sub/sub/
4091EOF
4092        test_repo 27/sub/sub ../../.git "$TRASH_DIRECTORY"
4093'
4094
4095test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' '
4096        cat >27/sub/sub/expected <<EOF &&
4097setup: git_dir: $TRASH_DIRECTORY/27.git
4098setup: worktree: $TRASH_DIRECTORY
4099setup: cwd: $TRASH_DIRECTORY
4100setup: prefix: 27/sub/sub/
4101EOF
4102        test_repo 27/sub/sub ../../.git ../../..
4103'
4104
4105test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' '
4106        cat >27/sub/sub/expected <<EOF &&
4107setup: git_dir: $TRASH_DIRECTORY/27.git
4108setup: worktree: $TRASH_DIRECTORY
4109setup: cwd: $TRASH_DIRECTORY
4110setup: prefix: 27/sub/sub/
4111EOF
4112        test_repo 27/sub/sub "$TRASH_DIRECTORY/27/.git" ../../../
4113'
4114
4115test_expect_success '#27: GIT_DIR, GIT_WORK_TREE=.. in subdir' '
4116        cat >27/sub/sub/expected <<EOF &&
4117setup: git_dir: $TRASH_DIRECTORY/27.git
4118setup: worktree: $TRASH_DIRECTORY
4119setup: cwd: $TRASH_DIRECTORY
4120setup: prefix: 27/sub/sub/
4121EOF
4122        test_repo 27/sub/sub "$TRASH_DIRECTORY/27/.git" "$TRASH_DIRECTORY"
4123'
4124
4125#
4126# case #28
4127#
4128############################################################
4129#
4130# Input:
4131#
4132#  - GIT_WORK_TREE is not set
4133#  - GIT_DIR is not set
4134#  - core.worktree is set
4135#  - .git is a file
4136#  - core.bare is set
4137#
4138# Output:
4139#
4140# core.worktree is ignored -> #24
4141
4142test_expect_success '#28: setup' '
4143        sane_unset GIT_DIR GIT_WORK_TREE &&
4144        mkdir 28 28/sub &&
4145        cd 28 &&
4146        git init &&
4147        git config core.bare true &&
4148        git config core.worktree non-existent &&
4149        mv .git ../28.git &&
4150        echo gitdir: ../28.git >.git &&
4151        cd ..
4152'
4153
4154test_expect_success '#28: at root' '
4155        cat >28/expected <<EOF &&
4156setup: git_dir: $TRASH_DIRECTORY/28.git
4157setup: worktree: (null)
4158setup: cwd: $TRASH_DIRECTORY/28
4159setup: prefix: (null)
4160EOF
4161        test_repo 28
4162'
4163
4164test_expect_success '#28: in subdir' '
4165        cat >28/sub/expected <<EOF &&
4166setup: git_dir: $TRASH_DIRECTORY/28.git
4167setup: worktree: (null)
4168setup: cwd: $TRASH_DIRECTORY/28/sub
4169setup: prefix: (null)
4170EOF
4171        test_repo 28/sub
4172'
4173
4174#
4175# case #29
4176#
4177############################################################
4178#
4179# Input:
4180#
4181#  - GIT_WORK_TREE is set
4182#  - GIT_DIR is not set
4183#  - core.worktree is set
4184#  - .git is a file
4185#  - core.bare is set
4186#
4187# Output:
4188#
4189# GIT_WORK_TREE/core.worktree are ignored -> #28
4190
4191test_expect_success '#29: setup' '
4192        sane_unset GIT_DIR GIT_WORK_TREE &&
4193        mkdir 29 29/sub &&
4194        cd 29 &&
4195        git init &&
4196        git config core.bare true &&
4197        GIT_WORK_TREE=non-existent &&
4198        export GIT_WORK_TREE &&
4199        mv .git ../29.git &&
4200        echo gitdir: ../29.git >.git &&
4201        cd ..
4202'
4203
4204test_expect_success '#29: at root' '
4205        cat >29/expected <<EOF &&
4206setup: git_dir: $TRASH_DIRECTORY/29.git
4207setup: worktree: (null)
4208setup: cwd: $TRASH_DIRECTORY/29
4209setup: prefix: (null)
4210EOF
4211        test_repo 29
4212'
4213
4214test_expect_success '#29: in subdir' '
4215        cat >29/sub/expected <<EOF &&
4216setup: git_dir: $TRASH_DIRECTORY/29.git
4217setup: worktree: (null)
4218setup: cwd: $TRASH_DIRECTORY/29/sub
4219setup: prefix: (null)
4220EOF
4221        test_repo 29/sub
4222'
4223
4224#
4225# case #30
4226#
4227############################################################
4228#
4229# Input:
4230#
4231#  - GIT_WORK_TREE is not set
4232#  - GIT_DIR is set
4233#  - core.worktree is set
4234#  - .git is a file
4235#  - core.bare is set
4236#
4237# Output:
4238#
4239# core.worktree and core.bare conflict, won't fly.
4240
4241test_expect_success '#30: setup' '
4242        sane_unset GIT_DIR GIT_WORK_TREE &&
4243        mkdir 30 &&
4244        cd 30 &&
4245        git init &&
4246        git config core.bare true &&
4247        git config core.worktree non-existent &&
4248        mv .git ../30.git &&
4249        echo gitdir: ../30.git >.git &&
4250        cd ..
4251'
4252
4253test_expect_success '#30: at root' '
4254        (
4255        cd 30 &&
4256        GIT_DIR=.git &&
4257        export GIT_DIR &&
4258        test_must_fail git symbolic-ref HEAD 2>result &&
4259        grep "core.bare and core.worktree do not make sense" result
4260        )
4261'
4262
4263#
4264# case #31
4265#
4266############################################################
4267#
4268# Input:
4269#
4270#  - GIT_WORK_TREE is set
4271#  - GIT_DIR is set
4272#  - core.worktree is set
4273#  - .git is a file
4274#  - core.bare is set
4275#
4276# Output:
4277#
4278# #23 except git_dir is set according to .git file
4279
4280test_expect_success '#31: setup' '
4281        sane_unset GIT_DIR GIT_WORK_TREE &&
4282        mkdir 31 31/sub 31/sub/sub 31.wt 31.wt/sub 31/wt 31/wt/sub &&
4283        cd 31 &&
4284        git init &&
4285        git config core.bare true &&
4286        git config core.worktree non-existent &&
4287        mv .git ../31.git &&
4288        echo gitdir: ../31.git >.git &&
4289        cd ..
4290'
4291
4292test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=root at root' '
4293        cat >31/expected <<EOF &&
4294setup: git_dir: $TRASH_DIRECTORY/31.git
4295setup: worktree: $TRASH_DIRECTORY/31
4296setup: cwd: $TRASH_DIRECTORY/31
4297setup: prefix: (null)
4298EOF
4299        test_repo 31 .git "$TRASH_DIRECTORY/31"
4300'
4301
4302test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=root(rel) at root' '
4303        cat >31/expected <<EOF &&
4304setup: git_dir: $TRASH_DIRECTORY/31.git
4305setup: worktree: $TRASH_DIRECTORY/31
4306setup: cwd: $TRASH_DIRECTORY/31
4307setup: prefix: (null)
4308EOF
4309        test_repo 31 .git .
4310'
4311
4312test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=root at root' '
4313        cat >31/expected <<EOF &&
4314setup: git_dir: $TRASH_DIRECTORY/31.git
4315setup: worktree: $TRASH_DIRECTORY/31
4316setup: cwd: $TRASH_DIRECTORY/31
4317setup: prefix: (null)
4318EOF
4319        test_repo 31 "$TRASH_DIRECTORY/31/.git" "$TRASH_DIRECTORY/31"
4320'
4321
4322test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=root(rel) at root' '
4323        cat >31/expected <<EOF &&
4324setup: git_dir: $TRASH_DIRECTORY/31.git
4325setup: worktree: $TRASH_DIRECTORY/31
4326setup: cwd: $TRASH_DIRECTORY/31
4327setup: prefix: (null)
4328EOF
4329        test_repo 31 "$TRASH_DIRECTORY/31/.git" .
4330'
4331
4332test_expect_success '#31: GIT_DIR(rel), GIT_WORKTREE=root in subdir' '
4333        cat >31/sub/sub/expected <<EOF &&
4334setup: git_dir: $TRASH_DIRECTORY/31.git
4335setup: worktree: $TRASH_DIRECTORY/31
4336setup: cwd: $TRASH_DIRECTORY/31
4337setup: prefix: sub/sub/
4338EOF
4339        test_repo 31/sub/sub ../../.git "$TRASH_DIRECTORY/31"
4340'
4341
4342test_expect_success '#31: GIT_DIR(rel), GIT_WORKTREE=root(rel) in subdir' '
4343        cat >31/sub/sub/expected <<EOF &&
4344setup: git_dir: $TRASH_DIRECTORY/31.git
4345setup: worktree: $TRASH_DIRECTORY/31
4346setup: cwd: $TRASH_DIRECTORY/31
4347setup: prefix: sub/sub/
4348EOF
4349        test_repo 31/sub/sub ../../.git ../..
4350'
4351
4352test_expect_success '#31: GIT_DIR, GIT_WORKTREE=root in subdir' '
4353        cat >31/sub/expected <<EOF &&
4354setup: git_dir: $TRASH_DIRECTORY/31.git
4355setup: worktree: $TRASH_DIRECTORY/31
4356setup: cwd: $TRASH_DIRECTORY/31
4357setup: prefix: sub/
4358EOF
4359        test_repo 31/sub "$TRASH_DIRECTORY/31/.git" "$TRASH_DIRECTORY/31"
4360'
4361
4362test_expect_success '#31: GIT_DIR, GIT_WORKTREE=root(rel) in subdir' '
4363        cat >31/sub/sub/expected <<EOF &&
4364setup: git_dir: $TRASH_DIRECTORY/31.git
4365setup: worktree: $TRASH_DIRECTORY/31
4366setup: cwd: $TRASH_DIRECTORY/31
4367setup: prefix: sub/sub/
4368EOF
4369        test_repo 31/sub/sub "$TRASH_DIRECTORY/31/.git" ../..
4370'
4371
4372test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=wt at root' '
4373        cat >31/expected <<EOF &&
4374setup: git_dir: $TRASH_DIRECTORY/31.git
4375setup: worktree: $TRASH_DIRECTORY/31/wt
4376setup: cwd: $TRASH_DIRECTORY/31
4377setup: prefix: (null)
4378EOF
4379        test_repo 31 .git "$TRASH_DIRECTORY/31/wt"
4380'
4381
4382test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) at root' '
4383        cat >31/expected <<EOF &&
4384setup: git_dir: $TRASH_DIRECTORY/31.git
4385setup: worktree: $TRASH_DIRECTORY/31/wt
4386setup: cwd: $TRASH_DIRECTORY/31
4387setup: prefix: (null)
4388EOF
4389        test_repo 31 .git wt
4390'
4391
4392test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=wt(rel) at root' '
4393        cat >31/expected <<EOF &&
4394setup: git_dir: $TRASH_DIRECTORY/31.git
4395setup: worktree: $TRASH_DIRECTORY/31/wt
4396setup: cwd: $TRASH_DIRECTORY/31
4397setup: prefix: (null)
4398EOF
4399        test_repo 31 "$TRASH_DIRECTORY/31/.git" wt
4400'
4401
4402test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=wt at root' '
4403        cat >31/expected <<EOF &&
4404setup: git_dir: $TRASH_DIRECTORY/31.git
4405setup: worktree: $TRASH_DIRECTORY/31/wt
4406setup: cwd: $TRASH_DIRECTORY/31
4407setup: prefix: (null)
4408EOF
4409        test_repo 31 "$TRASH_DIRECTORY/31/.git" "$TRASH_DIRECTORY/31/wt"
4410'
4411
4412test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=wt in subdir' '
4413        cat >31/sub/sub/expected <<EOF &&
4414setup: git_dir: $TRASH_DIRECTORY/31.git
4415setup: worktree: $TRASH_DIRECTORY/31/wt
4416setup: cwd: $TRASH_DIRECTORY/31/sub/sub
4417setup: prefix: (null)
4418EOF
4419        test_repo 31/sub/sub ../../.git "$TRASH_DIRECTORY/31/wt"
4420'
4421
4422test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=wt(rel) in subdir' '
4423        cat >31/sub/sub/expected <<EOF &&
4424setup: git_dir: $TRASH_DIRECTORY/31.git
4425setup: worktree: $TRASH_DIRECTORY/31/wt
4426setup: cwd: $TRASH_DIRECTORY/31/sub/sub
4427setup: prefix: (null)
4428EOF
4429        test_repo 31/sub/sub ../../.git ../../wt
4430'
4431
4432test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=wt(rel) in subdir' '
4433        cat >31/sub/sub/expected <<EOF &&
4434setup: git_dir: $TRASH_DIRECTORY/31.git
4435setup: worktree: $TRASH_DIRECTORY/31/wt
4436setup: cwd: $TRASH_DIRECTORY/31/sub/sub
4437setup: prefix: (null)
4438EOF
4439        test_repo 31/sub/sub "$TRASH_DIRECTORY/31/.git" ../../wt
4440'
4441
4442test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=wt in subdir' '
4443        cat >31/sub/sub/expected <<EOF &&
4444setup: git_dir: $TRASH_DIRECTORY/31.git
4445setup: worktree: $TRASH_DIRECTORY/31/wt
4446setup: cwd: $TRASH_DIRECTORY/31/sub/sub
4447setup: prefix: (null)
4448EOF
4449        test_repo 31/sub/sub "$TRASH_DIRECTORY/31/.git" "$TRASH_DIRECTORY/31/wt"
4450'
4451
4452test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=.. at root' '
4453        cat >31/expected <<EOF &&
4454setup: git_dir: $TRASH_DIRECTORY/31.git
4455setup: worktree: $TRASH_DIRECTORY
4456setup: cwd: $TRASH_DIRECTORY
4457setup: prefix: 31/
4458EOF
4459        test_repo 31 .git "$TRASH_DIRECTORY"
4460'
4461
4462test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=..(rel) at root' '
4463        cat >31/expected <<EOF &&
4464setup: git_dir: $TRASH_DIRECTORY/31.git
4465setup: worktree: $TRASH_DIRECTORY
4466setup: cwd: $TRASH_DIRECTORY
4467setup: prefix: 31/
4468EOF
4469        test_repo 31 .git ..
4470'
4471
4472test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=..(rel) at root' '
4473        cat >31/expected <<EOF &&
4474setup: git_dir: $TRASH_DIRECTORY/31.git
4475setup: worktree: $TRASH_DIRECTORY
4476setup: cwd: $TRASH_DIRECTORY
4477setup: prefix: 31/
4478EOF
4479        test_repo 31 "$TRASH_DIRECTORY/31/.git" ..
4480'
4481
4482test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=.. at root' '
4483        cat >31/expected <<EOF &&
4484setup: git_dir: $TRASH_DIRECTORY/31.git
4485setup: worktree: $TRASH_DIRECTORY
4486setup: cwd: $TRASH_DIRECTORY
4487setup: prefix: 31/
4488EOF
4489        test_repo 31 "$TRASH_DIRECTORY/31/.git" "$TRASH_DIRECTORY"
4490'
4491
4492test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=.. in subdir' '
4493        cat >31/sub/sub/expected <<EOF &&
4494setup: git_dir: $TRASH_DIRECTORY/31.git
4495setup: worktree: $TRASH_DIRECTORY
4496setup: cwd: $TRASH_DIRECTORY
4497setup: prefix: 31/sub/sub/
4498EOF
4499        test_repo 31/sub/sub ../../.git "$TRASH_DIRECTORY"
4500'
4501
4502test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=..(rel) in subdir' '
4503        cat >31/sub/sub/expected <<EOF &&
4504setup: git_dir: $TRASH_DIRECTORY/31.git
4505setup: worktree: $TRASH_DIRECTORY
4506setup: cwd: $TRASH_DIRECTORY
4507setup: prefix: 31/sub/sub/
4508EOF
4509        test_repo 31/sub/sub ../../.git ../../..
4510'
4511
4512test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=..(rel) in subdir' '
4513        cat >31/sub/sub/expected <<EOF &&
4514setup: git_dir: $TRASH_DIRECTORY/31.git
4515setup: worktree: $TRASH_DIRECTORY
4516setup: cwd: $TRASH_DIRECTORY
4517setup: prefix: 31/sub/sub/
4518EOF
4519        test_repo 31/sub/sub "$TRASH_DIRECTORY/31/.git" ../../../
4520'
4521
4522test_expect_success '#31: GIT_DIR, GIT_WORK_TREE=.. in subdir' '
4523        cat >31/sub/sub/expected <<EOF &&
4524setup: git_dir: $TRASH_DIRECTORY/31.git
4525setup: worktree: $TRASH_DIRECTORY
4526setup: cwd: $TRASH_DIRECTORY
4527setup: prefix: 31/sub/sub/
4528EOF
4529        test_repo 31/sub/sub "$TRASH_DIRECTORY/31/.git" "$TRASH_DIRECTORY"
4530'
4531
4532test_done