(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:test_description) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'test separate work tree' span_id:6))} spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:17))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:21) (Token id:Id.Lit_Chars val:'\tEMPTY_TREE=$(git write-tree) &&\n' span_id:22) (Token id: Id.Lit_Chars val: '\tEMPTY_BLOB=$(git hash-object -t blob --stdin </dev/null) &&\n' span_id: 23 ) (Token id: Id.Lit_Chars val: '\tCHANGED_BLOB=$(echo changed | git hash-object -t blob --stdin) &&\n' span_id: 24 ) (Token id: Id.Lit_Chars val: '\tEMPTY_BLOB7=$(echo $EMPTY_BLOB | sed "s/\\(.......\\).*/\\1/") &&\n' span_id: 25 ) (Token id: Id.Lit_Chars val: '\tCHANGED_BLOB7=$(echo $CHANGED_BLOB | sed "s/\\(.......\\).*/\\1/") &&\n' span_id: 26 ) (Token id:Id.Lit_Chars val:'\n' span_id:27) (Token id:Id.Lit_Chars val:'\tmkdir -p work/sub/dir &&\n' span_id:28) (Token id:Id.Lit_Chars val:'\tmkdir -p work2 &&\n' span_id:29) (Token id:Id.Lit_Chars val:'\tmv .git repo.git\n' span_id:30) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup: helper for testing rev-parse' span_id:37))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:41) (Token id:Id.Lit_Chars val:'\ttest_rev_parse() {\n' span_id:42) (Token id:Id.Lit_Chars val:'\t\techo $1 >expected.bare &&\n' span_id:43) (Token id:Id.Lit_Chars val:'\t\techo $2 >expected.inside-git &&\n' span_id:44) (Token id:Id.Lit_Chars val:'\t\techo $3 >expected.inside-worktree &&\n' span_id:45) (Token id:Id.Lit_Chars val:'\t\tif test $# -ge 4\n' span_id:46) (Token id:Id.Lit_Chars val:'\t\tthen\n' span_id:47) (Token id:Id.Lit_Chars val:'\t\t\techo $4 >expected.prefix\n' span_id:48) (Token id:Id.Lit_Chars val:'\t\tfi &&\n' span_id:49) (Token id:Id.Lit_Chars val:'\n' span_id:50) (Token id: Id.Lit_Chars val: '\t\tgit rev-parse --is-bare-repository >actual.bare &&\n' span_id: 51 ) (Token id: Id.Lit_Chars val: '\t\tgit rev-parse --is-inside-git-dir >actual.inside-git &&\n' span_id: 52 ) (Token id: Id.Lit_Chars val: '\t\tgit rev-parse --is-inside-work-tree >actual.inside-worktree &&\n' span_id: 53 ) (Token id:Id.Lit_Chars val:'\t\tif test $# -ge 4\n' span_id:54) (Token id:Id.Lit_Chars val:'\t\tthen\n' span_id:55) (Token id:Id.Lit_Chars val:'\t\t\tgit rev-parse --show-prefix >actual.prefix\n' span_id:56) (Token id:Id.Lit_Chars val:'\t\tfi &&\n' span_id:57) (Token id:Id.Lit_Chars val:'\n' span_id:58) (Token id: Id.Lit_Chars val: '\t\ttest_cmp expected.bare actual.bare &&\n' span_id: 59 ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expected.inside-git actual.inside-git &&\n' span_id:60) (Token id: Id.Lit_Chars val: '\t\ttest_cmp expected.inside-worktree actual.inside-worktree &&\n' span_id: 61 ) (Token id:Id.Lit_Chars val:'\t\tif test $# -ge 4\n' span_id:62) (Token id:Id.Lit_Chars val:'\t\tthen\n' span_id:63) (Token id:Id.Lit_Chars val:'\t\t\t# rev-parse --show-prefix should output\n' span_id:64) (Token id: Id.Lit_Chars val: '\t\t\t# a single newline when at the top of the work tree,\n' span_id: 65 ) (Token id:Id.Lit_Chars val:'\t\t\t# but we test for that separately.\n' span_id:66) (Token id: Id.Lit_Chars val: '\t\t\ttest -z "$4" && ! test -s actual.prefix ||\n' span_id: 67 ) (Token id:Id.Lit_Chars val:'\t\t\ttest_cmp expected.prefix actual.prefix\n' span_id:68) (Token id:Id.Lit_Chars val:'\t\tfi\n' span_id:69) (Token id:Id.Lit_Chars val:'\t}\n' span_id:70) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup: core.worktree = relative path' span_id:77))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:81) (Token id:Id.Lit_Chars val:'\tsane_unset GIT_WORK_TREE &&\n' span_id:82) (Token id:Id.Lit_Chars val:'\tGIT_DIR=repo.git &&\n' span_id:83) (Token id: Id.Lit_Chars val: '\tGIT_CONFIG="$(pwd)"/$GIT_DIR/config &&\n' span_id: 84 ) (Token id:Id.Lit_Chars val:'\texport GIT_DIR GIT_CONFIG &&\n' span_id:85) (Token id:Id.Lit_Chars val:'\tgit config core.worktree ../work\n' span_id:86) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:outside span_id:93))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:97) (Token id:Id.Lit_Chars val:'\ttest_rev_parse false false false\n' span_id:98) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'inside work tree' span_id:105))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:109) (Token id:Id.Lit_Chars val:'\t(\n' span_id:110) (Token id:Id.Lit_Chars val:'\t\tcd work &&\n' span_id:111) (Token id:Id.Lit_Chars val:'\t\tGIT_DIR=../repo.git &&\n' span_id:112) (Token id:Id.Lit_Chars val:'\t\tGIT_CONFIG="$(pwd)"/$GIT_DIR/config &&\n' span_id:113) (Token id: Id.Lit_Chars val: '\t\ttest_rev_parse false false true ""\n' span_id: 114 ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:115) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'empty prefix is actually written out' span_id:122))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:126) (Token id:Id.Lit_Chars val:'\techo >expected &&\n' span_id:127) (Token id:Id.Lit_Chars val:'\t(\n' span_id:128) (Token id:Id.Lit_Chars val:'\t\tcd work &&\n' span_id:129) (Token id:Id.Lit_Chars val:'\t\tGIT_DIR=../repo.git &&\n' span_id:130) (Token id: Id.Lit_Chars val: '\t\tGIT_CONFIG="$(pwd)"/$GIT_DIR/config &&\n' span_id: 131 ) (Token id:Id.Lit_Chars val:'\t\tgit rev-parse --show-prefix >../actual\n' span_id:132) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:133) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:134) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'subdir of work tree' span_id:141))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:145) (Token id:Id.Lit_Chars val:'\t(\n' span_id:146) (Token id:Id.Lit_Chars val:'\t\tcd work/sub/dir &&\n' span_id:147) (Token id:Id.Lit_Chars val:'\t\tGIT_DIR=../../../repo.git &&\n' span_id:148) (Token id:Id.Lit_Chars val:'\t\tGIT_CONFIG="$(pwd)"/$GIT_DIR/config &&\n' span_id:149) (Token id: Id.Lit_Chars val: '\t\ttest_rev_parse false false true sub/dir/\n' span_id: 150 ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:151) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup: core.worktree = absolute path' span_id:158))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:162) (Token id:Id.Lit_Chars val:'\tsane_unset GIT_WORK_TREE &&\n' span_id:163) (Token id:Id.Lit_Chars val:'\tGIT_DIR=$(pwd)/repo.git &&\n' span_id:164) (Token id:Id.Lit_Chars val:'\tGIT_CONFIG=$GIT_DIR/config &&\n' span_id:165) (Token id:Id.Lit_Chars val:'\texport GIT_DIR GIT_CONFIG &&\n' span_id:166) (Token id: Id.Lit_Chars val: '\tgit config core.worktree "$(pwd)/work"\n' span_id: 167 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:outside span_id:174))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:178) (Token id:Id.Lit_Chars val:'\ttest_rev_parse false false false &&\n' span_id:179) (Token id:Id.Lit_Chars val:'\t(\n' span_id:180) (Token id:Id.Lit_Chars val:'\t\tcd work2 &&\n' span_id:181) (Token id:Id.Lit_Chars val:'\t\ttest_rev_parse false false false\n' span_id:182) (Token id:Id.Lit_Chars val:'\t)\n' span_id:183) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'inside work tree' span_id:190))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:194) (Token id:Id.Lit_Chars val:'\t(\n' span_id:195) (Token id:Id.Lit_Chars val:'\t\tcd work &&\n' span_id:196) (Token id: Id.Lit_Chars val: '\t\ttest_rev_parse false false true ""\n' span_id: 197 ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:198) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'subdir of work tree' span_id:205))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:209) (Token id:Id.Lit_Chars val:'\t(\n' span_id:210) (Token id:Id.Lit_Chars val:'\t\tcd work/sub/dir &&\n' span_id:211) (Token id: Id.Lit_Chars val: '\t\ttest_rev_parse false false true sub/dir/\n' span_id: 212 ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:213) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'setup: GIT_WORK_TREE=relative (override core.worktree)' span_id: 220 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:224) (Token id:Id.Lit_Chars val:'\tGIT_DIR=$(pwd)/repo.git &&\n' span_id:225) (Token id:Id.Lit_Chars val:'\tGIT_CONFIG=$GIT_DIR/config &&\n' span_id:226) (Token id: Id.Lit_Chars val: '\tgit config core.worktree non-existent &&\n' span_id: 227 ) (Token id:Id.Lit_Chars val:'\tGIT_WORK_TREE=work &&\n' span_id:228) (Token id: Id.Lit_Chars val: '\texport GIT_DIR GIT_CONFIG GIT_WORK_TREE\n' span_id: 229 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:outside span_id:236))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:240) (Token id:Id.Lit_Chars val:'\ttest_rev_parse false false false &&\n' span_id:241) (Token id:Id.Lit_Chars val:'\t(\n' span_id:242) (Token id:Id.Lit_Chars val:'\t\tcd work2 &&\n' span_id:243) (Token id:Id.Lit_Chars val:'\t\ttest_rev_parse false false false\n' span_id:244) (Token id:Id.Lit_Chars val:'\t)\n' span_id:245) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'inside work tree' span_id:252))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:256) (Token id:Id.Lit_Chars val:'\t(\n' span_id:257) (Token id:Id.Lit_Chars val:'\t\tcd work &&\n' span_id:258) (Token id:Id.Lit_Chars val:'\t\tGIT_WORK_TREE=. &&\n' span_id:259) (Token id:Id.Lit_Chars val:'\t\ttest_rev_parse false false true ""\n' span_id:260) (Token id:Id.Lit_Chars val:'\t)\n' span_id:261) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'subdir of work tree' span_id:268))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:272) (Token id:Id.Lit_Chars val:'\t(\n' span_id:273) (Token id:Id.Lit_Chars val:'\t\tcd work/sub/dir &&\n' span_id:274) (Token id:Id.Lit_Chars val:'\t\tGIT_WORK_TREE=../.. &&\n' span_id:275) (Token id:Id.Lit_Chars val:'\t\ttest_rev_parse false false true sub/dir/\n' span_id:276) (Token id:Id.Lit_Chars val:'\t)\n' span_id:277) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup: GIT_WORK_TREE=absolute, below git dir' span_id:284))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:288) (Token id:Id.Lit_Chars val:'\tmv work repo.git/work &&\n' span_id:289) (Token id:Id.Lit_Chars val:'\tmv work2 repo.git/work2 &&\n' span_id:290) (Token id:Id.Lit_Chars val:'\tGIT_DIR=$(pwd)/repo.git &&\n' span_id:291) (Token id:Id.Lit_Chars val:'\tGIT_CONFIG=$GIT_DIR/config &&\n' span_id:292) (Token id: Id.Lit_Chars val: '\tGIT_WORK_TREE=$(pwd)/repo.git/work &&\n' span_id: 293 ) (Token id:Id.Lit_Chars val:'\texport GIT_DIR GIT_CONFIG GIT_WORK_TREE\n' span_id:294) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:outside span_id:301))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:305) (Token id:Id.Lit_Chars val:'\techo outside &&\n' span_id:306) (Token id:Id.Lit_Chars val:'\ttest_rev_parse false false false\n' span_id:307) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'in repo.git' span_id:314))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:318) (Token id:Id.Lit_Chars val:'\t(\n' span_id:319) (Token id:Id.Lit_Chars val:'\t\tcd repo.git &&\n' span_id:320) (Token id:Id.Lit_Chars val:'\t\ttest_rev_parse false true false\n' span_id:321) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:322) (Token id:Id.Lit_Chars val:'\t(\n' span_id:323) (Token id:Id.Lit_Chars val:'\t\tcd repo.git/objects &&\n' span_id:324) (Token id:Id.Lit_Chars val:'\t\ttest_rev_parse false true false\n' span_id:325) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:326) (Token id:Id.Lit_Chars val:'\t(\n' span_id:327) (Token id:Id.Lit_Chars val:'\t\tcd repo.git/work2 &&\n' span_id:328) (Token id:Id.Lit_Chars val:'\t\ttest_rev_parse false true false\n' span_id:329) (Token id:Id.Lit_Chars val:'\t)\n' span_id:330) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'inside work tree' span_id:337))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:341) (Token id:Id.Lit_Chars val:'\t(\n' span_id:342) (Token id:Id.Lit_Chars val:'\t\tcd repo.git/work &&\n' span_id:343) (Token id:Id.Lit_Chars val:'\t\ttest_rev_parse false true true ""\n' span_id:344) (Token id:Id.Lit_Chars val:'\t)\n' span_id:345) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'subdir of work tree' span_id:352))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:356) (Token id:Id.Lit_Chars val:'\t(\n' span_id:357) (Token id:Id.Lit_Chars val:'\t\tcd repo.git/work/sub/dir &&\n' span_id:358) (Token id: Id.Lit_Chars val: '\t\ttest_rev_parse false true true sub/dir/\n' span_id: 359 ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:360) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'find work tree from repo' span_id:367))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:371) (Token id:Id.Lit_Chars val:'\techo sub/dir/untracked >expected &&\n' span_id:372) (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >repo.git/work/.gitignore &&\n' span_id:373) (Token id:Id.Lit_Chars val:'\texpected.*\n' span_id:374) (Token id:Id.Lit_Chars val:'\tactual.*\n' span_id:375) (Token id:Id.Lit_Chars val:'\t.gitignore\n' span_id:376) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:377) (Token id:Id.Lit_Chars val:'\t>repo.git/work/sub/dir/untracked &&\n' span_id:378) (Token id:Id.Lit_Chars val:'\t(\n' span_id:379) (Token id:Id.Lit_Chars val:'\t\tcd repo.git &&\n' span_id:380) (Token id:Id.Lit_Chars val:'\t\tgit ls-files --others --exclude-standard >../actual\n' span_id:381) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:382) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:383) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'find work tree from work tree' span_id:390))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:394) (Token id:Id.Lit_Chars val:'\techo sub/dir/tracked >expected &&\n' span_id:395) (Token id:Id.Lit_Chars val:'\t>repo.git/work/sub/dir/tracked &&\n' span_id:396) (Token id:Id.Lit_Chars val:'\t(\n' span_id:397) (Token id:Id.Lit_Chars val:'\t\tcd repo.git/work/sub/dir &&\n' span_id:398) (Token id: Id.Lit_Chars val: '\t\tgit --git-dir=../../.. add tracked\n' span_id: 399 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:400) (Token id:Id.Lit_Chars val:'\t(\n' span_id:401) (Token id:Id.Lit_Chars val:'\t\tcd repo.git &&\n' span_id:402) (Token id:Id.Lit_Chars val:'\t\tgit ls-files >../actual\n' span_id:403) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:404) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:405) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: '_gently() groks relative GIT_DIR & GIT_WORK_TREE' span_id: 412 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:416) (Token id:Id.Lit_Chars val:'\t(\n' span_id:417) (Token id:Id.Lit_Chars val:'\t\tcd repo.git/work/sub/dir &&\n' span_id:418) (Token id:Id.Lit_Chars val:'\t\tGIT_DIR=../../.. &&\n' span_id:419) (Token id:Id.Lit_Chars val:'\t\tGIT_WORK_TREE=../.. &&\n' span_id:420) (Token id:Id.Lit_Chars val:'\t\tGIT_PAGER= &&\n' span_id:421) (Token id:Id.Lit_Chars val:'\t\texport GIT_DIR GIT_WORK_TREE GIT_PAGER &&\n' span_id:422) (Token id:Id.Lit_Chars val:'\n' span_id:423) (Token id:Id.Lit_Chars val:'\t\tgit diff --exit-code tracked &&\n' span_id:424) (Token id:Id.Lit_Chars val:'\t\techo changed >tracked &&\n' span_id:425) (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git diff --exit-code tracked\n' span_id:426) (Token id:Id.Lit_Chars val:'\t)\n' span_id:427) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff-index respects work tree under .git dir' span_id:434))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:438) (Token id: Id.Lit_Chars val: '\tcat >diff-index-cached.expected <<-EOF &&\n' span_id: 439 ) (Token id:Id.Lit_Chars val:'\t:000000 100644 $_z40 $EMPTY_BLOB A\tsub/dir/tracked\n' span_id:440) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:441) (Token id:Id.Lit_Chars val:'\tcat >diff-index.expected <<-EOF &&\n' span_id:442) (Token id: Id.Lit_Chars val: '\t:000000 100644 $_z40 $_z40 A\tsub/dir/tracked\n' span_id: 443 ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:444) (Token id:Id.Lit_Chars val:'\n' span_id:445) (Token id:Id.Lit_Chars val:'\t(\n' span_id:446) (Token id:Id.Lit_Chars val:'\t\tGIT_DIR=repo.git &&\n' span_id:447) (Token id:Id.Lit_Chars val:'\t\tGIT_WORK_TREE=repo.git/work &&\n' span_id:448) (Token id:Id.Lit_Chars val:'\t\texport GIT_DIR GIT_WORK_TREE &&\n' span_id:449) (Token id: Id.Lit_Chars val: '\t\tgit diff-index $EMPTY_TREE >diff-index.actual &&\n' span_id: 450 ) (Token id: Id.Lit_Chars val: '\t\tgit diff-index --cached $EMPTY_TREE >diff-index-cached.actual\n' span_id: 451 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:452) (Token id: Id.Lit_Chars val: '\ttest_cmp diff-index.expected diff-index.actual &&\n' span_id: 453 ) (Token id: Id.Lit_Chars val: '\ttest_cmp diff-index-cached.expected diff-index-cached.actual\n' span_id: 454 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff-files respects work tree under .git dir' span_id:461))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:465) (Token id:Id.Lit_Chars val:'\tcat >diff-files.expected <<-EOF &&\n' span_id:466) (Token id:Id.Lit_Chars val:'\t:100644 100644 $EMPTY_BLOB $_z40 M\tsub/dir/tracked\n' span_id:467) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:468) (Token id:Id.Lit_Chars val:'\n' span_id:469) (Token id:Id.Lit_Chars val:'\t(\n' span_id:470) (Token id:Id.Lit_Chars val:'\t\tGIT_DIR=repo.git &&\n' span_id:471) (Token id:Id.Lit_Chars val:'\t\tGIT_WORK_TREE=repo.git/work &&\n' span_id:472) (Token id:Id.Lit_Chars val:'\t\texport GIT_DIR GIT_WORK_TREE &&\n' span_id:473) (Token id:Id.Lit_Chars val:'\t\tgit diff-files >diff-files.actual\n' span_id:474) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:475) (Token id:Id.Lit_Chars val:'\ttest_cmp diff-files.expected diff-files.actual\n' span_id:476) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git diff respects work tree under .git dir' span_id:483))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:487) (Token id:Id.Lit_Chars val:'\tcat >diff-TREE.expected <<-EOF &&\n' span_id:488) (Token id:Id.Lit_Chars val:'\tdiff --git a/sub/dir/tracked b/sub/dir/tracked\n' span_id:489) (Token id:Id.Lit_Chars val:'\tnew file mode 100644\n' span_id:490) (Token id:Id.Lit_Chars val:'\tindex 0000000..$CHANGED_BLOB7\n' span_id:491) (Token id:Id.Lit_Chars val:'\t--- /dev/null\n' span_id:492) (Token id:Id.Lit_Chars val:'\t+++ b/sub/dir/tracked\n' span_id:493) (Token id:Id.Lit_Chars val:'\t@@ -0,0 +1 @@\n' span_id:494) (Token id:Id.Lit_Chars val:'\t+changed\n' span_id:495) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:496) (Token id:Id.Lit_Chars val:'\tcat >diff-TREE-cached.expected <<-EOF &&\n' span_id:497) (Token id: Id.Lit_Chars val: '\tdiff --git a/sub/dir/tracked b/sub/dir/tracked\n' span_id: 498 ) (Token id:Id.Lit_Chars val:'\tnew file mode 100644\n' span_id:499) (Token id:Id.Lit_Chars val:'\tindex 0000000..$EMPTY_BLOB7\n' span_id:500) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:501) (Token id:Id.Lit_Chars val:'\tcat >diff-FILES.expected <<-EOF &&\n' span_id:502) (Token id:Id.Lit_Chars val:'\tdiff --git a/sub/dir/tracked b/sub/dir/tracked\n' span_id:503) (Token id: Id.Lit_Chars val: '\tindex $EMPTY_BLOB7..$CHANGED_BLOB7 100644\n' span_id: 504 ) (Token id:Id.Lit_Chars val:'\t--- a/sub/dir/tracked\n' span_id:505) (Token id:Id.Lit_Chars val:'\t+++ b/sub/dir/tracked\n' span_id:506) (Token id:Id.Lit_Chars val:'\t@@ -0,0 +1 @@\n' span_id:507) (Token id:Id.Lit_Chars val:'\t+changed\n' span_id:508) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:509) (Token id:Id.Lit_Chars val:'\n' span_id:510) (Token id:Id.Lit_Chars val:'\t(\n' span_id:511) (Token id:Id.Lit_Chars val:'\t\tGIT_DIR=repo.git &&\n' span_id:512) (Token id:Id.Lit_Chars val:'\t\tGIT_WORK_TREE=repo.git/work &&\n' span_id:513) (Token id:Id.Lit_Chars val:'\t\texport GIT_DIR GIT_WORK_TREE &&\n' span_id:514) (Token id: Id.Lit_Chars val: '\t\tgit diff $EMPTY_TREE >diff-TREE.actual &&\n' span_id: 515 ) (Token id: Id.Lit_Chars val: '\t\tgit diff --cached $EMPTY_TREE >diff-TREE-cached.actual &&\n' span_id: 516 ) (Token id:Id.Lit_Chars val:'\t\tgit diff >diff-FILES.actual\n' span_id:517) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:518) (Token id:Id.Lit_Chars val:'\ttest_cmp diff-TREE.expected diff-TREE.actual &&\n' span_id:519) (Token id: Id.Lit_Chars val: '\ttest_cmp diff-TREE-cached.expected diff-TREE-cached.actual &&\n' span_id: 520 ) (Token id:Id.Lit_Chars val:'\ttest_cmp diff-FILES.expected diff-FILES.actual\n' span_id:521) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git grep' span_id:528))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:532) (Token id:Id.Lit_Chars val:'\techo dir/tracked >expected.grep &&\n' span_id:533) (Token id:Id.Lit_Chars val:'\t(\n' span_id:534) (Token id:Id.Lit_Chars val:'\t\tcd repo.git/work/sub &&\n' span_id:535) (Token id:Id.Lit_Chars val:'\t\tGIT_DIR=../.. &&\n' span_id:536) (Token id:Id.Lit_Chars val:'\t\tGIT_WORK_TREE=.. &&\n' span_id:537) (Token id:Id.Lit_Chars val:'\t\texport GIT_DIR GIT_WORK_TREE &&\n' span_id:538) (Token id: Id.Lit_Chars val: '\t\tgit grep -l changed >../../../actual.grep\n' span_id: 539 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:540) (Token id:Id.Lit_Chars val:'\ttest_cmp expected.grep actual.grep\n' span_id:541) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git commit' span_id:548))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:552) (Token id:Id.Lit_Chars val:'\t(\n' span_id:553) (Token id:Id.Lit_Chars val:'\t\tcd repo.git &&\n' span_id:554) (Token id: Id.Lit_Chars val: '\t\tGIT_DIR=. GIT_WORK_TREE=work git commit -a -m done\n' span_id: 555 ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:556) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'absolute pathspec should fail gracefully' span_id:563))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:567) (Token id:Id.Lit_Chars val:'\t(\n' span_id:568) (Token id:Id.Lit_Chars val:'\t\tcd repo.git &&\n' span_id:569) (Token id: Id.Lit_Chars val: '\t\ttest_might_fail git config --unset core.worktree &&\n' span_id: 570 ) (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git log HEAD -- /home\n' span_id:571) (Token id:Id.Lit_Chars val:'\t)\n' span_id:572) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'make_relative_path handles double slashes in GIT_DIR' span_id: 579 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:583) (Token id:Id.Lit_Chars val:'\t>dummy_file &&\n' span_id:584) (Token id: Id.Lit_Chars val: '\techo git --git-dir="$(pwd)//repo.git" --work-tree="$(pwd)" add dummy_file &&\n' span_id: 585 ) (Token id: Id.Lit_Chars val: '\tgit --git-dir="$(pwd)//repo.git" --work-tree="$(pwd)" add dummy_file\n' span_id: 586 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'relative $GIT_WORK_TREE and git subprocesses' span_id:593))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:597) (Token id: Id.Lit_Chars val: '\tGIT_DIR=repo.git GIT_WORK_TREE=repo.git/work \\\n' span_id: 598 ) (Token id: Id.Lit_Chars val: '\ttest-subprocess --setup-work-tree rev-parse --show-toplevel >actual &&\n' span_id: 599 ) (Token id:Id.Lit_Chars val:'\techo "$(pwd)/repo.git/work" >expected &&\n' span_id:600) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:601) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'Multi-worktree setup' span_id:608))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:612) (Token id:Id.Lit_Chars val:'\tmkdir work &&\n' span_id:613) (Token id:Id.Lit_Chars val:'\tmkdir -p repo.git/repos/foo &&\n' span_id:614) (Token id: Id.Lit_Chars val: '\tcp repo.git/HEAD repo.git/index repo.git/repos/foo &&\n' span_id: 615 ) (Token id: Id.Lit_Chars val: '\ttest_might_fail cp repo.git/sharedindex.* repo.git/repos/foo &&\n' span_id: 616 ) (Token id:Id.Lit_Chars val:'\tsane_unset GIT_DIR GIT_CONFIG GIT_WORK_TREE\n' span_id:617) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'GIT_DIR set (1)' span_id:624))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:628) (Token id: Id.Lit_Chars val: '\techo "gitdir: repo.git/repos/foo" >gitfile &&\n' span_id: 629 ) (Token id:Id.Lit_Chars val:'\techo ../.. >repo.git/repos/foo/commondir &&\n' span_id:630) (Token id:Id.Lit_Chars val:'\t(\n' span_id:631) (Token id:Id.Lit_Chars val:'\t\tcd work &&\n' span_id:632) (Token id: Id.Lit_Chars val: '\t\tGIT_DIR=../gitfile git rev-parse --git-common-dir >actual &&\n' span_id: 633 ) (Token id: Id.Lit_Chars val: '\t\ttest-path-utils real_path "$TRASH_DIRECTORY/repo.git" >expect &&\n' span_id: 634 ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual\n' span_id:635) (Token id:Id.Lit_Chars val:'\t)\n' span_id:636) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'GIT_DIR set (2)' span_id:643))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:647) (Token id: Id.Lit_Chars val: '\techo "gitdir: repo.git/repos/foo" >gitfile &&\n' span_id: 648 ) (Token id:Id.Lit_Chars val:'\techo "$(pwd)/repo.git" >repo.git/repos/foo/commondir &&\n' span_id:649) (Token id:Id.Lit_Chars val:'\t(\n' span_id:650) (Token id:Id.Lit_Chars val:'\t\tcd work &&\n' span_id:651) (Token id: Id.Lit_Chars val: '\t\tGIT_DIR=../gitfile git rev-parse --git-common-dir >actual &&\n' span_id: 652 ) (Token id: Id.Lit_Chars val: '\t\ttest-path-utils real_path "$TRASH_DIRECTORY/repo.git" >expect &&\n' span_id: 653 ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual\n' span_id:654) (Token id:Id.Lit_Chars val:'\t)\n' span_id:655) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'Auto discovery' span_id:662))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:666) (Token id: Id.Lit_Chars val: '\techo "gitdir: repo.git/repos/foo" >.git &&\n' span_id: 667 ) (Token id:Id.Lit_Chars val:'\techo ../.. >repo.git/repos/foo/commondir &&\n' span_id:668) (Token id:Id.Lit_Chars val:'\t(\n' span_id:669) (Token id:Id.Lit_Chars val:'\t\tcd work &&\n' span_id:670) (Token id: Id.Lit_Chars val: '\t\tgit rev-parse --git-common-dir >actual &&\n' span_id: 671 ) (Token id: Id.Lit_Chars val: '\t\ttest-path-utils real_path "$TRASH_DIRECTORY/repo.git" >expect &&\n' span_id: 672 ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual &&\n' span_id:673) (Token id:Id.Lit_Chars val:'\t\techo haha >data1 &&\n' span_id:674) (Token id:Id.Lit_Chars val:'\t\tgit add data1 &&\n' span_id:675) (Token id: Id.Lit_Chars val: '\t\tgit ls-files --full-name :/ | grep data1 >actual &&\n' span_id: 676 ) (Token id:Id.Lit_Chars val:'\t\techo work/data1 >expect &&\n' span_id:677) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual\n' span_id:678) (Token id:Id.Lit_Chars val:'\t)\n' span_id:679) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'$GIT_DIR/common overrides core.worktree' span_id:686))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:690) (Token id:Id.Lit_Chars val:'\tmkdir elsewhere &&\n' span_id:691) (Token id: Id.Lit_Chars val: '\tgit --git-dir=repo.git config core.worktree "$TRASH_DIRECTORY/elsewhere" &&\n' span_id: 692 ) (Token id:Id.Lit_Chars val:'\techo "gitdir: repo.git/repos/foo" >.git &&\n' span_id:693) (Token id: Id.Lit_Chars val: '\techo ../.. >repo.git/repos/foo/commondir &&\n' span_id: 694 ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:695) (Token id:Id.Lit_Chars val:'\t\tcd work &&\n' span_id:696) (Token id:Id.Lit_Chars val:'\t\tgit rev-parse --git-common-dir >actual &&\n' span_id:697) (Token id: Id.Lit_Chars val: '\t\ttest-path-utils real_path "$TRASH_DIRECTORY/repo.git" >expect &&\n' span_id: 698 ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual &&\n' span_id:699) (Token id:Id.Lit_Chars val:'\t\techo haha >data2 &&\n' span_id:700) (Token id:Id.Lit_Chars val:'\t\tgit add data2 &&\n' span_id:701) (Token id: Id.Lit_Chars val: '\t\tgit ls-files --full-name :/ | grep data2 >actual &&\n' span_id: 702 ) (Token id:Id.Lit_Chars val:'\t\techo work/data2 >expect &&\n' span_id:703) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual\n' span_id:704) (Token id:Id.Lit_Chars val:'\t)\n' span_id:705) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'$GIT_WORK_TREE overrides $GIT_DIR/common' span_id:712))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:716) (Token id: Id.Lit_Chars val: '\techo "gitdir: repo.git/repos/foo" >.git &&\n' span_id: 717 ) (Token id:Id.Lit_Chars val:'\techo ../.. >repo.git/repos/foo/commondir &&\n' span_id:718) (Token id:Id.Lit_Chars val:'\t(\n' span_id:719) (Token id:Id.Lit_Chars val:'\t\tcd work &&\n' span_id:720) (Token id:Id.Lit_Chars val:'\t\techo haha >data3 &&\n' span_id:721) (Token id:Id.Lit_Chars val:'\t\tgit --git-dir=../.git --work-tree=. add data3 &&\n' span_id:722) (Token id: Id.Lit_Chars val: '\t\tgit ls-files --full-name -- :/ | grep data3 >actual &&\n' span_id: 723 ) (Token id:Id.Lit_Chars val:'\t\techo data3 >expect &&\n' span_id:724) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual\n' span_id:725) (Token id:Id.Lit_Chars val:'\t)\n' span_id:726) ) } ) (C {(test_done)}) ] )