3 # This test can give false success if your machine is sufficiently
4 # slow or all trials happened to happen on second boundaries.
6 test_description
='racy split index'
8 TEST_PASSES_SANITIZE_LEAK
=true
11 test_expect_success
'setup' '
12 # Only split the index when the test explicitly says so.
13 sane_unset GIT_TEST_SPLIT_INDEX &&
14 git config splitIndex.maxPercentChange 100 &&
16 echo "cached content" >racy-file &&
18 git commit -m initial &&
20 echo something >other-file &&
21 # No raciness with this file.
22 test-tool chmtime =-20 other-file &&
24 echo "+cached content" >expect
27 check_cached_diff
() {
28 git diff-index
--patch --cached $EMPTY_TREE racy-file
>diff &&
29 tail -1 diff >actual
&&
30 test_cmp expect actual
36 test_expect_success
"split the index while adding a racily clean file #$trial" '
37 rm -f .git/index .git/sharedindex.* &&
39 # The next three commands must be run within the same
40 # second (so both writes to racy-file result in the same
41 # mtime) to create the interesting racy situation.
42 echo "cached content" >racy-file &&
44 # Update and split the index. The cache entry of
45 # racy-file will be stored only in the shared index.
46 git update-index --split-index --add racy-file &&
48 # File size must stay the same.
49 echo "dirty worktree" >racy-file &&
51 # Subsequent git commands should notice that racy-file
52 # and the split index have the same mtime, and check
53 # the content of the file to see if it is actually
61 test_expect_success
"add a racily clean file to an already split index #$trial" '
62 rm -f .git/index .git/sharedindex.* &&
64 git update-index --split-index &&
66 # The next three commands must be run within the same
68 echo "cached content" >racy-file &&
70 # Update the split index. The cache entry of racy-file
71 # will be stored only in the split index.
72 git update-index --add racy-file &&
74 # File size must stay the same.
75 echo "dirty worktree" >racy-file &&
77 # Subsequent git commands should notice that racy-file
78 # and the split index have the same mtime, and check
79 # the content of the file to see if it is actually
87 test_expect_success
"split the index when the index contains a racily clean cache entry #$trial" '
88 rm -f .git/index .git/sharedindex.* &&
90 # The next three commands must be run within the same
92 echo "cached content" >racy-file &&
94 git update-index --add racy-file &&
96 # File size must stay the same.
97 echo "dirty worktree" >racy-file &&
99 # Now wait a bit to ensure that the split index written
100 # below will get a more recent mtime than racy-file.
103 # Update and split the index when the index contains
104 # the racily clean cache entry of racy-file.
105 # A corresponding replacement cache entry with smudged
106 # stat data should be added to the new split index.
107 git update-index --split-index --add other-file &&
109 # Subsequent git commands should notice the smudged
110 # stat data in the replacement cache entry and that it
111 # doesnt match with the file the worktree.
118 test_expect_success
"update the split index when it contains a new racily clean cache entry #$trial" '
119 rm -f .git/index .git/sharedindex.* &&
121 git update-index --split-index &&
123 # The next three commands must be run within the same
125 echo "cached content" >racy-file &&
127 # Update the split index. The cache entry of racy-file
128 # will be stored only in the split index.
129 git update-index --add racy-file &&
131 # File size must stay the same.
132 echo "dirty worktree" >racy-file &&
134 # Now wait a bit to ensure that the split index written
135 # below will get a more recent mtime than racy-file.
138 # Update the split index when the racily clean cache
139 # entry of racy-file is only stored in the split index.
140 # An updated cache entry with smudged stat data should
141 # be added to the new split index.
142 git update-index --add other-file &&
144 # Subsequent git commands should notice the smudged
152 test_expect_success
"update the split index when a racily clean cache entry is stored only in the shared index #$trial" '
153 rm -f .git/index .git/sharedindex.* &&
155 # The next three commands must be run within the same
157 echo "cached content" >racy-file &&
159 # Update and split the index. The cache entry of
160 # racy-file will be stored only in the shared index.
161 git update-index --split-index --add racy-file &&
163 # File size must stay the same.
164 echo "dirty worktree" >racy-file &&
166 # Now wait a bit to ensure that the split index written
167 # below will get a more recent mtime than racy-file.
170 # Update the split index when the racily clean cache
171 # entry of racy-file is only stored in the shared index.
172 # A corresponding replacement cache entry with smudged
173 # stat data should be added to the new split index.
174 git update-index --add other-file &&
176 # Subsequent git commands should notice the smudged
184 test_expect_success
"update the split index after unpack trees() copied a racily clean cache entry from the shared index #$trial" '
185 rm -f .git/index .git/sharedindex.* &&
187 # The next three commands must be run within the same
189 echo "cached content" >racy-file &&
191 # Update and split the index. The cache entry of
192 # racy-file will be stored only in the shared index.
193 git update-index --split-index --add racy-file &&
195 # File size must stay the same.
196 echo "dirty worktree" >racy-file &&
198 # Now wait a bit to ensure that the split index written
199 # below will get a more recent mtime than racy-file.
202 # Update the split index after unpack_trees() copied the
203 # racily clean cache entry of racy-file from the shared
204 # index. A corresponding replacement cache entry
205 # with smudged stat data should be added to the new
207 git read-tree -m HEAD &&
209 # Subsequent git commands should notice the smudged