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