1#!/bin/sh23test_description='sparse checkout tests45* (tag: removed, master) removed6| D sub/added7* (HEAD, tag: top) modified and added8| M init.t9| A sub/added10* (tag: init) init11A init.t12'1314. ./test-lib.sh1516test_expect_success 'setup' '17cat >expected <<-\EOF &&18100644 77f0ba1734ed79d12881f81b36ee134de6a3327b 0 init.t19100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 sub/added20EOF21cat >expected.swt <<-\EOF &&22H init.t23H sub/added24EOF2526test_commit init &&27echo modified >>init.t &&28mkdir sub &&29touch sub/added &&30git add init.t sub/added &&31git commit -m "modified and added" &&32git tag top &&33git rm sub/added &&34git commit -m removed &&35git tag removed &&36git checkout top &&37git ls-files --stage >result &&38test_cmp expected result39'4041test_expect_success 'read-tree without .git/info/sparse-checkout' '42git read-tree -m -u HEAD &&43git ls-files --stage >result &&44test_cmp expected result &&45git ls-files -t >result &&46test_cmp expected.swt result47'4849test_expect_success 'read-tree with .git/info/sparse-checkout but disabled' '50echo >.git/info/sparse-checkout51git read-tree -m -u HEAD &&52git ls-files -t >result &&53test_cmp expected.swt result &&54test -f init.t &&55test -f sub/added56'5758test_expect_success 'read-tree --no-sparse-checkout with empty .git/info/sparse-checkout and enabled' '59git config core.sparsecheckout true &&60echo >.git/info/sparse-checkout &&61git read-tree --no-sparse-checkout -m -u HEAD &&62git ls-files -t >result &&63test_cmp expected.swt result &&64test -f init.t &&65test -f sub/added66'6768test_expect_success 'read-tree with empty .git/info/sparse-checkout' '69git config core.sparsecheckout true &&70echo >.git/info/sparse-checkout &&71test_must_fail git read-tree -m -u HEAD &&72git ls-files --stage >result &&73test_cmp expected result &&74git ls-files -t >result &&75test_cmp expected.swt result &&76test -f init.t &&77test -f sub/added78'7980test_expect_success 'match directories with trailing slash' '81cat >expected.swt-noinit <<-\EOF &&82S init.t83H sub/added84EOF8586echo sub/ > .git/info/sparse-checkout &&87git read-tree -m -u HEAD &&88git ls-files -t > result &&89test_cmp expected.swt-noinit result &&90test ! -f init.t &&91test -f sub/added92'9394test_expect_failure 'match directories without trailing slash' '95echo init.t >.git/info/sparse-checkout &&96echo sub >>.git/info/sparse-checkout &&97git read-tree -m -u HEAD &&98git ls-files -t >result &&99test_cmp expected.swt result &&100test ! -f init.t &&101test -f sub/added102'103104test_expect_success 'checkout area changes' '105cat >expected.swt-nosub <<-\EOF &&106H init.t107S sub/added108EOF109110echo init.t >.git/info/sparse-checkout &&111git read-tree -m -u HEAD &&112git ls-files -t >result &&113test_cmp expected.swt-nosub result &&114test -f init.t &&115test ! -f sub/added116'117118test_expect_success 'read-tree updates worktree, absent case' '119echo sub/added >.git/info/sparse-checkout &&120git checkout -f top &&121git read-tree -m -u HEAD^ &&122test ! -f init.t123'124125test_expect_success 'read-tree updates worktree, dirty case' '126echo sub/added >.git/info/sparse-checkout &&127git checkout -f top &&128echo dirty >init.t &&129git read-tree -m -u HEAD^ &&130grep -q dirty init.t &&131rm init.t132'133134test_expect_success 'read-tree removes worktree, dirty case' '135echo init.t >.git/info/sparse-checkout &&136git checkout -f top &&137echo dirty >added &&138git read-tree -m -u HEAD^ &&139grep -q dirty added140'141142test_expect_success 'read-tree adds to worktree, absent case' '143echo init.t >.git/info/sparse-checkout &&144git checkout -f removed &&145git read-tree -u -m HEAD^ &&146test ! -f sub/added147'148149test_expect_success 'read-tree adds to worktree, dirty case' '150echo init.t >.git/info/sparse-checkout &&151git checkout -f removed &&152mkdir sub &&153echo dirty >sub/added &&154git read-tree -u -m HEAD^ &&155grep -q dirty sub/added156'157158test_expect_success 'index removal and worktree narrowing at the same time' '159>empty &&160echo init.t >.git/info/sparse-checkout &&161echo sub/added >>.git/info/sparse-checkout &&162git checkout -f top &&163echo init.t >.git/info/sparse-checkout &&164git checkout removed &&165git ls-files sub/added >result &&166test ! -f sub/added &&167test_cmp empty result168'169170test_expect_success 'read-tree --reset removes outside worktree' '171>empty &&172echo init.t >.git/info/sparse-checkout &&173git checkout -f top &&174git reset --hard removed &&175git ls-files sub/added >result &&176test_cmp empty result177'178179test_done