(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)})
  ]
)