(List (= scope= flags=0 words=[] bindings=[('test_description', {[DQ [LIT_CHARS "Tests of cwd/prefix/worktree/gitdir setup in all cases\n"][LIT_CHARS "\n"][LIT_CHARS "A few rules for repo setup:\n"][LIT_CHARS "\n"][LIT_CHARS "1. GIT_DIR is relative to user's cwd. --git-dir is equivalent to\n"][LIT_CHARS " GIT_DIR.\n"][LIT_CHARS "\n"][LIT_CHARS "2. .git file is relative to parent directory. .git file is basically\n"][LIT_CHARS " symlink in disguise. The directory where .git file points to will\n"][LIT_CHARS " become new git_dir.\n"][LIT_CHARS "\n"][LIT_CHARS "3. core.worktree is relative to git_dir.\n"][LIT_CHARS "\n"][LIT_CHARS "4. GIT_WORK_TREE is relative to user's cwd. --work-tree is\n"][LIT_CHARS " equivalent to GIT_WORK_TREE.\n"][LIT_CHARS "\n"][LIT_CHARS "5. GIT_WORK_TREE/core.worktree was originally meant to work only if\n"][LIT_CHARS " GIT_DIR is set, but earlier git didn't enforce it, and some scripts\n"][LIT_CHARS " depend on the implementation that happened to first discover .git by\n"][LIT_CHARS " going up from the users "][VarSub cwd][LIT_CHARS " and then using the specified working tree\n"][LIT_CHARS " that may or may not have any relation to where .git was found in. This\n"][LIT_CHARS " historical behaviour must be kept.\n"][LIT_CHARS "\n"][LIT_CHARS "6. Effective GIT_WORK_TREE overrides core.worktree and core.bare\n"][LIT_CHARS "\n"][LIT_CHARS "7. Effective core.worktree conflicts with core.bare\n"][LIT_CHARS "\n"][LIT_CHARS "8. If GIT_DIR is set but neither worktree nor bare setting is given,\n"][LIT_CHARS " original cwd becomes worktree.\n"][LIT_CHARS "\n"][LIT_CHARS "9. If .git discovery is done inside a repo, the repo becomes a bare\n"][LIT_CHARS " repo. .git discovery is performed if GIT_DIR is not set.\n"][LIT_CHARS "\n"][LIT_CHARS "10. If no worktree is available, cwd remains unchanged, prefix is\n"][LIT_CHARS " NULL.\n"][LIT_CHARS "\n"][LIT_CHARS "11. When user's cwd is outside worktree, cwd remains unchanged,\n"][LIT_CHARS " prefix is NULL.\n"]]})]) (Com {[LIT_CHARS .]} {[LIT_CHARS ./test-lib.sh]} ) (= scope= flags=0 words=[] bindings=[('here', {[ComSub (Com {[LIT_CHARS pwd]})]})]) (FunctionDef test_repo [] (Subshell (AndOr OP_AND_IF (Com {[LIT_CHARS cd]} {[DQ [VarSub 1]]} ) (AndOr OP_AND_IF (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub 2]]} ) (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('GIT_DIR', {[DQ [VarSub 2]]})]) (= scope= flags=1 words=[{[LIT_CHARS GIT_DIR]}] bindings=[]) ) ) (AndOr OP_AND_IF (If (Com {[LIT_CHARS test]} {[LIT_CHARS -n]} {[DQ [VarSub 3]]} ) (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('GIT_WORK_TREE', {[DQ [VarSub 3]]})]) (= scope= flags=1 words=[{[LIT_CHARS GIT_WORK_TREE]}] bindings=[]) ) ) (AndOr OP_AND_IF (Com {[LIT_CHARS rm]} {[LIT_CHARS -f]} {[LIT_CHARS trace]} ) (AndOr OP_AND_IF (Com {[LIT_CHARS git]} {[LIT_CHARS symbolic-ref]} {[LIT_CHARS HEAD]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), > more_env=[('GIT_TRACE_SETUP', {[DQ [ComSub (Com {[LIT_CHARS pwd]})][LIT_CHARS /trace]]})] ) (AndOr OP_AND_IF (Com {[LIT_CHARS grep]} {[SQ ]} {[LIT_CHARS trace]} < (FilenameRedirectNode filename={[LIT_CHARS result]} "> 1), > ) (Com {[LIT_CHARS test_cmp]} {[LIT_CHARS expected]} {[LIT_CHARS result]} ) ) ) ) ) ) ) ) ) (FunctionDef maybe_config [] (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('file', {[VarSub 1]}), ('var', {[VarSub 2]}), ('value', {[VarSub 3]})]) (If (Com {[LIT_CHARS test]} {[DQ [VarSub value]]} {[LIT_NEQUAL "!="]} {[LIT_CHARS unset]} ) (Com {[LIT_CHARS git]} {[LIT_CHARS config]} {[LIT_CHARS --file] [LIT_DBRACKET_LIKE "="] [DQ [VarSub file]]} {[DQ [VarSub var]]} {[DQ [VarSub value]]} ) ) ) ) (FunctionDef setup_repo [] (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('name', {[VarSub 1]}), ('worktreecfg', {[VarSub 2]}), ('gitfile', {[VarSub 3]}), ('barecfg', {[VarSub 4]})]) (AndOr OP_AND_IF (Com {[LIT_CHARS sane_unset]} {[LIT_CHARS GIT_DIR]} {[LIT_CHARS GIT_WORK_TREE]} ) (AndOr OP_AND_IF (Com {[LIT_CHARS git]} {[LIT_CHARS init]} {[DQ [VarSub name]]} ) (AndOr OP_AND_IF (Com {[LIT_CHARS maybe_config]} {[DQ [VarSub name][LIT_CHARS /.git/config]]} {[LIT_CHARS core.worktree]} {[DQ [VarSub worktreecfg]]} ) (AndOr OP_AND_IF (Com {[LIT_CHARS maybe_config]} {[DQ [VarSub name][LIT_CHARS /.git/config]]} {[LIT_CHARS core.bare]} {[DQ [VarSub barecfg]]} ) (AndOr OP_AND_IF (Com {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[DQ [VarSub name][LIT_CHARS /sub/sub]]} ) (If (Com {[LIT_CHARS test]} {[DQ [VarSub gitfile test_op=VS_TEST_COLON_PLUS {[LIT_CHARS set]}]]} ) (AndOr OP_AND_IF (Com {[LIT_CHARS mv]} {[DQ [VarSub name][LIT_CHARS /.git]]} {[DQ [VarSub name][LIT_CHARS .git]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "gitdir: ../"][VarSub name][LIT_CHARS .git]]} < (FilenameRedirectNode filename={[DQ [VarSub name][LIT_CHARS /.git]]} "> 1), > ) ) ) ) ) ) ) ) ) ) (FunctionDef maybe_set [] (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('var', {[VarSub 1]}), ('value', {[VarSub 2]})]) (If (Com {[LIT_CHARS test]} {[DQ [VarSub value]]} {[LIT_NEQUAL "!="]} {[LIT_CHARS unset]} ) (AndOr OP_AND_IF (Com {[LIT_CHARS eval]} {[DQ [VarSub var][LIT_CHARS "="][\ LIT_ESCAPED_CHAR "\\$"][LIT_CHARS value]]} ) (= scope= flags=1 words=[{[VarSub var]}] bindings=[]) ) ) ) ) (FunctionDef setup_env [] (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('worktreenv', {[VarSub 1]}), ('gitdirenv', {[VarSub 2]})]) (AndOr OP_AND_IF (Com {[LIT_CHARS sane_unset]} {[LIT_CHARS GIT_DIR]} {[LIT_CHARS GIT_WORK_TREE]} ) (AndOr OP_AND_IF (Com {[LIT_CHARS maybe_set]} {[LIT_CHARS GIT_DIR]} {[DQ [VarSub gitdirenv]]} ) (Com {[LIT_CHARS maybe_set]} {[LIT_CHARS GIT_WORK_TREE]} {[DQ [VarSub worktreeenv]]} ) ) ) ) ) (FunctionDef expect [] (Com {[LIT_CHARS cat]} < (FilenameRedirectNode filename={[DQ [VarSub 1][LIT_CHARS /expected]]} "> 1), (HereDocRedirectNode here_end='EOF' do_expansion=True body_word={[DQ [LIT_CHARS "setup: git_dir: "][VarSub 2][LIT_CHARS "\n"][LIT_CHARS "setup: worktree: "][VarSub 3][LIT_CHARS "\n"][LIT_CHARS "setup: cwd: "][VarSub 4][LIT_CHARS "\n"][LIT_CHARS "setup: prefix: "][VarSub 5][LIT_CHARS "\n"]]} 0), > ) ) (FunctionDef try_case [] (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('name', {[VarSub 1]}), ('worktreeenv', {[VarSub 2]}), ('gitdirenv', {[VarSub 3]})]) (AndOr OP_AND_IF (Com {[LIT_CHARS setup_env]} {[DQ [VarSub worktreeenv]]} {[DQ [VarSub gitdirenv]]} ) (AndOr OP_AND_IF (Com {[LIT_CHARS expect]} {[DQ [VarSub name]]} {[DQ [VarSub 4]]} {[DQ [VarSub 5]]} {[DQ [VarSub 6]]} {[DQ [VarSub 7]]} ) (Com {[LIT_CHARS test_repo]} {[DQ [VarSub name]]} ) ) ) ) ) (FunctionDef run_wt_tests [] (List (= scope= flags=0 words=[] bindings=[('N', {[VarSub 1]}), ('gitfile', {[VarSub 2]})]) (= scope= flags=0 words=[] bindings=[('absgit', {[DQ [VarSub here][LIT_CHARS /][VarSub N][LIT_CHARS /.git]]})]) (= scope= flags=0 words=[] bindings=[('dotgit', {[LIT_CHARS .git]})]) (= scope= flags=0 words=[] bindings=[('dotdotgit', {[LIT_CHARS ../../.git]})]) (If (Com {[LIT_CHARS test]} {[DQ [VarSub gitfile]]} ) (List (= scope= flags=0 words=[] bindings=[('absgit', {[DQ [VarSub here][LIT_CHARS /][VarSub N][LIT_CHARS .git]]})]) (= scope= flags=0 words=[] bindings=[('dotgit', {[VarSub absgit]}), ('dotdotgit', {[VarSub absgit]})]) ) ) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "#"][VarSub N][LIT_CHARS ": explicit GIT_WORK_TREE and GIT_DIR at toplevel"]]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "#"][VarSub N][LIT_CHARS ": explicit GIT_WORK_TREE and GIT_DIR in subdir"]]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "#"][VarSub N][LIT_CHARS ": explicit GIT_WORK_TREE from parent of worktree"]]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "#"][VarSub N][LIT_CHARS ": explicit GIT_WORK_TREE from nephew of worktree"]]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "#"][VarSub N][LIT_CHARS ": chdir_to_toplevel uses worktree, not git dir"]]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[DQ [LIT_CHARS "#"][VarSub N][LIT_CHARS ": chdir_to_toplevel uses worktree (from subdir)"]]} {[SQ ]} ) ) ) (FunctionDef try_repo [] (AndOr OP_AND_IF (= scope= flags=0 words=[] bindings=[('name', {[VarSub 1]}), ('worktreeenv', {[VarSub 2]}), ('gitdirenv', {[VarSub 3]})]) (AndOr OP_AND_IF (Com {[LIT_CHARS setup_repo]} {[DQ [VarSub name]]} {[DQ [VarSub 4]]} {[DQ [VarSub 5]]} {[DQ [VarSub 6]]} ) (AndOr OP_AND_IF (Com {[LIT_CHARS shift]} {[LIT_CHARS 6]} ) (AndOr OP_AND_IF (Com {[LIT_CHARS try_case]} {[DQ [VarSub name]]} {[DQ [VarSub worktreeenv]]} {[DQ [VarSub gitdirenv]]} {[DQ [VarSub 1]]} {[DQ [VarSub 2]]} {[DQ [VarSub 3]]} {[DQ [VarSub 4]]} ) (AndOr OP_AND_IF (Com {[LIT_CHARS shift]} {[LIT_CHARS 4]} ) (AndOr OP_AND_IF (Case to_match={[DQ [VarSub gitdirenv]]}, pat_word_list=[[{[LIT_CHARS /] [LIT_OTHER "*"]}, {[LIT_OTHER "?"] [LIT_OTHER ":"] [LIT_CHARS /] [LIT_OTHER "*"]}, {[LIT_CHARS unset]}], [{[LIT_OTHER "*"]}]] (ElseTrue) (= scope= flags=0 words=[] bindings=[('gitdirenv', {[LIT_CHARS ../] [VarSub gitdirenv]})]) ) (Com {[LIT_CHARS try_case]} {[DQ [VarSub name][LIT_CHARS /sub]]} {[DQ [VarSub worktreeenv]]} {[DQ [VarSub gitdirenv]]} {[DQ [VarSub 1]]} {[DQ [VarSub 2]]} {[DQ [VarSub 3]]} {[DQ [VarSub 4]]} ) ) ) ) ) ) ) ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ message &&\n"> ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ message &&\n"> ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS run_wt_tests]} {[LIT_CHARS 3]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ message &&\n"> ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ message &&\n"> ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS run_wt_tests]} {[LIT_CHARS 7]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ message &&\n"> ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS run_wt_tests]} {[LIT_CHARS 11]} {[LIT_CHARS gitfile]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ message &&\n"> ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ message &&\n"> ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS run_wt_tests]} {[LIT_CHARS 15]} {[LIT_CHARS gitfile]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ message &&\n"> message &&\n"> ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS run_wt_tests]} {[LIT_CHARS 19]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ message &&\n"> ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ /dev/null\n"> message &&\n"> ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ /dev/null\n"> message &&\n"> ]} ) (Com {[LIT_CHARS run_wt_tests]} {[LIT_CHARS 21]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ result\n"> result\n"> ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS run_wt_tests]} {[LIT_CHARS 23]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ message &&\n"> ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ gitfile case)">]} {[SQ ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS run_wt_tests]} {[LIT_CHARS 27]} {[LIT_CHARS gitfile]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ message &&\n"> ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ /dev/null\n"> message &&\n"> ]} ) (Com {[LIT_CHARS run_wt_tests]} {[LIT_CHARS 29]} {[LIT_CHARS gitfile]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ result\n"> ]} ) (Com {[LIT_CHARS test_expect_success]} {[SQ ]} {[SQ ]} ) (Com {[LIT_CHARS run_wt_tests]} {[LIT_CHARS 31]} {[LIT_CHARS gitfile]} ) (Com {[LIT_CHARS test_done]} ) )