1#!/bin/sh
23
test_description='sparse checkout tests
45
* (tag: removed, master) removed
6| D sub/added
7* (HEAD, tag: top) modified and added
8| M init.t
9| A sub/added
10* (tag: init) init
11A init.t
12'
1314
. ./test-lib.sh
1516
test_expect_success 'setup' '
17cat >expected <<-\EOF &&
18100644 77f0ba1734ed79d12881f81b36ee134de6a3327b 0 init.t
19100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 sub/added
20100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 subsub/added
21EOF
22cat >expected.swt <<-\EOF &&
23H init.t
24H sub/added
25H subsub/added
26EOF
2728
test_commit init &&
29echo modified >>init.t &&
30mkdir sub subsub &&
31touch sub/added subsub/added &&
32git add init.t sub/added subsub/added &&
33git commit -m "modified and added" &&
34git tag top &&
35git rm sub/added &&
36git commit -m removed &&
37git tag removed &&
38git checkout top &&
39git ls-files --stage >result &&
40test_cmp expected result
41'
4243
test_expect_success 'read-tree without .git/info/sparse-checkout' '
44git read-tree -m -u HEAD &&
45git ls-files --stage >result &&
46test_cmp expected result &&
47git ls-files -t >result &&
48test_cmp expected.swt result
49'
5051
test_expect_success 'read-tree with .git/info/sparse-checkout but disabled' '
52echo >.git/info/sparse-checkout
53git read-tree -m -u HEAD &&
54git ls-files -t >result &&
55test_cmp expected.swt result &&
56test -f init.t &&
57test -f sub/added
58'
5960
test_expect_success 'read-tree --no-sparse-checkout with empty .git/info/sparse-checkout and enabled' '
61git config core.sparsecheckout true &&
62echo >.git/info/sparse-checkout &&
63git read-tree --no-sparse-checkout -m -u HEAD &&
64git ls-files -t >result &&
65test_cmp expected.swt result &&
66test -f init.t &&
67test -f sub/added
68'
6970
test_expect_success 'read-tree with empty .git/info/sparse-checkout' '
71git config core.sparsecheckout true &&
72echo >.git/info/sparse-checkout &&
73test_must_fail git read-tree -m -u HEAD &&
74git ls-files --stage >result &&
75test_cmp expected result &&
76git ls-files -t >result &&
77test_cmp expected.swt result &&
78test -f init.t &&
79test -f sub/added
80'
8182
test_expect_success 'match directories with trailing slash' '
83cat >expected.swt-noinit <<-\EOF &&
84S init.t
85H sub/added
86S subsub/added
87EOF
8889
echo sub/ > .git/info/sparse-checkout &&
90git read-tree -m -u HEAD &&
91git ls-files -t > result &&
92test_cmp expected.swt-noinit result &&
93test ! -f init.t &&
94test -f sub/added
95'
9697
test_expect_failure 'match directories without trailing slash' '
98echo init.t >.git/info/sparse-checkout &&
99echo sub >>.git/info/sparse-checkout &&
100git read-tree -m -u HEAD &&
101git ls-files -t >result &&
102test_cmp expected.swt result &&
103test ! -f init.t &&
104test -f sub/added
105'
106107
test_expect_success 'checkout area changes' '
108cat >expected.swt-nosub <<-\EOF &&
109H init.t
110S sub/added
111S subsub/added
112EOF
113114
echo init.t >.git/info/sparse-checkout &&
115git read-tree -m -u HEAD &&
116git ls-files -t >result &&
117test_cmp expected.swt-nosub result &&
118test -f init.t &&
119test ! -f sub/added
120'
121122
test_expect_success 'read-tree updates worktree, absent case' '
123echo sub/added >.git/info/sparse-checkout &&
124git checkout -f top &&
125git read-tree -m -u HEAD^ &&
126test ! -f init.t
127'
128129
test_expect_success 'read-tree updates worktree, dirty case' '
130echo sub/added >.git/info/sparse-checkout &&
131git checkout -f top &&
132echo dirty >init.t &&
133git read-tree -m -u HEAD^ &&
134grep -q dirty init.t &&
135rm init.t
136'
137138
test_expect_success 'read-tree removes worktree, dirty case' '
139echo init.t >.git/info/sparse-checkout &&
140git checkout -f top &&
141echo dirty >added &&
142git read-tree -m -u HEAD^ &&
143grep -q dirty added
144'
145146
test_expect_success 'read-tree adds to worktree, absent case' '
147echo init.t >.git/info/sparse-checkout &&
148git checkout -f removed &&
149git read-tree -u -m HEAD^ &&
150test ! -f sub/added
151'
152153
test_expect_success 'read-tree adds to worktree, dirty case' '
154echo init.t >.git/info/sparse-checkout &&
155git checkout -f removed &&
156mkdir sub &&
157echo dirty >sub/added &&
158git read-tree -u -m HEAD^ &&
159grep -q dirty sub/added
160'
161162
test_expect_success 'index removal and worktree narrowing at the same time' '
163>empty &&
164echo init.t >.git/info/sparse-checkout &&
165echo sub/added >>.git/info/sparse-checkout &&
166git checkout -f top &&
167echo init.t >.git/info/sparse-checkout &&
168git checkout removed &&
169git ls-files sub/added >result &&
170test ! -f sub/added &&
171test_cmp empty result
172'
173174
test_expect_success 'read-tree --reset removes outside worktree' '
175>empty &&
176echo init.t >.git/info/sparse-checkout &&
177git checkout -f top &&
178git reset --hard removed &&
179git ls-files sub/added >result &&
180test_cmp empty result
181'
182183
test_done