(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:'git checkout from subdirectories' span_id:12))}
          spids: [10]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:26) (Token id:Id.Lit_Chars val:'\n' span_id:27) 
          (Token id:Id.Lit_Chars val:'\techo "base" > file0 &&\n' span_id:28) (Token id:Id.Lit_Chars val:'\tgit add file0 &&\n' span_id:29) 
          (Token id:Id.Lit_Chars val:'\tmkdir dir1 &&\n' span_id:30) (Token id:Id.Lit_Chars val:'\techo "hello" > dir1/file1 &&\n' span_id:31) 
          (Token id:Id.Lit_Chars val:'\tgit add dir1/file1 &&\n' span_id:32) (Token id:Id.Lit_Chars val:'\tmkdir dir2 &&\n' span_id:33) 
          (Token id:Id.Lit_Chars val:'\techo "bonjour" > dir2/file2 &&\n' span_id:34) (Token id:Id.Lit_Chars val:'\tgit add dir2/file2 &&\n' span_id:35) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:36) (Token id:Id.Lit_Chars val:'\tgit commit -m "populate tree"\n' span_id:37) 
          (Token id:Id.Lit_Chars val:'\n' span_id:38)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'remove and restore with relative path' span_id:45))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:49) (Token id:Id.Lit_Chars val:'\n' span_id:50) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:51) (Token id:Id.Lit_Chars val:'\t\tcd dir1 &&\n' span_id:52) 
          (Token id:Id.Lit_Chars val:'\t\trm ../file0 &&\n' span_id:53) (Token id:Id.Lit_Chars val:'\t\tgit checkout HEAD -- ../file0 &&\n' span_id:54) 
          (Token id:Id.Lit_Chars val:'\t\ttest "base" = "$(cat ../file0)" &&\n' span_id:55) (Token id:Id.Lit_Chars val:'\t\trm ../dir2/file2 &&\n' span_id:56) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit checkout HEAD -- ../dir2/file2 &&\n'
            span_id: 57
          ) (Token id:Id.Lit_Chars val:'\t\ttest "bonjour" = "$(cat ../dir2/file2)" &&\n' span_id:58) 
          (Token id:Id.Lit_Chars val:'\t\trm ../file0 ./file1 &&\n' span_id:59) (Token id:Id.Lit_Chars val:'\t\tgit checkout HEAD -- .. &&\n' span_id:60) 
          (Token id:Id.Lit_Chars val:'\t\ttest "base" = "$(cat ../file0)" &&\n' span_id:61) (Token id:Id.Lit_Chars val:'\t\ttest "hello" = "$(cat file1)"\n' span_id:62) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:63) (Token id:Id.Lit_Chars val:'\n' span_id:64)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'checkout with empty prefix' span_id:71))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:75) (Token id:Id.Lit_Chars val:'\n' span_id:76) 
          (Token id:Id.Lit_Chars val:'\trm file0 &&\n' span_id:77) (Token id:Id.Lit_Chars val:'\tgit checkout HEAD -- file0 &&\n' span_id:78) 
          (Token id:Id.Lit_Chars val:'\ttest "base" = "$(cat file0)"\n' span_id:79) (Token id:Id.Lit_Chars val:'\n' span_id:80)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'checkout with simple prefix' span_id:87))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:91) (Token id:Id.Lit_Chars val:'\n' span_id:92) 
          (Token id:Id.Lit_Chars val:'\trm dir1/file1 &&\n' span_id:93) (Token id:Id.Lit_Chars val:'\tgit checkout HEAD -- dir1 &&\n' span_id:94) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "hello" = "$(cat dir1/file1)" &&\n'
            span_id: 95
          ) (Token id:Id.Lit_Chars val:'\trm dir1/file1 &&\n' span_id:96) 
          (Token id:Id.Lit_Chars val:'\tgit checkout HEAD -- dir1/file1 &&\n' span_id:97) (Token id:Id.Lit_Chars val:'\ttest "hello" = "$(cat dir1/file1)"\n' span_id:98) 
          (Token id:Id.Lit_Chars val:'\n' span_id:99)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'checkout with complex relative path' span_id:106))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:110) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:111) (Token id:Id.Lit_Chars val:'\t\tcd dir1 &&\n' span_id:112) 
          (Token id:Id.Lit_Chars val:'\t\trm file1 &&\n' span_id:113) (Token id:Id.Lit_Chars val:'\t\tgit checkout HEAD -- ../dir1/../dir1/file1 &&\n' span_id:114) 
          (Token id:Id.Lit_Chars val:'\t\ttest "hello" = "$(cat file1)"\n' span_id:115) (Token id:Id.Lit_Chars val:'\t)\n' span_id:116)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'relative path outside tree should fail' span_id:123))} {(SQ (Token id:Id.Lit_Chars val:'test_must_fail git checkout HEAD -- ../../Makefile' span_id:129))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'incorrect relative path to file should fail (1)' span_id:136))} {(SQ (Token id:Id.Lit_Chars val:'test_must_fail git checkout HEAD -- ../file0' span_id:142))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'incorrect relative path should fail (2)' span_id:149))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '( cd dir1 && test_must_fail git checkout HEAD -- ./file0 )'
            span_id: 155
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'incorrect relative path should fail (3)' span_id:162))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '( cd dir1 && test_must_fail git checkout HEAD -- ../../file0 )'
            span_id: 168
          )
        )
      }
    )
    (C {(test_done)})
  ]
)