9324d3ff6c513e743618c7ee964a7289e9a1ff4b
   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        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        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_failure '#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_failure '#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
 155test_done