object-file: use unsigned arithmetic with bit mask
[git/debian.git] / t / t7817-grep-sparse-checkout.sh
blob590b99bbb6f7bbc2182acf528a4cef566075cc68
1 #!/bin/sh
3 test_description='grep in sparse checkout
5 This test creates a repo with the following structure:
8 |-- a
9 |-- b
10 |-- dir
11 | `-- c
12 |-- sub
13 | |-- A
14 | | `-- a
15 | `-- B
16 | `-- b
17 `-- sub2
18 `-- a
20 Where the outer repository has non-cone mode sparsity patterns, sub is a
21 submodule with cone mode sparsity patterns and sub2 is a submodule that is
22 excluded by the superproject sparsity patterns. The resulting sparse checkout
23 should leave the following structure in the working tree:
26 |-- a
27 |-- sub
28 | `-- B
29 | `-- b
30 `-- sub2
31 `-- a
33 But note that sub2 should have the SKIP_WORKTREE bit set.
36 . ./test-lib.sh
38 test_expect_success 'setup' '
39 echo "text" >a &&
40 echo "text" >b &&
41 mkdir dir &&
42 echo "text" >dir/c &&
44 git init sub &&
46 cd sub &&
47 mkdir A B &&
48 echo "text" >A/a &&
49 echo "text" >B/b &&
50 git add A B &&
51 git commit -m sub &&
52 git sparse-checkout init --cone &&
53 git sparse-checkout set B
54 ) &&
56 git init sub2 &&
58 cd sub2 &&
59 echo "text" >a &&
60 git add a &&
61 git commit -m sub2
62 ) &&
64 git submodule add ./sub &&
65 git submodule add ./sub2 &&
66 git add a b dir &&
67 git commit -m super &&
68 git sparse-checkout init --no-cone &&
69 git sparse-checkout set "/*" "!b" "!/*/" "sub" &&
71 git tag -am tag-to-commit tag-to-commit HEAD &&
72 tree=$(git rev-parse HEAD^{tree}) &&
73 git tag -am tag-to-tree tag-to-tree $tree &&
75 test_path_is_missing b &&
76 test_path_is_missing dir &&
77 test_path_is_missing sub/A &&
78 test_path_is_file a &&
79 test_path_is_file sub/B/b &&
80 test_path_is_file sub2/a &&
81 git branch -m main
84 # The test below covers a special case: the sparsity patterns exclude '/b' and
85 # sparse checkout is enabled, but the path exists in the working tree (e.g.
86 # manually created after `git sparse-checkout init`). git grep should skip it.
87 test_expect_success 'working tree grep honors sparse checkout' '
88 cat >expect <<-EOF &&
89 a:text
90 EOF
91 test_when_finished "rm -f b" &&
92 echo "new-text" >b &&
93 git grep "text" >actual &&
94 test_cmp expect actual
97 test_expect_success 'grep searches unmerged file despite not matching sparsity patterns' '
98 cat >expect <<-EOF &&
99 b:modified-b-in-branchX
100 b:modified-b-in-branchY
102 test_when_finished "test_might_fail git merge --abort && \
103 git checkout main && git sparse-checkout init" &&
105 git sparse-checkout disable &&
106 git checkout -b branchY main &&
107 test_commit modified-b-in-branchY b &&
108 git checkout -b branchX main &&
109 test_commit modified-b-in-branchX b &&
111 git sparse-checkout init &&
112 test_path_is_missing b &&
113 test_must_fail git merge branchY &&
114 git grep "modified-b" >actual &&
115 test_cmp expect actual
118 test_expect_success 'grep --cached searches entries with the SKIP_WORKTREE bit' '
119 cat >expect <<-EOF &&
120 a:text
121 b:text
122 dir/c:text
124 git grep --cached "text" >actual &&
125 test_cmp expect actual
128 # Note that sub2/ is present in the worktree but it is excluded by the sparsity
129 # patterns, so grep should not recurse into it.
130 test_expect_success 'grep --recurse-submodules honors sparse checkout in submodule' '
131 cat >expect <<-EOF &&
132 a:text
133 sub/B/b:text
135 git grep --recurse-submodules "text" >actual &&
136 test_cmp expect actual
139 test_expect_success 'grep --recurse-submodules --cached searches entries with the SKIP_WORKTREE bit' '
140 cat >expect <<-EOF &&
141 a:text
142 b:text
143 dir/c:text
144 sub/A/a:text
145 sub/B/b:text
146 sub2/a:text
148 git grep --recurse-submodules --cached "text" >actual &&
149 test_cmp expect actual
152 test_expect_success 'working tree grep does not search the index with CE_VALID and SKIP_WORKTREE' '
153 cat >expect <<-EOF &&
154 a:text
156 test_when_finished "git update-index --no-assume-unchanged b" &&
157 git update-index --assume-unchanged b &&
158 git grep text >actual &&
159 test_cmp expect actual
162 test_expect_success 'grep --cached searches index entries with both CE_VALID and SKIP_WORKTREE' '
163 cat >expect <<-EOF &&
164 a:text
165 b:text
166 dir/c:text
168 test_when_finished "git update-index --no-assume-unchanged b" &&
169 git update-index --assume-unchanged b &&
170 git grep --cached text >actual &&
171 test_cmp expect actual
174 test_done