(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'git checkout from subdirectories'>)}
          spids: [10]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (C {<test_expect_success>} {<setup>} 
      {
        (SQ <'\n'> <'\n'> <'\techo "base" > file0 &&\n'> <'\tgit add file0 &&\n'> <'\tmkdir dir1 &&\n'> 
          <'\techo "hello" > dir1/file1 &&\n'> <'\tgit add dir1/file1 &&\n'> <'\tmkdir dir2 &&\n'> <'\techo "bonjour" > dir2/file2 &&\n'> 
          <'\tgit add dir2/file2 &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m "populate tree"\n'> <'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'remove and restore with relative path'>)} 
      {
        (SQ <'\n'> <'\n'> <'\t(\n'> <'\t\tcd dir1 &&\n'> <'\t\trm ../file0 &&\n'> 
          <'\t\tgit checkout HEAD -- ../file0 &&\n'> <'\t\ttest "base" = "$(cat ../file0)" &&\n'> <'\t\trm ../dir2/file2 &&\n'> 
          <'\t\tgit checkout HEAD -- ../dir2/file2 &&\n'> <'\t\ttest "bonjour" = "$(cat ../dir2/file2)" &&\n'> <'\t\trm ../file0 ./file1 &&\n'> 
          <'\t\tgit checkout HEAD -- .. &&\n'> <'\t\ttest "base" = "$(cat ../file0)" &&\n'> <'\t\ttest "hello" = "$(cat file1)"\n'> <'\t)\n'> <'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout with empty prefix'>)} 
      {
        (SQ <'\n'> <'\n'> <'\trm file0 &&\n'> <'\tgit checkout HEAD -- file0 &&\n'> 
          <'\ttest "base" = "$(cat file0)"\n'> <'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout with simple prefix'>)} 
      {
        (SQ <'\n'> <'\n'> <'\trm dir1/file1 &&\n'> <'\tgit checkout HEAD -- dir1 &&\n'> 
          <'\ttest "hello" = "$(cat dir1/file1)" &&\n'> <'\trm dir1/file1 &&\n'> <'\tgit checkout HEAD -- dir1/file1 &&\n'> 
          <'\ttest "hello" = "$(cat dir1/file1)"\n'> <'\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'checkout with complex relative path'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd dir1 &&\n'> <'\t\trm file1 &&\n'> 
          <'\t\tgit checkout HEAD -- ../dir1/../dir1/file1 &&\n'> <'\t\ttest "hello" = "$(cat file1)"\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'relative path outside tree should fail'>)} 
      {(SQ <'test_must_fail git checkout HEAD -- ../../Makefile'>)}
    )
    (C {<test_expect_success>} {(SQ <'incorrect relative path to file should fail (1)'>)} 
      {(SQ <'test_must_fail git checkout HEAD -- ../file0'>)}
    )
    (C {<test_expect_success>} {(SQ <'incorrect relative path should fail (2)'>)} 
      {(SQ <'( cd dir1 && test_must_fail git checkout HEAD -- ./file0 )'>)}
    )
    (C {<test_expect_success>} {(SQ <'incorrect relative path should fail (3)'>)} 
      {(SQ <'( cd dir1 && test_must_fail git checkout HEAD -- ../../file0 )'>)}
    )
    (C {<test_done>})
  ]
)