(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: 
            {
              (SQ <"sparse checkout tests\n"> <"\n"> <"* (tag: removed, master) removed\n"> 
                <"| D\tsub/added\n"> <"* (HEAD, tag: top) modified and added\n"> <"| M\tinit.t\n"> <"| A\tsub/added\n"> 
                <"* (tag: init) init\n"> <"  A\tinit.t\n">
              )
            }
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(.)} {(DQ ($ VSub_Name "$TEST_DIRECTORY")) (/lib-read-tree.sh)})
    (C {(test_expect_success)} {(SQ <setup>)} 
      {
        (SQ <"\n"> <"\tcat >expected <<-EOF &&\n"> 
          <"\t100644 77f0ba1734ed79d12881f81b36ee134de6a3327b 0\tinit.t\n"> <"\t100644 $EMPTY_BLOB 0\tsub/added\n"> <"\t100644 $EMPTY_BLOB 0\tsub/addedtoo\n"> 
          <"\t100644 $EMPTY_BLOB 0\tsubsub/added\n"> <"\tEOF\n"> <"\tcat >expected.swt <<-\\EOF &&\n"> <"\tH init.t\n"> <"\tH sub/added\n"> 
          <"\tH sub/addedtoo\n"> <"\tH subsub/added\n"> <"\tEOF\n"> <"\n"> <"\ttest_commit init &&\n"> <"\techo modified >>init.t &&\n"> 
          <"\tmkdir sub subsub &&\n"> <"\ttouch sub/added sub/addedtoo subsub/added &&\n"> 
          <"\tgit add init.t sub/added sub/addedtoo subsub/added &&\n"> <"\tgit commit -m \"modified and added\" &&\n"> <"\tgit tag top &&\n"> <"\tgit rm sub/added &&\n"> 
          <"\tgit commit -m removed &&\n"> <"\tgit tag removed &&\n"> <"\tgit checkout top &&\n"> <"\tgit ls-files --stage >result &&\n"> 
          <"\ttest_cmp expected result\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"read-tree without .git/info/sparse-checkout">)} 
      {
        (SQ <"\n"> <"\tread_tree_u_must_succeed -m -u HEAD &&\n"> 
          <"\tgit ls-files --stage >result &&\n"> <"\ttest_cmp expected result &&\n"> <"\tgit ls-files -t >result &&\n"> 
          <"\ttest_cmp expected.swt result\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"read-tree with .git/info/sparse-checkout but disabled">)} 
      {
        (SQ <"\n"> <"\techo >.git/info/sparse-checkout &&\n"> 
          <"\tread_tree_u_must_succeed -m -u HEAD &&\n"> <"\tgit ls-files -t >result &&\n"> <"\ttest_cmp expected.swt result &&\n"> <"\ttest -f init.t &&\n"> 
          <"\ttest -f sub/added\n">
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <"read-tree --no-sparse-checkout with empty .git/info/sparse-checkout and enabled">)} 
      {
        (SQ <"\n"> <"\tgit config core.sparsecheckout true &&\n"> 
          <"\techo >.git/info/sparse-checkout &&\n"> <"\tread_tree_u_must_succeed --no-sparse-checkout -m -u HEAD &&\n"> <"\tgit ls-files -t >result &&\n"> 
          <"\ttest_cmp expected.swt result &&\n"> <"\ttest -f init.t &&\n"> <"\ttest -f sub/added\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"read-tree with empty .git/info/sparse-checkout">)} 
      {
        (SQ <"\n"> <"\tgit config core.sparsecheckout true &&\n"> 
          <"\techo >.git/info/sparse-checkout &&\n"> <"\tread_tree_u_must_fail -m -u HEAD &&\n"> <"\tgit ls-files --stage >result &&\n"> 
          <"\ttest_cmp expected result &&\n"> <"\tgit ls-files -t >result &&\n"> <"\ttest_cmp expected.swt result &&\n"> <"\ttest -f init.t &&\n"> 
          <"\ttest -f sub/added\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"match directories with trailing slash">)} 
      {
        (SQ <"\n"> <"\tcat >expected.swt-noinit <<-\\EOF &&\n"> <"\tS init.t\n"> <"\tH sub/added\n"> 
          <"\tH sub/addedtoo\n"> <"\tS subsub/added\n"> <"\tEOF\n"> <"\n"> <"\techo sub/ > .git/info/sparse-checkout &&\n"> 
          <"\tread_tree_u_must_succeed -m -u HEAD &&\n"> <"\tgit ls-files -t > result &&\n"> <"\ttest_cmp expected.swt-noinit result &&\n"> 
          <"\ttest ! -f init.t &&\n"> <"\ttest -f sub/added\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"match directories without trailing slash">)} 
      {
        (SQ <"\n"> <"\techo sub >.git/info/sparse-checkout &&\n"> 
          <"\tread_tree_u_must_succeed -m -u HEAD &&\n"> <"\tgit ls-files -t >result &&\n"> <"\ttest_cmp expected.swt-noinit result &&\n"> 
          <"\ttest ! -f init.t &&\n"> <"\ttest -f sub/added\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"match directories with negated patterns">)} 
      {
        (SQ <"\n"> <"\tcat >expected.swt-negation <<\\EOF &&\n"> <"S init.t\n"> <"S sub/added\n"> 
          <"H sub/addedtoo\n"> <"S subsub/added\n"> <"EOF\n"> <"\n"> <"\tcat >.git/info/sparse-checkout <<\\EOF &&\n"> <"sub\n"> 
          <"!sub/added\n"> <"EOF\n"> <"\tgit read-tree -m -u HEAD &&\n"> <"\tgit ls-files -t >result &&\n"> 
          <"\ttest_cmp expected.swt-negation result &&\n"> <"\ttest ! -f init.t &&\n"> <"\ttest ! -f sub/added &&\n"> <"\ttest -f sub/addedtoo\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"match directories with negated patterns (2)">)} 
      {
        (SQ <"\n"> <"\tcat >expected.swt-negation2 <<\\EOF &&\n"> <"H init.t\n"> <"H sub/added\n"> 
          <"S sub/addedtoo\n"> <"H subsub/added\n"> <"EOF\n"> <"\n"> <"\tcat >.git/info/sparse-checkout <<\\EOF &&\n"> <"/*\n"> 
          <"!sub\n"> <"sub/added\n"> <"EOF\n"> <"\tgit read-tree -m -u HEAD &&\n"> <"\tgit ls-files -t >result &&\n"> 
          <"\ttest_cmp expected.swt-negation2 result &&\n"> <"\ttest -f init.t &&\n"> <"\ttest -f sub/added &&\n"> <"\ttest ! -f sub/addedtoo\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"match directory pattern">)} 
      {
        (SQ <"\n"> <"\techo \"s?b\" >.git/info/sparse-checkout &&\n"> 
          <"\tread_tree_u_must_succeed -m -u HEAD &&\n"> <"\tgit ls-files -t >result &&\n"> <"\ttest_cmp expected.swt-noinit result &&\n"> 
          <"\ttest ! -f init.t &&\n"> <"\ttest -f sub/added\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"checkout area changes">)} 
      {
        (SQ <"\n"> <"\tcat >expected.swt-nosub <<-\\EOF &&\n"> <"\tH init.t\n"> <"\tS sub/added\n"> 
          <"\tS sub/addedtoo\n"> <"\tS subsub/added\n"> <"\tEOF\n"> <"\n"> <"\techo init.t >.git/info/sparse-checkout &&\n"> 
          <"\tread_tree_u_must_succeed -m -u HEAD &&\n"> <"\tgit ls-files -t >result &&\n"> <"\ttest_cmp expected.swt-nosub result &&\n"> 
          <"\ttest -f init.t &&\n"> <"\ttest ! -f sub/added\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"read-tree updates worktree, absent case">)} 
      {
        (SQ <"\n"> <"\techo sub/added >.git/info/sparse-checkout &&\n"> <"\tgit checkout -f top &&\n"> 
          <"\tread_tree_u_must_succeed -m -u HEAD^ &&\n"> <"\ttest ! -f init.t\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"read-tree updates worktree, dirty case">)} 
      {
        (SQ <"\n"> <"\techo sub/added >.git/info/sparse-checkout &&\n"> <"\tgit checkout -f top &&\n"> 
          <"\techo dirty >init.t &&\n"> <"\tread_tree_u_must_succeed -m -u HEAD^ &&\n"> <"\tgrep -q dirty init.t &&\n"> <"\trm init.t\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"read-tree removes worktree, dirty case">)} 
      {
        (SQ <"\n"> <"\techo init.t >.git/info/sparse-checkout &&\n"> <"\tgit checkout -f top &&\n"> 
          <"\techo dirty >added &&\n"> <"\tread_tree_u_must_succeed -m -u HEAD^ &&\n"> <"\tgrep -q dirty added\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"read-tree adds to worktree, absent case">)} 
      {
        (SQ <"\n"> <"\techo init.t >.git/info/sparse-checkout &&\n"> <"\tgit checkout -f removed &&\n"> 
          <"\tread_tree_u_must_succeed -u -m HEAD^ &&\n"> <"\ttest ! -f sub/added\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"read-tree adds to worktree, dirty case">)} 
      {
        (SQ <"\n"> <"\techo init.t >.git/info/sparse-checkout &&\n"> <"\tgit checkout -f removed &&\n"> 
          <"\tmkdir sub &&\n"> <"\techo dirty >sub/added &&\n"> <"\tread_tree_u_must_succeed -u -m HEAD^ &&\n"> 
          <"\tgrep -q dirty sub/added\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"index removal and worktree narrowing at the same time">)} 
      {
        (SQ <"\n"> <"\t>empty &&\n"> <"\techo init.t >.git/info/sparse-checkout &&\n"> 
          <"\techo sub/added >>.git/info/sparse-checkout &&\n"> <"\tgit checkout -f top &&\n"> <"\techo init.t >.git/info/sparse-checkout &&\n"> 
          <"\tgit checkout removed &&\n"> <"\tgit ls-files sub/added >result &&\n"> <"\ttest ! -f sub/added &&\n"> <"\ttest_cmp empty result\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"read-tree --reset removes outside worktree">)} 
      {
        (SQ <"\n"> <"\t>empty &&\n"> <"\techo init.t >.git/info/sparse-checkout &&\n"> 
          <"\tgit checkout -f top &&\n"> <"\tgit reset --hard removed &&\n"> <"\tgit ls-files sub/added >result &&\n"> 
          <"\ttest_cmp empty result\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"print errors when failed to update worktree">)} 
      {
        (SQ <"\n"> <"\techo sub >.git/info/sparse-checkout &&\n"> <"\tgit checkout -f init &&\n"> 
          <"\tmkdir sub &&\n"> <"\ttouch sub/added sub/addedtoo &&\n"> <"\ttest_must_fail git checkout top 2>actual &&\n"> 
          <"\tcat >expected <<\\EOF &&\n"> <"error: The following untracked working tree files would be overwritten by checkout:\n"> 
          <"\tsub/added\n"> <"\tsub/addedtoo\n"> <"Please move or remove them before you switch branches.\n"> <"Aborting\n"> 
          <"EOF\n"> <"\ttest_i18ncmp expected actual\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"checkout without --ignore-skip-worktree-bits">)} 
      {
        (SQ <"\n"> <"\techo \"*\" >.git/info/sparse-checkout &&\n"> <"\tgit checkout -f top &&\n"> 
          <"\ttest_path_is_file init.t &&\n"> <"\techo sub >.git/info/sparse-checkout &&\n"> <"\tgit checkout &&\n"> 
          <"\techo modified >> sub/added &&\n"> <"\tgit checkout . &&\n"> <"\ttest_path_is_missing init.t &&\n"> <"\tgit diff --exit-code HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"checkout with --ignore-skip-worktree-bits">)} 
      {
        (SQ <"\n"> <"\techo \"*\" >.git/info/sparse-checkout &&\n"> <"\tgit checkout -f top &&\n"> 
          <"\ttest_path_is_file init.t &&\n"> <"\techo sub >.git/info/sparse-checkout &&\n"> <"\tgit checkout &&\n"> 
          <"\techo modified >> sub/added &&\n"> <"\tgit checkout --ignore-skip-worktree-bits . &&\n"> <"\ttest_path_is_file init.t &&\n"> 
          <"\tgit diff --exit-code HEAD\n">
        )
      }
    )
    (C {(test_done)})
  ]
)