comparison tests/test-branches-obsolete.t @ 51522:5f9350956c03

branchcache: add more test for the logic around obsolescence and branch heads While working on branch-cache-v3, we noticed some ambiguity in the filtered+obsolete hash. However this was only caught by a rebase test by chance. It seems important to explicitly tests these cases.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 28 Feb 2024 12:56:08 +0100
parents
children 88b0e07dd2cd
comparison
equal deleted inserted replaced
51521:0d4a6ab3c8da 51522:5f9350956c03
1 ================================================================
2 test the interaction of the branch cache with obsolete changeset
3 ================================================================
4
5 Some corner case have been covered by unrelated test (like rebase ones) this
6 file meant to gather explicite testing of those.
7
8 See also: test-obsolete-checkheads.t
9
10 #testcases v2 v3
11
12 $ cat >> $HGRCPATH << EOF
13 > [phases]
14 > publish = false
15 > [experimental]
16 > evolution = all
17 > server.allow-hidden-access = *
18 > EOF
19
20 #if v3
21 $ cat <<EOF >> $HGRCPATH
22 > [experimental]
23 > branch-cache-v3=yes
24 > EOF
25 #else
26 $ cat <<EOF >> $HGRCPATH
27 > [experimental]
28 > branch-cache-v3=no
29 > EOF
30 #endif
31
32 Setup graph
33 #############
34
35 $ . $RUNTESTDIR/testlib/common.sh
36
37 graph with a single branch
38 --------------------------
39
40 We want some branching and some obsolescence
41
42 $ hg init main-single-branch
43 $ cd main-single-branch
44 $ mkcommit root
45 $ mkcommit A_1
46 $ mkcommit A_2
47 $ hg update 'desc("A_2")' --quiet
48 $ mkcommit B_1
49 $ mkcommit B_2
50 $ mkcommit B_3
51 $ mkcommit B_4
52 $ hg update 'desc("A_2")' --quiet
53 $ mkcommit A_3
54 created new head
55 $ mkcommit A_4
56 $ hg up null --quiet
57 $ hg clone --noupdate . ../main-single-branch-pre-ops
58 $ hg log -r 'desc("A_1")' -T '{node}' > ../main-single-branch-node_A1
59 $ hg log -r 'desc("A_2")' -T '{node}' > ../main-single-branch-node_A2
60 $ hg log -r 'desc("A_3")' -T '{node}' > ../main-single-branch-node_A3
61 $ hg log -r 'desc("A_4")' -T '{node}' > ../main-single-branch-node_A4
62 $ hg log -r 'desc("B_1")' -T '{node}' > ../main-single-branch-node_B1
63 $ hg log -r 'desc("B_2")' -T '{node}' > ../main-single-branch-node_B2
64 $ hg log -r 'desc("B_3")' -T '{node}' > ../main-single-branch-node_B3
65 $ hg log -r 'desc("B_4")' -T '{node}' > ../main-single-branch-node_B4
66
67 (double check the heads are right before we obsolete)
68
69 $ hg log -R ../main-single-branch-pre-ops -G -T '{desc}\n'
70 o A_4
71 |
72 o A_3
73 |
74 | o B_4
75 | |
76 | o B_3
77 | |
78 | o B_2
79 | |
80 | o B_1
81 |/
82 o A_2
83 |
84 o A_1
85 |
86 o root
87
88 $ hg log -G -T '{desc}\n'
89 o A_4
90 |
91 o A_3
92 |
93 | o B_4
94 | |
95 | o B_3
96 | |
97 | o B_2
98 | |
99 | o B_1
100 |/
101 o A_2
102 |
103 o A_1
104 |
105 o root
106
107 $ hg log -T '{desc}\n' --rev 'head()'
108 B_4
109 A_4
110
111 Absolete a couple of changes
112
113 $ for d in B2 B3 B4 A4; do
114 > hg debugobsolete --record-parents `cat ../main-single-branch-node_$d`;
115 > done
116 1 new obsolescence markers
117 obsoleted 1 changesets
118 2 new orphan changesets
119 1 new obsolescence markers
120 obsoleted 1 changesets
121 1 new obsolescence markers
122 obsoleted 1 changesets
123 1 new obsolescence markers
124 obsoleted 1 changesets
125
126 (double check the result is okay)
127
128 $ hg log -G -T '{desc}\n'
129 o A_3
130 |
131 | o B_1
132 |/
133 o A_2
134 |
135 o A_1
136 |
137 o root
138
139 $ hg heads -T '{desc}\n'
140 A_3
141 B_1
142 $ cd ..
143
144
145 Actual testing
146 ##############
147
148 Revealing obsolete changeset
149 ----------------------------
150
151 Check that revealing obsolete changesets does not confuse branch computation and checks
152
153 Revealing tipmost changeset
154 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
155
156
157 $ cp -R ./main-single-branch tmp-repo
158 $ cd tmp-repo
159 $ hg update --hidden --rev 'desc("A_4")' --quiet
160 updated to hidden changeset 3d808bbc9440
161 (hidden revision '3d808bbc9440' is pruned)
162 $ hg log -G -T '{desc}\n'
163 @ A_4
164 |
165 o A_3
166 |
167 | o B_1
168 |/
169 o A_2
170 |
171 o A_1
172 |
173 o root
174
175 $ hg heads -T '{desc}\n'
176 A_3
177 B_1
178
179 Even when computing branches from scratch
180
181 $ rm -rf .hg/cache/branch*
182 $ rm -rf .hg/wcache/branch*
183 $ hg heads -T '{desc}\n'
184 A_3
185 B_1
186
187 And we can get back to normal
188
189 $ hg update null --quiet
190 $ hg heads -T '{desc}\n'
191 A_3
192 B_1
193
194 $ cd ..
195 $ rm -rf tmp-repo
196
197 Revealing changeset in the middle of the changelog
198 ~~~~~~~~~~~~~~~~~~~~~~~~~~~------------------------
199
200 Check that revealing an obsolete changeset does not confuse branch computation and checks
201
202 $ cp -R ./main-single-branch tmp-repo
203 $ cd tmp-repo
204 $ hg update --hidden --rev 'desc("B_3")' --quiet
205 updated to hidden changeset 9c996d7674bb
206 (hidden revision '9c996d7674bb' is pruned)
207 $ hg log -G -T '{desc}\n'
208 o A_3
209 |
210 | @ B_3
211 | |
212 | x B_2
213 | |
214 | o B_1
215 |/
216 o A_2
217 |
218 o A_1
219 |
220 o root
221
222 $ hg heads -T '{desc}\n'
223 A_3
224 B_1
225
226 Even when computing branches from scratch
227
228 $ rm -rf .hg/cache/branch*
229 $ rm -rf .hg/wcache/branch*
230 $ hg heads -T '{desc}\n'
231 A_3
232 B_1
233
234 And we can get back to normal
235
236 $ hg update null --quiet
237 $ hg heads -T '{desc}\n'
238 A_3
239 B_1
240
241 $ cd ..
242 $ rm -rf tmp-repo
243
244 Getting the obsolescence marker after the fact for the tip rev
245 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
246
247 $ cp -R ./main-single-branch-pre-ops tmp-repo
248 $ cd tmp-repo
249 $ hg update --hidden --rev 'desc("A_4")' --quiet
250 $ hg log -G -T '{desc}\n'
251 @ A_4
252 |
253 o A_3
254 |
255 | o B_4
256 | |
257 | o B_3
258 | |
259 | o B_2
260 | |
261 | o B_1
262 |/
263 o A_2
264 |
265 o A_1
266 |
267 o root
268
269 $ hg heads -T '{desc}\n'
270 A_4
271 B_4
272 $ hg pull --rev `cat ../main-single-branch-node_A4` --remote-hidden
273 pulling from $TESTTMP/main-single-branch
274 no changes found
275 1 new obsolescence markers
276 obsoleted 1 changesets
277
278 branch head are okay
279
280 $ hg heads -T '{desc}\n'
281 A_3
282 B_4
283
284 Even when computing branches from scratch
285
286 $ rm -rf .hg/cache/branch*
287 $ rm -rf .hg/wcache/branch*
288 $ hg heads -T '{desc}\n'
289 A_3
290 B_4
291
292 And we can get back to normal
293
294 $ hg update null --quiet
295 $ hg heads -T '{desc}\n'
296 A_3
297 B_4
298
299 $ cd ..
300 $ rm -rf tmp-repo
301
302 Getting the obsolescence marker after the fact for another rev
303 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
304
305 $ cp -R ./main-single-branch-pre-ops tmp-repo
306 $ cd tmp-repo
307 $ hg update --hidden --rev 'desc("B_3")' --quiet
308 $ hg log -G -T '{desc}\n'
309 o A_4
310 |
311 o A_3
312 |
313 | o B_4
314 | |
315 | @ B_3
316 | |
317 | o B_2
318 | |
319 | o B_1
320 |/
321 o A_2
322 |
323 o A_1
324 |
325 o root
326
327 $ hg heads -T '{desc}\n'
328 A_4
329 B_4
330 $ hg pull --rev `cat ../main-single-branch-node_B4` --remote-hidden
331 pulling from $TESTTMP/main-single-branch
332 no changes found
333 3 new obsolescence markers
334 obsoleted 3 changesets
335
336 branch head are okay
337
338 $ hg heads -T '{desc}\n'
339 A_4
340 B_1
341
342 Even when computing branches from scratch
343
344 $ rm -rf .hg/cache/branch*
345 $ rm -rf .hg/wcache/branch*
346 $ hg heads -T '{desc}\n'
347 A_4
348 B_1
349
350 And we can get back to normal
351
352 $ hg update null --quiet
353 $ hg heads -T '{desc}\n'
354 A_4
355 B_1
356
357 $ cd ..
358 $ rm -rf tmp-repo