(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <"git checkout from subdirectories">)}
          spids: [10]
        )
      ]
      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)})
  ]
)