##// END OF EJS Templates
tests: simplify treemanifest test by backing up entire .hg/store
Martin von Zweigbergk -
r28005:ed94b24a default
parent child Browse files
Show More
@@ -1,520 +1,515 b''
1 1 $ cat << EOF >> $HGRCPATH
2 2 > [format]
3 3 > usegeneraldelta=yes
4 4 > [ui]
5 5 > ssh=python "$TESTDIR/dummyssh"
6 6 > EOF
7 7
8 8 Set up repo
9 9
10 10 $ hg --config experimental.treemanifest=True init repo
11 11 $ cd repo
12 12
13 13 Requirements get set on init
14 14
15 15 $ grep treemanifest .hg/requires
16 16 treemanifest
17 17
18 18 Without directories, looks like any other repo
19 19
20 20 $ echo 0 > a
21 21 $ echo 0 > b
22 22 $ hg ci -Aqm initial
23 23 $ hg debugdata -m 0
24 24 a\x00362fef284ce2ca02aecc8de6d5e8a1c3af0556fe (esc)
25 25 b\x00362fef284ce2ca02aecc8de6d5e8a1c3af0556fe (esc)
26 26
27 27 Submanifest is stored in separate revlog
28 28
29 29 $ mkdir dir1
30 30 $ echo 1 > dir1/a
31 31 $ echo 1 > dir1/b
32 32 $ echo 1 > e
33 33 $ hg ci -Aqm 'add dir1'
34 34 $ hg debugdata -m 1
35 35 a\x00362fef284ce2ca02aecc8de6d5e8a1c3af0556fe (esc)
36 36 b\x00362fef284ce2ca02aecc8de6d5e8a1c3af0556fe (esc)
37 37 dir1\x008b3ffd73f901e83304c83d33132c8e774ceac44et (esc)
38 38 e\x00b8e02f6433738021a065f94175c7cd23db5f05be (esc)
39 39 $ hg debugdata --dir dir1 0
40 40 a\x00b8e02f6433738021a065f94175c7cd23db5f05be (esc)
41 41 b\x00b8e02f6433738021a065f94175c7cd23db5f05be (esc)
42 42
43 43 Can add nested directories
44 44
45 45 $ mkdir dir1/dir1
46 46 $ echo 2 > dir1/dir1/a
47 47 $ echo 2 > dir1/dir1/b
48 48 $ mkdir dir1/dir2
49 49 $ echo 2 > dir1/dir2/a
50 50 $ echo 2 > dir1/dir2/b
51 51 $ hg ci -Aqm 'add dir1/dir1'
52 52 $ hg files -r .
53 53 a
54 54 b
55 55 dir1/a (glob)
56 56 dir1/b (glob)
57 57 dir1/dir1/a (glob)
58 58 dir1/dir1/b (glob)
59 59 dir1/dir2/a (glob)
60 60 dir1/dir2/b (glob)
61 61 e
62 62
63 63 Revision is not created for unchanged directory
64 64
65 65 $ mkdir dir2
66 66 $ echo 3 > dir2/a
67 67 $ hg add dir2
68 68 adding dir2/a (glob)
69 69 $ hg debugindex --dir dir1 > before
70 70 $ hg ci -qm 'add dir2'
71 71 $ hg debugindex --dir dir1 > after
72 72 $ diff before after
73 73 $ rm before after
74 74
75 75 Removing directory does not create an revlog entry
76 76
77 77 $ hg rm dir1/dir1
78 78 removing dir1/dir1/a (glob)
79 79 removing dir1/dir1/b (glob)
80 80 $ hg debugindex --dir dir1/dir1 > before
81 81 $ hg ci -qm 'remove dir1/dir1'
82 82 $ hg debugindex --dir dir1/dir1 > after
83 83 $ diff before after
84 84 $ rm before after
85 85
86 86 Check that hg files (calls treemanifest.walk()) works
87 87 without loading all directory revlogs
88 88
89 89 $ hg co 'desc("add dir2")'
90 90 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
91 91 $ mv .hg/store/meta/dir2 .hg/store/meta/dir2-backup
92 92 $ hg files -r . dir1
93 93 dir1/a (glob)
94 94 dir1/b (glob)
95 95 dir1/dir1/a (glob)
96 96 dir1/dir1/b (glob)
97 97 dir1/dir2/a (glob)
98 98 dir1/dir2/b (glob)
99 99
100 100 Check that status between revisions works (calls treemanifest.matches())
101 101 without loading all directory revlogs
102 102
103 103 $ hg status --rev 'desc("add dir1")' --rev . dir1
104 104 A dir1/dir1/a
105 105 A dir1/dir1/b
106 106 A dir1/dir2/a
107 107 A dir1/dir2/b
108 108 $ mv .hg/store/meta/dir2-backup .hg/store/meta/dir2
109 109
110 110 Merge creates 2-parent revision of directory revlog
111 111
112 112 $ echo 5 > dir1/a
113 113 $ hg ci -Aqm 'modify dir1/a'
114 114 $ hg co '.^'
115 115 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
116 116 $ echo 6 > dir1/b
117 117 $ hg ci -Aqm 'modify dir1/b'
118 118 $ hg merge 'desc("modify dir1/a")'
119 119 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
120 120 (branch merge, don't forget to commit)
121 121 $ hg ci -m 'conflict-free merge involving dir1/'
122 122 $ cat dir1/a
123 123 5
124 124 $ cat dir1/b
125 125 6
126 126 $ hg debugindex --dir dir1
127 127 rev offset length delta linkrev nodeid p1 p2
128 128 0 0 54 -1 1 8b3ffd73f901 000000000000 000000000000
129 129 1 54 68 0 2 68e9d057c5a8 8b3ffd73f901 000000000000
130 130 2 122 12 1 4 4698198d2624 68e9d057c5a8 000000000000
131 131 3 134 55 1 5 44844058ccce 68e9d057c5a8 000000000000
132 132 4 189 55 1 6 bf3d9b744927 68e9d057c5a8 000000000000
133 133 5 244 55 4 7 dde7c0af2a03 bf3d9b744927 44844058ccce
134 134
135 135 Merge keeping directory from parent 1 does not create revlog entry. (Note that
136 136 dir1's manifest does change, but only because dir1/a's filelog changes.)
137 137
138 138 $ hg co 'desc("add dir2")'
139 139 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
140 140 $ echo 8 > dir2/a
141 141 $ hg ci -m 'modify dir2/a'
142 142 created new head
143 143
144 144 $ hg debugindex --dir dir2 > before
145 145 $ hg merge 'desc("modify dir1/a")'
146 146 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
147 147 (branch merge, don't forget to commit)
148 148 $ hg revert -r 'desc("modify dir2/a")' .
149 149 reverting dir1/a (glob)
150 150 $ hg ci -m 'merge, keeping parent 1'
151 151 $ hg debugindex --dir dir2 > after
152 152 $ diff before after
153 153 $ rm before after
154 154
155 155 Merge keeping directory from parent 2 does not create revlog entry. (Note that
156 156 dir2's manifest does change, but only because dir2/a's filelog changes.)
157 157
158 158 $ hg co 'desc("modify dir2/a")'
159 159 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
160 160 $ hg debugindex --dir dir1 > before
161 161 $ hg merge 'desc("modify dir1/a")'
162 162 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
163 163 (branch merge, don't forget to commit)
164 164 $ hg revert -r 'desc("modify dir1/a")' .
165 165 reverting dir2/a (glob)
166 166 $ hg ci -m 'merge, keeping parent 2'
167 167 created new head
168 168 $ hg debugindex --dir dir1 > after
169 169 $ diff before after
170 170 $ rm before after
171 171
172 172 Create flat source repo for tests with mixed flat/tree manifests
173 173
174 174 $ cd ..
175 175 $ hg init repo-flat
176 176 $ cd repo-flat
177 177
178 178 Create a few commits with flat manifest
179 179
180 180 $ echo 0 > a
181 181 $ echo 0 > b
182 182 $ echo 0 > e
183 183 $ for d in dir1 dir1/dir1 dir1/dir2 dir2
184 184 > do
185 185 > mkdir $d
186 186 > echo 0 > $d/a
187 187 > echo 0 > $d/b
188 188 > done
189 189 $ hg ci -Aqm initial
190 190
191 191 $ echo 1 > a
192 192 $ echo 1 > dir1/a
193 193 $ echo 1 > dir1/dir1/a
194 194 $ hg ci -Aqm 'modify on branch 1'
195 195
196 196 $ hg co 0
197 197 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
198 198 $ echo 2 > b
199 199 $ echo 2 > dir1/b
200 200 $ echo 2 > dir1/dir1/b
201 201 $ hg ci -Aqm 'modify on branch 2'
202 202
203 203 $ hg merge 1
204 204 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
205 205 (branch merge, don't forget to commit)
206 206 $ hg ci -m 'merge of flat manifests to new flat manifest'
207 207
208 208 $ hg serve -p $HGPORT -d --pid-file=hg.pid --errorlog=errors.log
209 209 $ cat hg.pid >> $DAEMON_PIDS
210 210
211 211 Create clone with tree manifests enabled
212 212
213 213 $ cd ..
214 214 $ hg clone --config experimental.treemanifest=1 \
215 215 > http://localhost:$HGPORT repo-mixed -r 1
216 216 adding changesets
217 217 adding manifests
218 218 adding file changes
219 219 added 2 changesets with 14 changes to 11 files
220 220 updating to branch default
221 221 11 files updated, 0 files merged, 0 files removed, 0 files unresolved
222 222 $ cd repo-mixed
223 223 $ test -d .hg/store/meta
224 224 [1]
225 225 $ grep treemanifest .hg/requires
226 226 treemanifest
227 227
228 228 Should be possible to push updates from flat to tree manifest repo
229 229
230 230 $ hg -R ../repo-flat push ssh://user@dummy/repo-mixed
231 231 pushing to ssh://user@dummy/repo-mixed
232 232 searching for changes
233 233 remote: adding changesets
234 234 remote: adding manifests
235 235 remote: adding file changes
236 236 remote: added 2 changesets with 3 changes to 3 files
237 237
238 238 Commit should store revlog per directory
239 239
240 240 $ hg co 1
241 241 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
242 242 $ echo 3 > a
243 243 $ echo 3 > dir1/a
244 244 $ echo 3 > dir1/dir1/a
245 245 $ hg ci -m 'first tree'
246 246 created new head
247 247 $ find .hg/store/meta | sort
248 248 .hg/store/meta
249 249 .hg/store/meta/dir1
250 250 .hg/store/meta/dir1/00manifest.i
251 251 .hg/store/meta/dir1/dir1
252 252 .hg/store/meta/dir1/dir1/00manifest.i
253 253 .hg/store/meta/dir1/dir2
254 254 .hg/store/meta/dir1/dir2/00manifest.i
255 255 .hg/store/meta/dir2
256 256 .hg/store/meta/dir2/00manifest.i
257 257
258 258 Merge of two trees
259 259
260 260 $ hg co 2
261 261 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
262 262 $ hg merge 1
263 263 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
264 264 (branch merge, don't forget to commit)
265 265 $ hg ci -m 'merge of flat manifests to new tree manifest'
266 266 created new head
267 267 $ hg diff -r 3
268 268
269 269 Parent of tree root manifest should be flat manifest, and two for merge
270 270
271 271 $ hg debugindex -m
272 272 rev offset length delta linkrev nodeid p1 p2
273 273 0 0 80 -1 0 40536115ed9e 000000000000 000000000000
274 274 1 80 83 0 1 f3376063c255 40536115ed9e 000000000000
275 275 2 163 89 0 2 5d9b9da231a2 40536115ed9e 000000000000
276 276 3 252 83 2 3 d17d663cbd8a 5d9b9da231a2 f3376063c255
277 277 4 335 124 1 4 51e32a8c60ee f3376063c255 000000000000
278 278 5 459 126 2 5 cc5baa78b230 5d9b9da231a2 f3376063c255
279 279
280 280
281 281 Status across flat/tree boundary should work
282 282
283 283 $ hg status --rev '.^' --rev .
284 284 M a
285 285 M dir1/a
286 286 M dir1/dir1/a
287 287
288 288
289 289 Turning off treemanifest config has no effect
290 290
291 291 $ hg debugindex --dir dir1
292 292 rev offset length delta linkrev nodeid p1 p2
293 293 0 0 127 -1 4 064927a0648a 000000000000 000000000000
294 294 1 127 111 0 5 25ecb8cb8618 000000000000 000000000000
295 295 $ echo 2 > dir1/a
296 296 $ hg --config experimental.treemanifest=False ci -qm 'modify dir1/a'
297 297 $ hg debugindex --dir dir1
298 298 rev offset length delta linkrev nodeid p1 p2
299 299 0 0 127 -1 4 064927a0648a 000000000000 000000000000
300 300 1 127 111 0 5 25ecb8cb8618 000000000000 000000000000
301 301 2 238 55 1 6 5b16163a30c6 25ecb8cb8618 000000000000
302 302
303 303 Stripping and recovering changes should work
304 304
305 305 $ hg st --change tip
306 306 M dir1/a
307 307 $ hg --config extensions.strip= strip tip
308 308 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
309 309 saved backup bundle to $TESTTMP/repo-mixed/.hg/strip-backup/51cfd7b1e13b-78a2f3ed-backup.hg (glob)
310 310 $ hg unbundle -q .hg/strip-backup/*
311 311 $ hg st --change tip
312 312 M dir1/a
313 313
314 314 Shelving and unshelving should work
315 315
316 316 $ echo foo >> dir1/a
317 317 $ hg --config extensions.shelve= shelve
318 318 shelved as default
319 319 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
320 320 $ hg --config extensions.shelve= unshelve
321 321 unshelving change 'default'
322 322 $ hg diff --nodates
323 323 diff -r 708a273da119 dir1/a
324 324 --- a/dir1/a
325 325 +++ b/dir1/a
326 326 @@ -1,1 +1,2 @@
327 327 1
328 328 +foo
329 329
330 330 Pushing from treemanifest repo to an empty repo makes that a treemanifest repo
331 331
332 332 $ cd ..
333 333 $ hg init empty-repo
334 334 $ cat << EOF >> empty-repo/.hg/hgrc
335 335 > [experimental]
336 336 > changegroup3=yes
337 337 > EOF
338 338 $ grep treemanifest empty-repo/.hg/requires
339 339 [1]
340 340 $ hg push -R repo -r 0 empty-repo
341 341 pushing to empty-repo
342 342 searching for changes
343 343 adding changesets
344 344 adding manifests
345 345 adding file changes
346 346 added 1 changesets with 2 changes to 2 files
347 347 $ grep treemanifest empty-repo/.hg/requires
348 348 treemanifest
349 349
350 350 Pushing to an empty repo works
351 351
352 352 $ hg --config experimental.treemanifest=1 init clone
353 353 $ grep treemanifest clone/.hg/requires
354 354 treemanifest
355 355 $ hg push -R repo clone
356 356 pushing to clone
357 357 searching for changes
358 358 adding changesets
359 359 adding manifests
360 360 adding file changes
361 361 added 11 changesets with 15 changes to 10 files (+3 heads)
362 362 $ grep treemanifest clone/.hg/requires
363 363 treemanifest
364 364
365 365 Create deeper repo with tree manifests.
366 366
367 367 $ hg --config experimental.treemanifest=True init deeprepo
368 368 $ cd deeprepo
369 369
370 370 $ mkdir a
371 371 $ mkdir b
372 372 $ mkdir b/bar
373 373 $ mkdir b/bar/orange
374 374 $ mkdir b/bar/orange/fly
375 375 $ mkdir b/foo
376 376 $ mkdir b/foo/apple
377 377 $ mkdir b/foo/apple/bees
378 378
379 379 $ touch a/one.txt
380 380 $ touch a/two.txt
381 381 $ touch b/bar/fruits.txt
382 382 $ touch b/bar/orange/fly/gnat.py
383 383 $ touch b/bar/orange/fly/housefly.txt
384 384 $ touch b/foo/apple/bees/flower.py
385 385 $ touch c.txt
386 386 $ touch d.py
387 387
388 388 $ hg ci -Aqm 'initial'
389 389
390 390 We'll see that visitdir works by removing some treemanifest revlogs and running
391 391 the files command with various parameters.
392 392
393 393 Test files from the root.
394 394
395 395 $ hg files -r .
396 396 a/one.txt (glob)
397 397 a/two.txt (glob)
398 398 b/bar/fruits.txt (glob)
399 399 b/bar/orange/fly/gnat.py (glob)
400 400 b/bar/orange/fly/housefly.txt (glob)
401 401 b/foo/apple/bees/flower.py (glob)
402 402 c.txt
403 403 d.py
404 404
405 405 Excludes with a glob should not exclude everything from the glob's root
406 406
407 407 $ hg files -r . -X 'b/fo?' b
408 408 b/bar/fruits.txt (glob)
409 409 b/bar/orange/fly/gnat.py (glob)
410 410 b/bar/orange/fly/housefly.txt (glob)
411 $ cp -r .hg/store .hg/store-copy
411 412
412 413 Test files for a subdirectory.
413 414
414 $ mv .hg/store/meta/a oldmf
415 $ rm -r .hg/store/meta/a
415 416 $ hg files -r . b
416 417 b/bar/fruits.txt (glob)
417 418 b/bar/orange/fly/gnat.py (glob)
418 419 b/bar/orange/fly/housefly.txt (glob)
419 420 b/foo/apple/bees/flower.py (glob)
420 $ mv oldmf .hg/store/meta/a
421 $ cp -rT .hg/store-copy .hg/store
421 422
422 423 Test files with just includes and excludes.
423 424
424 $ mv .hg/store/meta/a oldmf
425 $ mv .hg/store/meta/b/bar/orange/fly oldmf2
426 $ mv .hg/store/meta/b/foo/apple/bees oldmf3
425 $ rm -r .hg/store/meta/a
426 $ rm -r .hg/store/meta/b/bar/orange/fly
427 $ rm -r .hg/store/meta/b/foo/apple/bees
427 428 $ hg files -r . -I path:b/bar -X path:b/bar/orange/fly -I path:b/foo -X path:b/foo/apple/bees
428 429 b/bar/fruits.txt (glob)
429 $ mv oldmf .hg/store/meta/a
430 $ mv oldmf2 .hg/store/meta/b/bar/orange/fly
431 $ mv oldmf3 .hg/store/meta/b/foo/apple/bees
430 $ cp -rT .hg/store-copy .hg/store
432 431
433 432 Test files for a subdirectory, excluding a directory within it.
434 433
435 $ mv .hg/store/meta/a oldmf
436 $ mv .hg/store/meta/b/foo oldmf2
434 $ rm -r .hg/store/meta/a
435 $ rm -r .hg/store/meta/b/foo
437 436 $ hg files -r . -X path:b/foo b
438 437 b/bar/fruits.txt (glob)
439 438 b/bar/orange/fly/gnat.py (glob)
440 439 b/bar/orange/fly/housefly.txt (glob)
441 $ mv oldmf .hg/store/meta/a
442 $ mv oldmf2 .hg/store/meta/b/foo
440 $ cp -rT .hg/store-copy .hg/store
443 441
444 442 Test files for a sub directory, including only a directory within it, and
445 443 including an unrelated directory.
446 444
447 $ mv .hg/store/meta/a oldmf
448 $ mv .hg/store/meta/b/foo oldmf2
445 $ rm -r .hg/store/meta/a
446 $ rm -r .hg/store/meta/b/foo
449 447 $ hg files -r . -I path:b/bar/orange -I path:a b
450 448 b/bar/orange/fly/gnat.py (glob)
451 449 b/bar/orange/fly/housefly.txt (glob)
452 $ mv oldmf .hg/store/meta/a
453 $ mv oldmf2 .hg/store/meta/b/foo
450 $ cp -rT .hg/store-copy .hg/store
454 451
455 452 Test files for a pattern, including a directory, and excluding a directory
456 453 within that.
457 454
458 $ mv .hg/store/meta/a oldmf
459 $ mv .hg/store/meta/b/foo oldmf2
460 $ mv .hg/store/meta/b/bar/orange oldmf3
455 $ rm -r .hg/store/meta/a
456 $ rm -r .hg/store/meta/b/foo
457 $ rm -r .hg/store/meta/b/bar/orange
461 458 $ hg files -r . glob:**.txt -I path:b/bar -X path:b/bar/orange
462 459 b/bar/fruits.txt (glob)
463 $ mv oldmf .hg/store/meta/a
464 $ mv oldmf2 .hg/store/meta/b/foo
465 $ mv oldmf3 .hg/store/meta/b/bar/orange
460 $ cp -rT .hg/store-copy .hg/store
466 461
467 462 Add some more changes to the deep repo
468 463 $ echo narf >> b/bar/fruits.txt
469 464 $ hg ci -m narf
470 465 $ echo troz >> b/bar/orange/fly/gnat.py
471 466 $ hg ci -m troz
472 467
473 468 Test cloning a treemanifest repo over http.
474 469 $ hg serve -p $HGPORT2 -d --pid-file=hg.pid --errorlog=errors.log
475 470 $ cat hg.pid >> $DAEMON_PIDS
476 471 $ cd ..
477 472 We can clone even with the knob turned off and we'll get a treemanifest repo.
478 473 $ hg clone --config experimental.treemanifest=False \
479 474 > --config experimental.changegroup3=True \
480 475 > http://localhost:$HGPORT2 deepclone
481 476 requesting all changes
482 477 adding changesets
483 478 adding manifests
484 479 adding file changes
485 480 added 3 changesets with 10 changes to 8 files
486 481 updating to branch default
487 482 8 files updated, 0 files merged, 0 files removed, 0 files unresolved
488 483 No server errors.
489 484 $ cat deeprepo/errors.log
490 485 requires got updated to include treemanifest
491 486 $ cat deepclone/.hg/requires | grep treemanifest
492 487 treemanifest
493 488 Tree manifest revlogs exist.
494 489 $ find deepclone/.hg/store/meta | sort
495 490 deepclone/.hg/store/meta
496 491 deepclone/.hg/store/meta/a
497 492 deepclone/.hg/store/meta/a/00manifest.i
498 493 deepclone/.hg/store/meta/b
499 494 deepclone/.hg/store/meta/b/00manifest.i
500 495 deepclone/.hg/store/meta/b/bar
501 496 deepclone/.hg/store/meta/b/bar/00manifest.i
502 497 deepclone/.hg/store/meta/b/bar/orange
503 498 deepclone/.hg/store/meta/b/bar/orange/00manifest.i
504 499 deepclone/.hg/store/meta/b/bar/orange/fly
505 500 deepclone/.hg/store/meta/b/bar/orange/fly/00manifest.i
506 501 deepclone/.hg/store/meta/b/foo
507 502 deepclone/.hg/store/meta/b/foo/00manifest.i
508 503 deepclone/.hg/store/meta/b/foo/apple
509 504 deepclone/.hg/store/meta/b/foo/apple/00manifest.i
510 505 deepclone/.hg/store/meta/b/foo/apple/bees
511 506 deepclone/.hg/store/meta/b/foo/apple/bees/00manifest.i
512 507 Verify passes.
513 508 $ cd deepclone
514 509 $ hg verify
515 510 checking changesets
516 511 checking manifests
517 512 crosschecking files in changesets and manifests
518 513 checking files
519 514 8 files, 3 changesets, 10 total revisions
520 515 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now