From 786dabecd4766bfda0083491ef543e3b5d1d9f39 Mon Sep 17 00:00:00 2001 From: Jonathan Nieder Date: Wed, 19 Jan 2011 06:40:51 -0600 Subject: [PATCH] tests: compress the setup tests New test helpers: - setup_repo, to initialize a repository or gitfile pointing to a repository, with core.bare and core.worktree set as specified; - try_case, to run setup from a given directory and validate the result, with GIT_DIR and GIT_WORK_TREE set as specified; - try_repo, to initialize a repository and call "try_case" from the toplevel and a subdirectory; - run_wt_tests, to run a battery of tests that check for sane behavior when GIT_WORK_TREE is set to various positions relative to the .git dir and cwd. Use these helpers to make the test shorter, less repetitive, and (one hopes) easier to understand and modify. Signed-off-by: Jonathan Nieder Signed-off-by: Junio C Hamano --- t/t1510-repo-setup.sh | 5033 +++++------------------------------------ 1 file changed, 625 insertions(+), 4408 deletions(-) diff --git a/t/t1510-repo-setup.sh b/t/t1510-repo-setup.sh index f42f206547..4f8f9760a5 100755 --- a/t/t1510-repo-setup.sh +++ b/t/t1510-repo-setup.sh @@ -37,6 +37,8 @@ A few rules for repo setup: " . ./test-lib.sh +here=$(pwd) + test_repo () { ( cd "$1" && @@ -57,4483 +59,698 @@ test_repo () { ) } -# Bit 0 = GIT_WORK_TREE -# Bit 1 = GIT_DIR -# Bit 2 = core.worktree -# Bit 3 = .git is a file -# Bit 4 = bare repo -# Case# = encoding of the above 5 bits - -# -# Case #0 -# -############################################################ -# -# Input: -# -# - GIT_WORK_TREE is not set -# - GIT_DIR is not set -# - core.worktree is not set -# - .git is a directory -# - core.bare is not set, cwd is outside .git -# -# Output: -# -# - worktree is .git's parent directory -# - cwd is at worktree root dir -# - prefix is calculated -# - git_dir is set to ".git" -# - cwd can't be outside worktree - -test_expect_success '#0: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 0 0/sub && - (cd 0 && git init) && - here=$(pwd) -' - -test_expect_success '#0: at root' ' - cat >0/expected <0/sub/expected < #0 - -test_expect_success '#1: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 1 1/sub 1.wt 1.wt/sub 1/wt 1/wt/sub && - cd 1 && - git init && - GIT_WORK_TREE=non-existent && - export GIT_WORK_TREE && - cd .. -' - -test_expect_success '#1: at root' ' - cat >1/expected <1/sub/expected <2/expected <2/sub/expected <2/expected <2/sub/expected <3/expected <3/expected <3/expected <3/expected <3/sub/sub/expected <3/sub/sub/expected <3/sub/expected <3/sub/sub/expected <3/expected <3/expected <3/expected <3/expected <3/sub/sub/expected <3/sub/sub/expected <3/sub/sub/expected <3/sub/sub/expected <3/expected <3/expected <3/expected <3/expected <3/sub/sub/expected <3/sub/sub/expected <3/sub/sub/expected <3/sub/sub/expected < #0 - -test_expect_success '#4: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 4 4/sub && - cd 4 && - git init && - git config core.worktree non-existent && - cd .. -' - -test_expect_success '#4: at root' ' - cat >4/expected <4/sub/expected < #0 +maybe_config () { + file=$1 var=$2 value=$3 && + if test "$value" != unset + then + git config --file="$file" "$var" "$value" + fi +} -test_expect_success '#5: setup' ' +setup_repo () { + name=$1 worktreecfg=$2 gitfile=$3 barecfg=$4 && sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 5 5/sub && - cd 5 && - git init && - git config core.worktree non-existent && - GIT_WORK_TREE=non-existent-too && - export GIT_WORK_TREE && - cd .. -' -test_expect_success '#5: at root' ' - cat >5/expected <5/sub/expected <"$name/.git" + fi +} -# -# case #6 -# -############################################################ -# -# Input: -# -# - GIT_WORK_TREE is not set -# - GIT_DIR is set -# - core.worktree is set -# - .git is a directory -# - core.bare is not set, cwd is outside .git -# -# Output: -# -# - worktree is at core.worktree -# - cwd is at worktree root -# - prefix is calculated -# - git_dir is at $GIT_DIR -# - cwd can be outside worktree +maybe_set () { + var=$1 value=$2 && + if test "$value" != unset + then + eval "$var=\$value" && + export $var + fi +} -test_expect_success '#6: setup' ' +setup_env () { + worktreenv=$1 gitdirenv=$2 && sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 6 6/sub 6/sub/sub 6.wt 6.wt/sub 6/wt 6/wt/sub && - cd 6 && git init && cd .. -' - -test_expect_success '#6: GIT_DIR(rel), core.worktree=.. at root' ' - cat >6/expected <6/expected <6/expected <6/expected <6/sub/sub/expected <6/sub/sub/expected <6/sub/expected <6/sub/sub/expected <6/expected <6/expected <6/expected <6/expected <6/sub/sub/expected <6/sub/sub/expected <6/sub/sub/expected <6/sub/sub/expected <"$1/expected" <<-EOF + setup: git_dir: $2 + setup: worktree: $3 + setup: cwd: $4 + setup: prefix: $5 + EOF +} -test_expect_success '#6: GIT_DIR(rel), core.worktree=../.. at root' ' - cat >6/expected <6/expected <6/expected <6/expected <6/sub/sub/expected <6/sub/sub/expected <6/sub/sub/expected <6/sub/sub/expected < #3 - +test_expect_success '#3: setup' ' + setup_repo 3 unset "" unset && + mkdir -p 3/sub/sub 3/wt/sub +' +run_wt_tests 3 + +test_expect_success '#4: core.worktree without GIT_DIR set is ignored' ' + try_repo 4 unset unset non-existent "" unset \ + .git "$here/4" "$here/4" "(null)" \ + .git "$here/4" "$here/4" sub/ +' + +test_expect_success '#5: core.worktree + GIT_WORK_TREE is still ignored' ' + # or: you cannot intimidate away the lack of GIT_DIR setting + try_repo 5 non-existent-too unset non-existent "" unset \ + .git "$here/5" "$here/5" "(null)" \ + .git "$here/5" "$here/5" sub/ +' + +test_expect_success '#6: setting GIT_DIR brings core.worktree to life' ' + setup_repo 6 "$here/6" "" unset && + try_case 6 unset .git \ + .git "$here/6" "$here/6" "(null)" && + try_case 6 unset "$here/6/.git" \ + "$here/6/.git" "$here/6" "$here/6" "(null)" && + try_case 6/sub/sub unset ../../.git \ + "$here/6/.git" "$here/6" "$here/6" sub/sub/ && + try_case 6/sub/sub unset "$here/6/.git" \ + "$here/6/.git" "$here/6" "$here/6" sub/sub/ +' + +test_expect_success '#6b: GIT_DIR set, core.worktree relative' ' + setup_repo 6b .. "" unset && + try_case 6b unset .git \ + .git "$here/6b" "$here/6b" "(null)" && + try_case 6b unset "$here/6b/.git" \ + "$here/6b/.git" "$here/6b" "$here/6b" "(null)" && + try_case 6b/sub/sub unset ../../.git \ + "$here/6b/.git" "$here/6b" "$here/6b" sub/sub/ && + try_case 6b/sub/sub unset "$here/6b/.git" \ + "$here/6b/.git" "$here/6b" "$here/6b" sub/sub/ +' + +test_expect_success '#6c: GIT_DIR set, core.worktree=../wt (absolute)' ' + setup_repo 6c "$here/6c/wt" "" unset && + mkdir -p 6c/wt/sub && + + try_case 6c unset .git \ + .git "$here/6c/wt" "$here/6c" "(null)" && + try_case 6c unset "$here/6c/.git" \ + "$here/6c/.git" "$here/6c/wt" "$here/6c" "(null)" && + try_case 6c/sub/sub unset ../../.git \ + ../../.git "$here/6c/wt" "$here/6c/sub/sub" "(null)" && + try_case 6c/sub/sub unset "$here/6c/.git" \ + "$here/6c/.git" "$here/6c/wt" "$here/6c/sub/sub" "(null)" +' + +test_expect_success '#6d: GIT_DIR set, core.worktree=../wt (relative)' ' + setup_repo 6d "$here/6d/wt" "" unset && + mkdir -p 6d/wt/sub && + + try_case 6d unset .git \ + .git "$here/6d/wt" "$here/6d" "(null)" && + try_case 6d unset "$here/6d/.git" \ + "$here/6d/.git" "$here/6d/wt" "$here/6d" "(null)" && + try_case 6d/sub/sub unset ../../.git \ + ../../.git "$here/6d/wt" "$here/6d/sub/sub" "(null)" && + try_case 6d/sub/sub unset "$here/6d/.git" \ + "$here/6d/.git" "$here/6d/wt" "$here/6d/sub/sub" "(null)" +' + +test_expect_success '#6e: GIT_DIR set, core.worktree=../.. (absolute)' ' + setup_repo 6e "$here" "" unset && + try_case 6e unset .git \ + "$here/6e/.git" "$here" "$here" 6e/ && + try_case 6e unset "$here/6e/.git" \ + "$here/6e/.git" "$here" "$here" 6e/ && + try_case 6e/sub/sub unset ../../.git \ + "$here/6e/.git" "$here" "$here" 6e/sub/sub/ && + try_case 6e/sub/sub unset "$here/6e/.git" \ + "$here/6e/.git" "$here" "$here" 6e/sub/sub/ +' + +test_expect_success '#6f: GIT_DIR set, core.worktree=../.. (relative)' ' + setup_repo 6f ../../ "" unset && + try_case 6f unset .git \ + "$here/6f/.git" "$here" "$here" 6f/ && + try_case 6f unset "$here/6f/.git" \ + "$here/6f/.git" "$here" "$here" 6f/ && + try_case 6f/sub/sub unset ../../.git \ + "$here/6f/.git" "$here" "$here" 6f/sub/sub/ && + try_case 6f/sub/sub unset "$here/6f/.git" \ + "$here/6f/.git" "$here" "$here" 6f/sub/sub/ +' + +# case #7: GIT_WORK_TREE overrides core.worktree. test_expect_success '#7: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 7 7/sub 7/sub/sub 7.wt 7.wt/sub 7/wt 7/wt/sub && - cd 7 && - git init && - git config core.worktree non-existent && - cd .. -' - -test_expect_success '#7: GIT_DIR(rel), GIT_WORK_TREE=root at root' ' - cat >7/expected <7/expected <7/expected <7/expected <7/sub/sub/expected <7/sub/sub/expected <7/sub/expected <7/sub/sub/expected <7/expected <7/expected <7/expected <7/expected <7/sub/sub/expected <7/sub/sub/expected <7/sub/sub/expected <7/sub/sub/expected <7/expected <7/expected <7/expected <7/expected <7/sub/sub/expected <7/sub/sub/expected <7/sub/sub/expected <7/sub/sub/expected <.git && - cd .. -' - -test_expect_success '#8: at root' ' - cat >8/expected <8/sub/expected <.git && - GIT_WORK_TREE=non-existent && - export GIT_WORK_TREE && - cd .. -' - -test_expect_success '#9: at root' ' - cat >9/expected <9/sub/expected <.git && - cd .. + setup_repo 7 non-existent "" unset && + mkdir -p 7/sub/sub 7/wt/sub ' +run_wt_tests 7 -test_expect_success '#10: at root' ' - cat >10/expected <10/sub/expected <10/expected <10/sub/expected <.git && - cd .. -' - -test_expect_success '#11: GIT_DIR(rel), GIT_WORK_TREE=root at root' ' - cat >11/expected <11/expected <11/expected <11/expected <11/sub/sub/expected <11/sub/sub/expected <11/sub/expected <11/sub/sub/expected <11/expected <11/expected <11/expected <11/expected <11/sub/sub/expected <11/sub/sub/expected <11/sub/sub/expected <11/sub/sub/expected <11/expected <11/expected <11/expected <result + ) && + ( + cd 22 && + GIT_DIR=.git && + export GIT_DIR && + test_must_fail git symbolic-ref HEAD 2>result + ) && + grep "core.bare and core.worktree" 22/.git/result && + grep "core.bare and core.worktree" 22/result ' -test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=.. at root' ' - cat >11/expected <11/sub/sub/expected <11/sub/sub/expected <11/sub/sub/expected < gitfile case)' ' + try_repo 26 unset "$here/26/.git" unset gitfile true \ + "$here/26.git" "(null)" "$here/26" "(null)" \ + "$here/26.git" "(null)" "$here/26/sub" "(null)" && + try_repo 26b unset .git unset gitfile true \ + "$here/26b.git" "(null)" "$here/26b" "(null)" \ + "$here/26b.git" "(null)" "$here/26b/sub" "(null)" ' -test_expect_success '#11: GIT_DIR, GIT_WORK_TREE=.. in subdir' ' - cat >11/sub/sub/expected <.git && - cd .. +test_expect_success '#28: core.worktree ignored if GIT_DIR unset (bare gitfile case)' ' + try_repo 28 unset unset non-existent gitfile true \ + "$here/28.git" "(null)" "$here/28" "(null)" \ + "$here/28.git" "(null)" "$here/28/sub" "(null)" ' -test_expect_success '#12: at root' ' - cat >12/expected <12/sub/expected <result + ) && + grep "core.bare and core.worktree" 30/result ' -# -# case #13 -# -############################################################ -# -# Input: -# -# - GIT_WORK_TREE is set -# - GIT_DIR is not set -# - core.worktree is set -# - .git is a file -# - core.bare is not set, cwd is outside .git -# -# Output: -# -# #5 except that git_dir is set by .git file - -test_expect_success '#13: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 13 13/sub 13/sub/sub 13.wt 13.wt/sub 13/wt 13/wt/sub && - cd 13 && - git init && - git config core.worktree non-existent && - GIT_WORK_TREE=non-existent-too && - export GIT_WORK_TREE && - mv .git ../13.git && - echo gitdir: ../13.git >.git && - cd .. -' - -test_expect_success '#13: at root' ' - cat >13/expected <13/sub/expected <.git && - cd .. -' - -test_expect_success '#14: GIT_DIR(rel), core.worktree=../14 at root' ' - cat >14/expected <14/expected <14/expected <14/expected <14/sub/sub/expected <14/sub/sub/expected <14/sub/expected <14/sub/sub/expected <14/expected <14/expected <14/expected <14/expected <14/sub/sub/expected <14/sub/sub/expected <14/sub/sub/expected <14/sub/sub/expected <14/expected <14/expected <14/expected <14/expected <14/sub/sub/expected <14/sub/sub/expected <14/sub/sub/expected <14/sub/sub/expected <.git && - cd .. -' - -test_expect_success '#15: GIT_DIR(rel), GIT_WORK_TREE=root at root' ' - cat >15/expected <15/expected <15/expected <15/expected <15/sub/sub/expected <15/sub/sub/expected <15/sub/expected <15/sub/sub/expected <15/expected <15/expected <15/expected <15/expected <15/sub/sub/expected <15/sub/sub/expected <15/sub/sub/expected <15/sub/sub/expected <15/expected <15/expected <15/expected <15/expected <15/sub/sub/expected <15/sub/sub/expected <15/sub/sub/expected <15/sub/sub/expected <16/.git/expected <16/.git/wt/expected <16/.git/wt/sub/expected <16/.git/expected <16/.git/wt/expected <16/.git/wt/sub/expected <16/expected <16/sub/expected < #16.1 (with warnings perhaps) - -test_expect_success '#17.1: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 17 17/sub && - cd 17 && - git init && - mkdir .git/wt .git/wt/sub && - GIT_WORK_TREE=non-existent && - export GIT_WORK_TREE && - cd .. -' - -test_expect_success '#17.1: at .git' ' - cat >17/.git/expected <17/.git/wt/expected <17/.git/wt/sub/expected < #16.2 (with warnings perhaps) - -test_expect_success '#17.2: setup' ' - git config --file="$here/17/.git/config" core.bare true -' - -test_expect_success '#17.2: at .git' ' - cat >17/.git/expected <17/.git/wt/expected <17/.git/wt/sub/expected <17/expected <17/sub/expected <18/expected <18/expected <18/sub/expected <18/sub/expected < #3 - -test_expect_success '#19: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 19 19/sub 19/sub/sub 19.wt 19.wt/sub 19/wt 19/wt/sub && - cd 19 && - git init && - git config core.bare true && - cd .. -' - -test_expect_success '#19: GIT_DIR(rel), GIT_WORK_TREE=root at root' ' - cat >19/expected <19/expected <19/expected <19/expected <19/sub/sub/expected <19/sub/sub/expected <19/sub/expected <19/sub/sub/expected <19/expected <19/expected <19/expected <19/expected <19/sub/sub/expected <19/sub/sub/expected <19/sub/sub/expected <19/sub/sub/expected <19/expected <19/expected <19/expected <19/expected <19/sub/sub/expected <19/sub/sub/expected <19/sub/sub/expected <19/sub/sub/expected < #16.1 - -test_expect_success '#20.1: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 20 20/sub && - cd 20 && - git init && - git config core.worktree non-existent && - mkdir .git/wt .git/wt/sub && - cd .. -' - -test_expect_success '#20.1: at .git' ' - cat >20/.git/expected <20/.git/wt/expected <20/.git/wt/sub/expected < #16.2 - -test_expect_success '#20.2: setup' ' - git config --file="$here/20/.git/config" core.bare true -' - -test_expect_success '#20.2: at .git' ' - cat >20/.git/expected <20/.git/wt/expected <20/.git/wt/sub/expected <20/expected <20/sub/expected < #20.1 - -test_expect_success '#21.1: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 21 21/sub && - cd 21 && - git init && - git config core.worktree non-existent && - GIT_WORK_TREE=non-existent-too && - export GIT_WORK_TREE && - mkdir .git/wt .git/wt/sub && - cd .. -' - -test_expect_success '#21.1: at .git' ' - cat >21/.git/expected <21/.git/wt/expected <21/.git/wt/sub/expected < #20.2 - -test_expect_success '#21.2: setup' ' - git config --file="$here/21/.git/config" core.bare true -' - -test_expect_success '#21.2: at .git' ' - cat >21/.git/expected <21/.git/wt/expected <21/.git/wt/sub/expected <21/expected <21/sub/expected <22/.git/expected <22/.git/expected <22/.git/expected <22/.git/expected <22/.git/sub/expected <22/.git/sub/expected <22/.git/sub/expected <22/.git/sub/expected <22/.git/expected <22/.git/expected <22/.git/expected <22/.git/expected <22/.git/sub/expected <22/.git/sub/expected <22/.git/sub/expected <22/.git/sub/expected <22/.git/expected <22/.git/expected <22/.git/expected <22/.git/expected <22/.git/sub/expected <22/.git/sub/expected <22/.git/sub/expected <22/.git/sub/expected <result && - grep "core.bare and core.worktree do not make sense" result - ) -' - -test_expect_success '#22.2: at root' ' - ( - cd 22 && - GIT_DIR=.git && - export GIT_DIR && - test_must_fail git symbolic-ref HEAD 2>result && - grep "core.bare and core.worktree do not make sense" result - ) -' - -# -# case #23 -# -############################################################ -# -# Input: -# -# - GIT_WORK_TREE is set -# - GIT_DIR is set -# - core.worktree is set -# - .git is a directory -# - core.bare is set -# -# Output: -# -# core.worktree is overridden by GIT_WORK_TREE -> #19 - -test_expect_success '#23: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 23 23/sub 23/sub/sub 23.wt 23.wt/sub 23/wt 23/wt/sub && - cd 23 && - git init && - git config core.bare true && - git config core.worktree non-existent && - cd .. -' - -test_expect_success '#23: GIT_DIR(rel), GIT_WORK_TREE=root at root' ' - cat >23/expected <23/expected <23/expected <23/expected <23/sub/sub/expected <23/sub/sub/expected <23/sub/expected <23/sub/sub/expected <23/expected <23/expected <23/expected <23/expected <23/sub/sub/expected <23/sub/sub/expected <23/sub/sub/expected <23/sub/sub/expected <23/expected <23/expected <23/expected <23/expected <23/sub/sub/expected <23/sub/sub/expected <23/sub/sub/expected <23/sub/sub/expected <.git && - cd .. -' - -test_expect_success '#24: at root' ' - cat >24/expected <24/sub/expected <.git && - cd .. -' - -test_expect_success '#25: at root' ' - cat >25/expected <25/sub/expected <.git && - cd .. -' - -test_expect_success '#26: (rel) at root' ' - cat >26/expected <26/expected <26/sub/expected <26/sub/expected <.git && - cd .. -' - -test_expect_success '#27: GIT_DIR(rel), GIT_WORK_TREE=root at root' ' - cat >27/expected <27/expected <27/expected <27/expected <27/sub/sub/expected <27/sub/sub/expected <27/sub/expected <27/sub/sub/expected <27/expected <27/expected <27/expected <27/expected <27/sub/sub/expected <27/sub/sub/expected <27/sub/sub/expected <27/sub/sub/expected <27/expected <27/expected <27/expected <27/expected <27/sub/sub/expected <27/sub/sub/expected <27/sub/sub/expected <27/sub/sub/expected < #24 - -test_expect_success '#28: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 28 28/sub && - cd 28 && - git init && - git config core.bare true && - git config core.worktree non-existent && - mv .git ../28.git && - echo gitdir: ../28.git >.git && - cd .. -' - -test_expect_success '#28: at root' ' - cat >28/expected <28/sub/expected < #28 - -test_expect_success '#29: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 29 29/sub && - cd 29 && - git init && - git config core.bare true && - GIT_WORK_TREE=non-existent && - export GIT_WORK_TREE && - mv .git ../29.git && - echo gitdir: ../29.git >.git && - cd .. -' - -test_expect_success '#29: at root' ' - cat >29/expected <29/sub/expected <.git && - cd .. -' - -test_expect_success '#30: at root' ' - ( - cd 30 && - GIT_DIR=.git && - export GIT_DIR && - test_must_fail git symbolic-ref HEAD 2>result && - grep "core.bare and core.worktree do not make sense" result - ) -' - -# -# case #31 -# -############################################################ -# -# Input: -# -# - GIT_WORK_TREE is set -# - GIT_DIR is set -# - core.worktree is set -# - .git is a file -# - core.bare is set -# -# Output: -# -# #23 except git_dir is set according to .git file - +# Case #31: GIT_DIR + GIT_WORK_TREE(+core.worktree) suppresses +# bareness (gitfile version). test_expect_success '#31: setup' ' - sane_unset GIT_DIR GIT_WORK_TREE && - mkdir 31 31/sub 31/sub/sub 31.wt 31.wt/sub 31/wt 31/wt/sub && - cd 31 && - git init && - git config core.bare true && - git config core.worktree non-existent && - mv .git ../31.git && - echo gitdir: ../31.git >.git && - cd .. -' - -test_expect_success '#31: GIT_DIR(rel), GIT_WORK_TREE=root at root' ' - cat >31/expected <31/expected <31/expected <31/expected <31/sub/sub/expected <31/sub/sub/expected <31/sub/expected <31/sub/sub/expected <31/expected <31/expected <31/expected <31/expected <31/sub/sub/expected <31/sub/sub/expected <31/sub/sub/expected <31/sub/sub/expected <31/expected <31/expected <31/expected <31/expected <31/sub/sub/expected <31/sub/sub/expected <31/sub/sub/expected <31/sub/sub/expected <