##// END OF EJS Templates
copies: explain the "arbitrary" copy source pick in case of conflict...
marmoute -
r46775:1d6aac94 default
parent child Browse files
Show More
@@ -1,1685 +1,1707 b''
1 1 #testcases filelog compatibility changeset sidedata upgraded
2 2
3 3 =====================================================
4 4 Test Copy tracing for chain of copies involving merge
5 5 =====================================================
6 6
7 7 This test files covers copies/rename case for a chains of commit where merges
8 8 are involved. It cheks we do not have unwanted update of behavior and that the
9 9 different options to retrieve copies behave correctly.
10 10
11 11
12 12 Setup
13 13 =====
14 14
15 15 use git diff to see rename
16 16
17 17 $ cat << EOF >> $HGRCPATH
18 18 > [diff]
19 19 > git=yes
20 20 > [command-templates]
21 21 > log={rev} {desc}\n
22 22 > EOF
23 23
24 24 #if compatibility
25 25 $ cat >> $HGRCPATH << EOF
26 26 > [experimental]
27 27 > copies.read-from = compatibility
28 28 > EOF
29 29 #endif
30 30
31 31 #if changeset
32 32 $ cat >> $HGRCPATH << EOF
33 33 > [experimental]
34 34 > copies.read-from = changeset-only
35 35 > copies.write-to = changeset-only
36 36 > EOF
37 37 #endif
38 38
39 39 #if sidedata
40 40 $ cat >> $HGRCPATH << EOF
41 41 > [format]
42 42 > exp-use-side-data = yes
43 43 > exp-use-copies-side-data-changeset = yes
44 44 > EOF
45 45 #endif
46 46
47 47
48 48 $ hg init repo-chain
49 49 $ cd repo-chain
50 50
51 51 Add some linear rename initialy
52 52
53 53 $ echo a > a
54 54 $ echo b > b
55 55 $ echo h > h
56 56 $ hg ci -Am 'i-0 initial commit: a b h'
57 57 adding a
58 58 adding b
59 59 adding h
60 60 $ hg mv a c
61 61 $ hg ci -Am 'i-1: a -move-> c'
62 62 $ hg mv c d
63 63 $ hg ci -Am 'i-2: c -move-> d'
64 64 $ hg log -G
65 65 @ 2 i-2: c -move-> d
66 66 |
67 67 o 1 i-1: a -move-> c
68 68 |
69 69 o 0 i-0 initial commit: a b h
70 70
71 71
72 72 And having another branch with renames on the other side
73 73
74 74 $ hg mv d e
75 75 $ hg ci -Am 'a-1: d -move-> e'
76 76 $ hg mv e f
77 77 $ hg ci -Am 'a-2: e -move-> f'
78 78 $ hg log -G --rev '::.'
79 79 @ 4 a-2: e -move-> f
80 80 |
81 81 o 3 a-1: d -move-> e
82 82 |
83 83 o 2 i-2: c -move-> d
84 84 |
85 85 o 1 i-1: a -move-> c
86 86 |
87 87 o 0 i-0 initial commit: a b h
88 88
89 89
90 90 Have a branching with nothing on one side
91 91
92 92 $ hg up 'desc("i-2")'
93 93 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
94 94 $ echo foo > b
95 95 $ hg ci -m 'b-1: b update'
96 96 created new head
97 97 $ hg log -G --rev '::.'
98 98 @ 5 b-1: b update
99 99 |
100 100 o 2 i-2: c -move-> d
101 101 |
102 102 o 1 i-1: a -move-> c
103 103 |
104 104 o 0 i-0 initial commit: a b h
105 105
106 106
107 107 Create a branch that delete a file previous renamed
108 108
109 109 $ hg up 'desc("i-2")'
110 110 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
111 111 $ hg rm d
112 112 $ hg ci -m 'c-1 delete d'
113 113 created new head
114 114 $ hg log -G --rev '::.'
115 115 @ 6 c-1 delete d
116 116 |
117 117 o 2 i-2: c -move-> d
118 118 |
119 119 o 1 i-1: a -move-> c
120 120 |
121 121 o 0 i-0 initial commit: a b h
122 122
123 123
124 124 Create a branch that delete a file previous renamed and recreate it
125 125
126 126 $ hg up 'desc("i-2")'
127 127 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
128 128 $ hg rm d
129 129 $ hg ci -m 'd-1 delete d'
130 130 created new head
131 131 $ echo bar > d
132 132 $ hg add d
133 133 $ hg ci -m 'd-2 re-add d'
134 134 $ hg log -G --rev '::.'
135 135 @ 8 d-2 re-add d
136 136 |
137 137 o 7 d-1 delete d
138 138 |
139 139 o 2 i-2: c -move-> d
140 140 |
141 141 o 1 i-1: a -move-> c
142 142 |
143 143 o 0 i-0 initial commit: a b h
144 144
145 145
146 146 Having another branch renaming a different file to the same filename as another
147 147
148 148 $ hg up 'desc("i-2")'
149 149 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
150 150 $ hg mv b g
151 151 $ hg ci -m 'e-1 b -move-> g'
152 152 created new head
153 153 $ hg mv g f
154 154 $ hg ci -m 'e-2 g -move-> f'
155 155 $ hg log -G --rev '::.'
156 156 @ 10 e-2 g -move-> f
157 157 |
158 158 o 9 e-1 b -move-> g
159 159 |
160 160 o 2 i-2: c -move-> d
161 161 |
162 162 o 1 i-1: a -move-> c
163 163 |
164 164 o 0 i-0 initial commit: a b h
165 165
166 166
167 167 Setup all merge
168 168 ===============
169 169
170 170 This is done beforehand to validate that the upgrade process creates valid copy
171 171 information.
172 172
173 173 merging with unrelated change does not interfere with the renames
174 174 ---------------------------------------------------------------
175 175
176 176 - rename on one side
177 177 - unrelated change on the other side
178 178
179 179 $ hg up 'desc("b-1")'
180 180 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
181 181 $ hg merge 'desc("a-2")'
182 182 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
183 183 (branch merge, don't forget to commit)
184 184 $ hg ci -m 'mBAm-0 simple merge - one way'
185 185 $ hg up 'desc("a-2")'
186 186 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
187 187 $ hg merge 'desc("b-1")'
188 188 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
189 189 (branch merge, don't forget to commit)
190 190 $ hg ci -m 'mABm-0 simple merge - the other way'
191 191 created new head
192 192 $ hg log -G --rev '::(desc("mABm")+desc("mBAm"))'
193 193 @ 12 mABm-0 simple merge - the other way
194 194 |\
195 195 +---o 11 mBAm-0 simple merge - one way
196 196 | |/
197 197 | o 5 b-1: b update
198 198 | |
199 199 o | 4 a-2: e -move-> f
200 200 | |
201 201 o | 3 a-1: d -move-> e
202 202 |/
203 203 o 2 i-2: c -move-> d
204 204 |
205 205 o 1 i-1: a -move-> c
206 206 |
207 207 o 0 i-0 initial commit: a b h
208 208
209 209
210 210
211 211 merging with the side having a delete
212 212 -------------------------------------
213 213
214 214 case summary:
215 215 - one with change to an unrelated file
216 216 - one deleting the change
217 217 and recreate an unrelated file after the merge
218 218
219 219 $ hg up 'desc("b-1")'
220 220 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
221 221 $ hg merge 'desc("c-1")'
222 222 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
223 223 (branch merge, don't forget to commit)
224 224 $ hg ci -m 'mBCm-0 simple merge - one way'
225 225 $ echo bar > d
226 226 $ hg add d
227 227 $ hg ci -m 'mBCm-1 re-add d'
228 228 $ hg up 'desc("c-1")'
229 229 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
230 230 $ hg merge 'desc("b-1")'
231 231 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
232 232 (branch merge, don't forget to commit)
233 233 $ hg ci -m 'mCBm-0 simple merge - the other way'
234 234 created new head
235 235 $ echo bar > d
236 236 $ hg add d
237 237 $ hg ci -m 'mCBm-1 re-add d'
238 238 $ hg log -G --rev '::(desc("mCBm")+desc("mBCm"))'
239 239 @ 16 mCBm-1 re-add d
240 240 |
241 241 o 15 mCBm-0 simple merge - the other way
242 242 |\
243 243 | | o 14 mBCm-1 re-add d
244 244 | | |
245 245 +---o 13 mBCm-0 simple merge - one way
246 246 | |/
247 247 | o 6 c-1 delete d
248 248 | |
249 249 o | 5 b-1: b update
250 250 |/
251 251 o 2 i-2: c -move-> d
252 252 |
253 253 o 1 i-1: a -move-> c
254 254 |
255 255 o 0 i-0 initial commit: a b h
256 256
257 257
258 258 Comparing with a merge re-adding the file afterward
259 259 ---------------------------------------------------
260 260
261 261 Merge:
262 262 - one with change to an unrelated file
263 263 - one deleting and recreating the change
264 264
265 265 $ hg up 'desc("b-1")'
266 266 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
267 267 $ hg merge 'desc("d-2")'
268 268 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
269 269 (branch merge, don't forget to commit)
270 270 $ hg ci -m 'mBDm-0 simple merge - one way'
271 271 $ hg up 'desc("d-2")'
272 272 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
273 273 $ hg merge 'desc("b-1")'
274 274 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
275 275 (branch merge, don't forget to commit)
276 276 $ hg ci -m 'mDBm-0 simple merge - the other way'
277 277 created new head
278 278 $ hg log -G --rev '::(desc("mDBm")+desc("mBDm"))'
279 279 @ 18 mDBm-0 simple merge - the other way
280 280 |\
281 281 +---o 17 mBDm-0 simple merge - one way
282 282 | |/
283 283 | o 8 d-2 re-add d
284 284 | |
285 285 | o 7 d-1 delete d
286 286 | |
287 287 o | 5 b-1: b update
288 288 |/
289 289 o 2 i-2: c -move-> d
290 290 |
291 291 o 1 i-1: a -move-> c
292 292 |
293 293 o 0 i-0 initial commit: a b h
294 294
295 295
296 296
297 297 Comparing with a merge with colliding rename
298 298 --------------------------------------------
299 299
300 300 - the "e-" branch renaming b to f (through 'g')
301 301 - the "a-" branch renaming d to f (through e)
302 302
303 303 $ hg up 'desc("a-2")'
304 304 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
305 305 $ hg merge 'desc("e-2")' --tool :union
306 306 merging f
307 307 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
308 308 (branch merge, don't forget to commit)
309 309 $ hg ci -m 'mAEm-0 simple merge - one way'
310 310 $ hg up 'desc("e-2")'
311 311 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
312 312 $ hg merge 'desc("a-2")' --tool :union
313 313 merging f
314 314 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
315 315 (branch merge, don't forget to commit)
316 316 $ hg ci -m 'mEAm-0 simple merge - the other way'
317 317 created new head
318 318 $ hg log -G --rev '::(desc("mAEm")+desc("mEAm"))'
319 319 @ 20 mEAm-0 simple merge - the other way
320 320 |\
321 321 +---o 19 mAEm-0 simple merge - one way
322 322 | |/
323 323 | o 10 e-2 g -move-> f
324 324 | |
325 325 | o 9 e-1 b -move-> g
326 326 | |
327 327 o | 4 a-2: e -move-> f
328 328 | |
329 329 o | 3 a-1: d -move-> e
330 330 |/
331 331 o 2 i-2: c -move-> d
332 332 |
333 333 o 1 i-1: a -move-> c
334 334 |
335 335 o 0 i-0 initial commit: a b h
336 336
337 337
338 338
339 339 Merge:
340 340 - one with change to an unrelated file (b)
341 341 - one overwriting a file (d) with a rename (from h to i to d)
342 342
343 343 $ hg up 'desc("i-2")'
344 344 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
345 345 $ hg mv h i
346 346 $ hg commit -m "f-1: rename h -> i"
347 347 created new head
348 348 $ hg mv --force i d
349 349 $ hg commit -m "f-2: rename i -> d"
350 350 $ hg debugindex d
351 351 rev linkrev nodeid p1 p2
352 352 0 2 169be882533b 000000000000 000000000000 (no-changeset !)
353 353 0 2 b789fdd96dc2 000000000000 000000000000 (changeset !)
354 354 1 8 b004912a8510 000000000000 000000000000
355 355 2 22 4a067cf8965d 000000000000 000000000000 (no-changeset !)
356 356 2 22 fe6f8b4f507f 000000000000 000000000000 (changeset !)
357 357 $ hg up 'desc("b-1")'
358 358 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
359 359 $ hg merge 'desc("f-2")'
360 360 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
361 361 (branch merge, don't forget to commit)
362 362 $ hg ci -m 'mBFm-0 simple merge - one way'
363 363 $ hg up 'desc("f-2")'
364 364 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
365 365 $ hg merge 'desc("b-1")'
366 366 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
367 367 (branch merge, don't forget to commit)
368 368 $ hg ci -m 'mFBm-0 simple merge - the other way'
369 369 created new head
370 370 $ hg log -G --rev '::(desc("mBFm")+desc("mFBm"))'
371 371 @ 24 mFBm-0 simple merge - the other way
372 372 |\
373 373 +---o 23 mBFm-0 simple merge - one way
374 374 | |/
375 375 | o 22 f-2: rename i -> d
376 376 | |
377 377 | o 21 f-1: rename h -> i
378 378 | |
379 379 o | 5 b-1: b update
380 380 |/
381 381 o 2 i-2: c -move-> d
382 382 |
383 383 o 1 i-1: a -move-> c
384 384 |
385 385 o 0 i-0 initial commit: a b h
386 386
387 387
388 388
389 389 Merge:
390 390 - one with change to a file
391 391 - one deleting and recreating the file
392 392
393 393 Unlike in the 'BD/DB' cases, an actual merge happened here. So we should
394 394 consider history and rename on both branch of the merge.
395 395
396 396 $ hg up 'desc("i-2")'
397 397 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
398 398 $ echo "some update" >> d
399 399 $ hg commit -m "g-1: update d"
400 400 created new head
401 401 $ hg up 'desc("d-2")'
402 402 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
403 403 $ hg merge 'desc("g-1")' --tool :union
404 404 merging d
405 405 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
406 406 (branch merge, don't forget to commit)
407 407 $ hg ci -m 'mDGm-0 simple merge - one way'
408 408 $ hg up 'desc("g-1")'
409 409 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
410 410 $ hg merge 'desc("d-2")' --tool :union
411 411 merging d
412 412 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
413 413 (branch merge, don't forget to commit)
414 414 $ hg ci -m 'mGDm-0 simple merge - the other way'
415 415 created new head
416 416 $ hg log -G --rev '::(desc("mDGm")+desc("mGDm"))'
417 417 @ 27 mGDm-0 simple merge - the other way
418 418 |\
419 419 +---o 26 mDGm-0 simple merge - one way
420 420 | |/
421 421 | o 25 g-1: update d
422 422 | |
423 423 o | 8 d-2 re-add d
424 424 | |
425 425 o | 7 d-1 delete d
426 426 |/
427 427 o 2 i-2: c -move-> d
428 428 |
429 429 o 1 i-1: a -move-> c
430 430 |
431 431 o 0 i-0 initial commit: a b h
432 432
433 433
434 434
435 435 Merge:
436 436 - one with change to a file (d)
437 437 - one overwriting that file with a rename (from h to i, to d)
438 438
439 439 This case is similar to BF/FB, but an actual merge happens, so both side of the
440 440 history are relevant.
441 441
442 442 Note:
443 443 | In this case, the merge get conflicting information since on one side we have
444 444 | "a -> c -> d". and one the other one we have "h -> i -> d".
445 445 |
446 446 | The current code arbitrarily pick one side
447 447
448 448 $ hg up 'desc("f-2")'
449 449 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
450 450 $ hg merge 'desc("g-1")' --tool :union
451 451 merging d
452 452 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
453 453 (branch merge, don't forget to commit)
454 454 $ hg ci -m 'mFGm-0 simple merge - one way'
455 455 created new head
456 456 $ hg up 'desc("g-1")'
457 457 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
458 458 $ hg merge 'desc("f-2")' --tool :union
459 459 merging d
460 460 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
461 461 (branch merge, don't forget to commit)
462 462 $ hg ci -m 'mGFm-0 simple merge - the other way'
463 463 created new head
464 464 $ hg log -G --rev '::(desc("mGFm")+desc("mFGm"))'
465 465 @ 29 mGFm-0 simple merge - the other way
466 466 |\
467 467 +---o 28 mFGm-0 simple merge - one way
468 468 | |/
469 469 | o 25 g-1: update d
470 470 | |
471 471 o | 22 f-2: rename i -> d
472 472 | |
473 473 o | 21 f-1: rename h -> i
474 474 |/
475 475 o 2 i-2: c -move-> d
476 476 |
477 477 o 1 i-1: a -move-> c
478 478 |
479 479 o 0 i-0 initial commit: a b h
480 480
481 481
482 482
483 483 Comparing with merging with a deletion (and keeping the file)
484 484 -------------------------------------------------------------
485 485
486 486 Merge:
487 487 - one removing a file (d)
488 488 - one updating that file
489 489 - the merge keep the modified version of the file (canceling the delete)
490 490
491 491 In this case, the file keep on living after the merge. So we should not drop its
492 492 copy tracing chain.
493 493
494 494 $ hg up 'desc("c-1")'
495 495 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
496 496 $ hg merge 'desc("g-1")'
497 497 file 'd' was deleted in local [working copy] but was modified in other [merge rev].
498 498 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
499 499 What do you want to do? u
500 500 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
501 501 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
502 502 [1]
503 503 $ hg resolve -t :other d
504 504 (no more unresolved files)
505 505 $ hg ci -m "mCGm-0"
506 506 created new head
507 507
508 508 $ hg up 'desc("g-1")'
509 509 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
510 510 $ hg merge 'desc("c-1")'
511 511 file 'd' was deleted in other [merge rev] but was modified in local [working copy].
512 512 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
513 513 What do you want to do? u
514 514 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
515 515 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
516 516 [1]
517 517 $ hg resolve -t :local d
518 518 (no more unresolved files)
519 519 $ hg ci -m "mGCm-0"
520 520 created new head
521 521
522 522 $ hg log -G --rev '::(desc("mCGm")+desc("mGCm"))'
523 523 @ 31 mGCm-0
524 524 |\
525 525 +---o 30 mCGm-0
526 526 | |/
527 527 | o 25 g-1: update d
528 528 | |
529 529 o | 6 c-1 delete d
530 530 |/
531 531 o 2 i-2: c -move-> d
532 532 |
533 533 o 1 i-1: a -move-> c
534 534 |
535 535 o 0 i-0 initial commit: a b h
536 536
537 537
538 538
539 539
540 540 Comparing with merge restoring an untouched deleted file
541 541 --------------------------------------------------------
542 542
543 543 Merge:
544 544 - one removing a file (d)
545 545 - one leaving the file untouched
546 546 - the merge actively restore the file to the same content.
547 547
548 548 In this case, the file keep on living after the merge. So we should not drop its
549 549 copy tracing chain.
550 550
551 551 $ hg up 'desc("c-1")'
552 552 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
553 553 $ hg merge 'desc("b-1")'
554 554 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
555 555 (branch merge, don't forget to commit)
556 556 $ hg revert --rev 'desc("b-1")' d
557 557 $ hg ci -m "mCB-revert-m-0"
558 558 created new head
559 559
560 560 $ hg up 'desc("b-1")'
561 561 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
562 562 $ hg merge 'desc("c-1")'
563 563 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
564 564 (branch merge, don't forget to commit)
565 565 $ hg revert --rev 'desc("b-1")' d
566 566 $ hg ci -m "mBC-revert-m-0"
567 567 created new head
568 568
569 569 $ hg log -G --rev '::(desc("mCB-revert-m")+desc("mBC-revert-m"))'
570 570 @ 33 mBC-revert-m-0
571 571 |\
572 572 +---o 32 mCB-revert-m-0
573 573 | |/
574 574 | o 6 c-1 delete d
575 575 | |
576 576 o | 5 b-1: b update
577 577 |/
578 578 o 2 i-2: c -move-> d
579 579 |
580 580 o 1 i-1: a -move-> c
581 581 |
582 582 o 0 i-0 initial commit: a b h
583 583
584 584
585 585
586 586 $ hg up null --quiet
587 587
588 588 Merging a branch where a rename was deleted with a branch where the same file was renamed
589 589 ------------------------------------------------------------------------------------------
590 590
591 591 Create a "conflicting" merge where `d` get removed on one branch before its
592 592 rename information actually conflict with the other branch.
593 593
594 594 (the copy information from the branch that was not deleted should win).
595 595
596 596 $ hg up 'desc("i-0")'
597 597 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
598 598 $ hg mv b d
599 599 $ hg ci -m "h-1: b -(move)-> d"
600 600 created new head
601 601
602 602 $ hg up 'desc("c-1")'
603 603 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
604 604 $ hg merge 'desc("h-1")'
605 605 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
606 606 (branch merge, don't forget to commit)
607 607 $ hg ci -m "mCH-delete-before-conflict-m-0"
608 608
609 609 $ hg up 'desc("h-1")'
610 610 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
611 611 $ hg merge 'desc("c-1")'
612 612 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
613 613 (branch merge, don't forget to commit)
614 614 $ hg ci -m "mHC-delete-before-conflict-m-0"
615 615 created new head
616 616 $ hg log -G --rev '::(desc("mCH-delete-before-conflict-m")+desc("mHC-delete-before-conflict-m"))'
617 617 @ 36 mHC-delete-before-conflict-m-0
618 618 |\
619 619 +---o 35 mCH-delete-before-conflict-m-0
620 620 | |/
621 621 | o 34 h-1: b -(move)-> d
622 622 | |
623 623 o | 6 c-1 delete d
624 624 | |
625 625 o | 2 i-2: c -move-> d
626 626 | |
627 627 o | 1 i-1: a -move-> c
628 628 |/
629 629 o 0 i-0 initial commit: a b h
630 630
631 631
632 632
633 633 Test that sidedata computations during upgrades are correct
634 634 ===========================================================
635 635
636 636 We upgrade a repository that is not using sidedata (the filelog case) and
637 637 check that the same side data have been generated as if they were computed at
638 638 commit time.
639 639
640 640
641 641 #if upgraded
642 642 $ cat >> $HGRCPATH << EOF
643 643 > [format]
644 644 > exp-use-side-data = yes
645 645 > exp-use-copies-side-data-changeset = yes
646 646 > EOF
647 647 $ hg debugformat -v
648 648 format-variant repo config default
649 649 fncache: yes yes yes
650 650 dotencode: yes yes yes
651 651 generaldelta: yes yes yes
652 652 exp-sharesafe: no no no
653 653 sparserevlog: yes yes yes
654 654 sidedata: no yes no
655 655 persistent-nodemap: no no no
656 656 copies-sdc: no yes no
657 657 plain-cl-delta: yes yes yes
658 658 compression: * (glob)
659 659 compression-level: default default default
660 660 $ hg debugupgraderepo --run --quiet
661 661 upgrade will perform the following actions:
662 662
663 663 requirements
664 664 preserved: * (glob)
665 665 added: exp-copies-sidedata-changeset, exp-sidedata-flag
666 666
667 667 processed revlogs:
668 668 - all-filelogs
669 669 - changelog
670 670 - manifest
671 671
672 672 #endif
673 673
674 674
675 675 #if no-compatibility no-filelog no-changeset
676 676
677 677 $ for rev in `hg log --rev 'all()' -T '{rev}\n'`; do
678 678 > echo "##### revision $rev #####"
679 679 > hg debugsidedata -c -v -- $rev
680 680 > hg debugchangedfiles $rev
681 681 > done
682 682 ##### revision 0 #####
683 683 1 sidedata entries
684 684 entry-0014 size 34
685 685 '\x00\x00\x00\x03\x04\x00\x00\x00\x01\x00\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00\x00\x04\x00\x00\x00\x03\x00\x00\x00\x00abh'
686 686 added : a, ;
687 687 added : b, ;
688 688 added : h, ;
689 689 ##### revision 1 #####
690 690 1 sidedata entries
691 691 entry-0014 size 24
692 692 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00ac'
693 693 removed : a, ;
694 694 added p1: c, a;
695 695 ##### revision 2 #####
696 696 1 sidedata entries
697 697 entry-0014 size 24
698 698 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00cd'
699 699 removed : c, ;
700 700 added p1: d, c;
701 701 ##### revision 3 #####
702 702 1 sidedata entries
703 703 entry-0014 size 24
704 704 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00de'
705 705 removed : d, ;
706 706 added p1: e, d;
707 707 ##### revision 4 #####
708 708 1 sidedata entries
709 709 entry-0014 size 24
710 710 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00ef'
711 711 removed : e, ;
712 712 added p1: f, e;
713 713 ##### revision 5 #####
714 714 1 sidedata entries
715 715 entry-0014 size 14
716 716 '\x00\x00\x00\x01\x14\x00\x00\x00\x01\x00\x00\x00\x00b'
717 717 touched : b, ;
718 718 ##### revision 6 #####
719 719 1 sidedata entries
720 720 entry-0014 size 14
721 721 '\x00\x00\x00\x01\x0c\x00\x00\x00\x01\x00\x00\x00\x00d'
722 722 removed : d, ;
723 723 ##### revision 7 #####
724 724 1 sidedata entries
725 725 entry-0014 size 14
726 726 '\x00\x00\x00\x01\x0c\x00\x00\x00\x01\x00\x00\x00\x00d'
727 727 removed : d, ;
728 728 ##### revision 8 #####
729 729 1 sidedata entries
730 730 entry-0014 size 14
731 731 '\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x00\x00\x00d'
732 732 added : d, ;
733 733 ##### revision 9 #####
734 734 1 sidedata entries
735 735 entry-0014 size 24
736 736 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00bg'
737 737 removed : b, ;
738 738 added p1: g, b;
739 739 ##### revision 10 #####
740 740 1 sidedata entries
741 741 entry-0014 size 24
742 742 '\x00\x00\x00\x02\x06\x00\x00\x00\x01\x00\x00\x00\x01\x0c\x00\x00\x00\x02\x00\x00\x00\x00fg'
743 743 added p1: f, g;
744 744 removed : g, ;
745 745 ##### revision 11 #####
746 746 1 sidedata entries
747 747 entry-0014 size 4
748 748 '\x00\x00\x00\x00'
749 749 ##### revision 12 #####
750 750 1 sidedata entries
751 751 entry-0014 size 4
752 752 '\x00\x00\x00\x00'
753 753 ##### revision 13 #####
754 754 1 sidedata entries
755 755 entry-0014 size 4
756 756 '\x00\x00\x00\x00'
757 757 ##### revision 14 #####
758 758 1 sidedata entries
759 759 entry-0014 size 14
760 760 '\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x00\x00\x00d'
761 761 added : d, ;
762 762 ##### revision 15 #####
763 763 1 sidedata entries
764 764 entry-0014 size 4
765 765 '\x00\x00\x00\x00'
766 766 ##### revision 16 #####
767 767 1 sidedata entries
768 768 entry-0014 size 14
769 769 '\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x00\x00\x00d'
770 770 added : d, ;
771 771 ##### revision 17 #####
772 772 1 sidedata entries
773 773 entry-0014 size 4
774 774 '\x00\x00\x00\x00'
775 775 ##### revision 18 #####
776 776 1 sidedata entries
777 777 entry-0014 size 4
778 778 '\x00\x00\x00\x00'
779 779 ##### revision 19 #####
780 780 1 sidedata entries
781 781 entry-0014 size 14
782 782 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00f'
783 783 merged : f, ;
784 784 ##### revision 20 #####
785 785 1 sidedata entries
786 786 entry-0014 size 14
787 787 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00f'
788 788 merged : f, ;
789 789 ##### revision 21 #####
790 790 1 sidedata entries
791 791 entry-0014 size 24
792 792 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00hi'
793 793 removed : h, ;
794 794 added p1: i, h;
795 795 ##### revision 22 #####
796 796 1 sidedata entries
797 797 entry-0014 size 24
798 798 '\x00\x00\x00\x02\x16\x00\x00\x00\x01\x00\x00\x00\x01\x0c\x00\x00\x00\x02\x00\x00\x00\x00di'
799 799 touched p1: d, i;
800 800 removed : i, ;
801 801 ##### revision 23 #####
802 802 1 sidedata entries
803 803 entry-0014 size 4
804 804 '\x00\x00\x00\x00'
805 805 ##### revision 24 #####
806 806 1 sidedata entries
807 807 entry-0014 size 4
808 808 '\x00\x00\x00\x00'
809 809 ##### revision 25 #####
810 810 1 sidedata entries
811 811 entry-0014 size 14
812 812 '\x00\x00\x00\x01\x14\x00\x00\x00\x01\x00\x00\x00\x00d'
813 813 touched : d, ;
814 814 ##### revision 26 #####
815 815 1 sidedata entries
816 816 entry-0014 size 14
817 817 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d'
818 818 merged : d, ;
819 819 ##### revision 27 #####
820 820 1 sidedata entries
821 821 entry-0014 size 14
822 822 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d'
823 823 merged : d, ;
824 824 ##### revision 28 #####
825 825 1 sidedata entries
826 826 entry-0014 size 14
827 827 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d'
828 828 merged : d, ;
829 829 ##### revision 29 #####
830 830 1 sidedata entries
831 831 entry-0014 size 14
832 832 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d'
833 833 merged : d, ;
834 834 ##### revision 30 #####
835 835 1 sidedata entries
836 836 entry-0014 size 14
837 837 '\x00\x00\x00\x01\x10\x00\x00\x00\x01\x00\x00\x00\x00d'
838 838 salvaged : d, ;
839 839 ##### revision 31 #####
840 840 1 sidedata entries
841 841 entry-0014 size 14
842 842 '\x00\x00\x00\x01\x10\x00\x00\x00\x01\x00\x00\x00\x00d'
843 843 salvaged : d, ;
844 844 ##### revision 32 #####
845 845 1 sidedata entries
846 846 entry-0014 size 14
847 847 '\x00\x00\x00\x01\x10\x00\x00\x00\x01\x00\x00\x00\x00d'
848 848 salvaged : d, ;
849 849 ##### revision 33 #####
850 850 1 sidedata entries
851 851 entry-0014 size 14
852 852 '\x00\x00\x00\x01\x10\x00\x00\x00\x01\x00\x00\x00\x00d'
853 853 salvaged : d, ;
854 854 ##### revision 34 #####
855 855 1 sidedata entries
856 856 entry-0014 size 24
857 857 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00bd'
858 858 removed : b, ;
859 859 added p1: d, b;
860 860 ##### revision 35 #####
861 861 1 sidedata entries
862 862 entry-0014 size 4
863 863 '\x00\x00\x00\x00'
864 864 ##### revision 36 #####
865 865 1 sidedata entries
866 866 entry-0014 size 4
867 867 '\x00\x00\x00\x00'
868 868
869 869 #endif
870 870
871 871
872 872 Test copy information chaining
873 873 ==============================
874 874
875 875 Check that matching only affect the destination and not intermediate path
876 876 -------------------------------------------------------------------------
877 877
878 878 The two status call should give the same value for f
879 879
880 880 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("a-2")'
881 881 A f
882 882 a
883 883 R a
884 884 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("a-2")' f
885 885 A f
886 886 a (no-changeset no-compatibility !)
887 887
888 888 merging with unrelated change does not interfere with the renames
889 889 ---------------------------------------------------------------
890 890
891 891 - rename on one side
892 892 - unrelated change on the other side
893 893
894 894 $ hg log -G --rev '::(desc("mABm")+desc("mBAm"))'
895 895 o 12 mABm-0 simple merge - the other way
896 896 |\
897 897 +---o 11 mBAm-0 simple merge - one way
898 898 | |/
899 899 | o 5 b-1: b update
900 900 | |
901 901 o | 4 a-2: e -move-> f
902 902 | |
903 903 o | 3 a-1: d -move-> e
904 904 |/
905 905 o 2 i-2: c -move-> d
906 906 |
907 907 o 1 i-1: a -move-> c
908 908 |
909 909 o 0 i-0 initial commit: a b h
910 910
911 911
912 912 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mABm")'
913 913 A f
914 914 d
915 915 R d
916 916 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBAm")'
917 917 A f
918 918 d
919 919 R d
920 920 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mABm")'
921 921 M b
922 922 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mBAm")'
923 923 M b
924 924 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mABm")'
925 925 M b
926 926 A f
927 927 d
928 928 R d
929 929 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mBAm")'
930 930 M b
931 931 A f
932 932 d
933 933 R d
934 934 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mABm")'
935 935 M b
936 936 A f
937 937 a
938 938 R a
939 939 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBAm")'
940 940 M b
941 941 A f
942 942 a
943 943 R a
944 944
945 945 merging with the side having a delete
946 946 -------------------------------------
947 947
948 948 case summary:
949 949 - one with change to an unrelated file
950 950 - one deleting the change
951 951 and recreate an unrelated file after the merge
952 952
953 953 $ hg log -G --rev '::(desc("mCBm")+desc("mBCm"))'
954 954 o 16 mCBm-1 re-add d
955 955 |
956 956 o 15 mCBm-0 simple merge - the other way
957 957 |\
958 958 | | o 14 mBCm-1 re-add d
959 959 | | |
960 960 +---o 13 mBCm-0 simple merge - one way
961 961 | |/
962 962 | o 6 c-1 delete d
963 963 | |
964 964 o | 5 b-1: b update
965 965 |/
966 966 o 2 i-2: c -move-> d
967 967 |
968 968 o 1 i-1: a -move-> c
969 969 |
970 970 o 0 i-0 initial commit: a b h
971 971
972 972 - comparing from the merge
973 973
974 974 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBCm-0")'
975 975 R d
976 976 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mCBm-0")'
977 977 R d
978 978 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mBCm-0")'
979 979 M b
980 980 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCBm-0")'
981 981 M b
982 982 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mBCm-0")'
983 983 M b
984 984 R d
985 985 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mCBm-0")'
986 986 M b
987 987 R d
988 988 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBCm-0")'
989 989 M b
990 990 R a
991 991 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCBm-0")'
992 992 M b
993 993 R a
994 994
995 995 - comparing with the merge children re-adding the file
996 996
997 997 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBCm-1")'
998 998 M d
999 999 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mCBm-1")'
1000 1000 M d
1001 1001 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mBCm-1")'
1002 1002 M b
1003 1003 A d
1004 1004 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCBm-1")'
1005 1005 M b
1006 1006 A d
1007 1007 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mBCm-1")'
1008 1008 M b
1009 1009 M d
1010 1010 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mCBm-1")'
1011 1011 M b
1012 1012 M d
1013 1013 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBCm-1")'
1014 1014 M b
1015 1015 A d
1016 1016 R a
1017 1017 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCBm-1")'
1018 1018 M b
1019 1019 A d
1020 1020 R a
1021 1021
1022 1022 Comparing with a merge re-adding the file afterward
1023 1023 ---------------------------------------------------
1024 1024
1025 1025 Merge:
1026 1026 - one with change to an unrelated file
1027 1027 - one deleting and recreating the change
1028 1028
1029 1029 $ hg log -G --rev '::(desc("mDBm")+desc("mBDm"))'
1030 1030 o 18 mDBm-0 simple merge - the other way
1031 1031 |\
1032 1032 +---o 17 mBDm-0 simple merge - one way
1033 1033 | |/
1034 1034 | o 8 d-2 re-add d
1035 1035 | |
1036 1036 | o 7 d-1 delete d
1037 1037 | |
1038 1038 o | 5 b-1: b update
1039 1039 |/
1040 1040 o 2 i-2: c -move-> d
1041 1041 |
1042 1042 o 1 i-1: a -move-> c
1043 1043 |
1044 1044 o 0 i-0 initial commit: a b h
1045 1045
1046 1046 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBDm-0")'
1047 1047 M d
1048 1048 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mDBm-0")'
1049 1049 M d
1050 1050 $ hg status --copies --rev 'desc("d-2")' --rev 'desc("mBDm-0")'
1051 1051 M b
1052 1052 $ hg status --copies --rev 'desc("d-2")' --rev 'desc("mDBm-0")'
1053 1053 M b
1054 1054 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mBDm-0")'
1055 1055 M b
1056 1056 M d
1057 1057 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mDBm-0")'
1058 1058 M b
1059 1059 M d
1060 1060
1061 1061 The bugs makes recorded copy is different depending of where we started the merge from since
1062 1062
1063 1063 $ hg manifest --debug --rev 'desc("mBDm-0")' | grep '644 d'
1064 1064 b004912a8510032a0350a74daa2803dadfb00e12 644 d
1065 1065 $ hg manifest --debug --rev 'desc("mDBm-0")' | grep '644 d'
1066 1066 b004912a8510032a0350a74daa2803dadfb00e12 644 d
1067 1067
1068 1068 $ hg manifest --debug --rev 'desc("d-2")' | grep '644 d'
1069 1069 b004912a8510032a0350a74daa2803dadfb00e12 644 d
1070 1070 $ hg manifest --debug --rev 'desc("b-1")' | grep '644 d'
1071 1071 169be882533bc917905d46c0c951aa9a1e288dcf 644 d (no-changeset !)
1072 1072 b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 644 d (changeset !)
1073 1073 $ hg debugindex d | head -n 4
1074 1074 rev linkrev nodeid p1 p2
1075 1075 0 2 169be882533b 000000000000 000000000000 (no-changeset !)
1076 1076 0 2 b789fdd96dc2 000000000000 000000000000 (changeset !)
1077 1077 1 8 b004912a8510 000000000000 000000000000
1078 1078 2 22 4a067cf8965d 000000000000 000000000000 (no-changeset !)
1079 1079 2 22 fe6f8b4f507f 000000000000 000000000000 (changeset !)
1080 1080
1081 1081 Log output should not include a merge commit as it did not happen
1082 1082
1083 1083 $ hg log -Gfr 'desc("mBDm-0")' d
1084 1084 o 8 d-2 re-add d
1085 1085 |
1086 1086 ~
1087 1087
1088 1088 $ hg log -Gfr 'desc("mDBm-0")' d
1089 1089 o 8 d-2 re-add d
1090 1090 |
1091 1091 ~
1092 1092
1093 1093 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBDm-0")'
1094 1094 M b
1095 1095 A d
1096 1096 R a
1097 1097 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mDBm-0")'
1098 1098 M b
1099 1099 A d
1100 1100 R a
1101 1101
1102 1102
1103 1103 Comparing with a merge with colliding rename
1104 1104 --------------------------------------------
1105 1105
1106 1106 - the "e-" branch renaming b to f (through 'g')
1107 1107 - the "a-" branch renaming d to f (through e)
1108 1108
1109 1109 $ hg log -G --rev '::(desc("mAEm")+desc("mEAm"))'
1110 1110 o 20 mEAm-0 simple merge - the other way
1111 1111 |\
1112 1112 +---o 19 mAEm-0 simple merge - one way
1113 1113 | |/
1114 1114 | o 10 e-2 g -move-> f
1115 1115 | |
1116 1116 | o 9 e-1 b -move-> g
1117 1117 | |
1118 1118 o | 4 a-2: e -move-> f
1119 1119 | |
1120 1120 o | 3 a-1: d -move-> e
1121 1121 |/
1122 1122 o 2 i-2: c -move-> d
1123 1123 |
1124 1124 o 1 i-1: a -move-> c
1125 1125 |
1126 1126 o 0 i-0 initial commit: a b h
1127 1127
1128 1128 #if no-changeset
1129 1129 $ hg manifest --debug --rev 'desc("mAEm-0")' | grep '644 f'
1130 1130 c39c6083dad048d5138618a46f123e2f397f4f18 644 f
1131 1131 $ hg manifest --debug --rev 'desc("mEAm-0")' | grep '644 f'
1132 1132 a9a8bc3860c9d8fa5f2f7e6ea8d40498322737fd 644 f
1133 1133 $ hg manifest --debug --rev 'desc("a-2")' | grep '644 f'
1134 1134 263ea25e220aaeb7b9bac551c702037849aa75e8 644 f
1135 1135 $ hg manifest --debug --rev 'desc("e-2")' | grep '644 f'
1136 1136 71b9b7e73d973572ade6dd765477fcee6890e8b1 644 f
1137 1137 $ hg debugindex f
1138 1138 rev linkrev nodeid p1 p2
1139 1139 0 4 263ea25e220a 000000000000 000000000000
1140 1140 1 10 71b9b7e73d97 000000000000 000000000000
1141 1141 2 19 c39c6083dad0 263ea25e220a 71b9b7e73d97
1142 1142 3 20 a9a8bc3860c9 71b9b7e73d97 263ea25e220a
1143 1143 #else
1144 1144 $ hg manifest --debug --rev 'desc("mAEm-0")' | grep '644 f'
1145 1145 498e8799f49f9da1ca06bb2d6d4accf165c5b572 644 f
1146 1146 $ hg manifest --debug --rev 'desc("mEAm-0")' | grep '644 f'
1147 1147 c5b506a7118667a38a9c9348a1f63b679e382f57 644 f
1148 1148 $ hg manifest --debug --rev 'desc("a-2")' | grep '644 f'
1149 1149 b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 644 f
1150 1150 $ hg manifest --debug --rev 'desc("e-2")' | grep '644 f'
1151 1151 1e88685f5ddec574a34c70af492f95b6debc8741 644 f
1152 1152 $ hg debugindex f
1153 1153 rev linkrev nodeid p1 p2
1154 1154 0 4 b789fdd96dc2 000000000000 000000000000
1155 1155 1 10 1e88685f5dde 000000000000 000000000000
1156 1156 2 19 498e8799f49f b789fdd96dc2 1e88685f5dde
1157 1157 3 20 c5b506a71186 1e88685f5dde b789fdd96dc2
1158 1158 #endif
1159 1159
1160 1160 # Here the filelog based implementation is not looking at the rename
1161 1161 # information (because the file exist on both side). However the changelog
1162 1162 # based on works fine. We have different output.
1163 1163
1164 1164 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mAEm-0")'
1165 1165 M f
1166 1166 b (no-filelog !)
1167 1167 R b
1168 1168 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mEAm-0")'
1169 1169 M f
1170 1170 b (no-filelog !)
1171 1171 R b
1172 1172 $ hg status --copies --rev 'desc("e-2")' --rev 'desc("mAEm-0")'
1173 1173 M f
1174 1174 d (no-filelog !)
1175 1175 R d
1176 1176 $ hg status --copies --rev 'desc("e-2")' --rev 'desc("mEAm-0")'
1177 1177 M f
1178 1178 d (no-filelog !)
1179 1179 R d
1180 1180 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("a-2")'
1181 1181 A f
1182 1182 d
1183 1183 R d
1184 1184 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("e-2")'
1185 1185 A f
1186 1186 b
1187 1187 R b
1188 1188
1189 1189 # From here, we run status against revision where both source file exists.
1190 1190 #
1191 1191 # The filelog based implementation picks an arbitrary side based on revision
1192 1192 # numbers. So the same side "wins" whatever the parents order is. This is
1193 1193 # sub-optimal because depending on revision numbers means the result can be
1194 1194 # different from one repository to the next.
1195 1195 #
1196 1196 # The changeset based algorithm use the parent order to break tie on conflicting
1197 1197 # information and will have a different order depending on who is p1 and p2.
1198 1198 # That order is stable accross repositories. (data from p1 prevails)
1199 1199
1200 1200 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mAEm-0")'
1201 1201 A f
1202 1202 d
1203 1203 R b
1204 1204 R d
1205 1205 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mEAm-0")'
1206 1206 A f
1207 1207 d (filelog !)
1208 1208 b (no-filelog !)
1209 1209 R b
1210 1210 R d
1211 1211 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAEm-0")'
1212 1212 A f
1213 1213 a
1214 1214 R a
1215 1215 R b
1216 1216 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEAm-0")'
1217 1217 A f
1218 1218 a (filelog !)
1219 1219 b (no-filelog !)
1220 1220 R a
1221 1221 R b
1222 1222
1223 1223
1224 1224 Note:
1225 1225 | In this case, one of the merge wrongly record a merge while there is none.
1226 1226 | This lead to bad copy tracing information to be dug up.
1227 1227
1228 1228
1229 1229 Merge:
1230 1230 - one with change to an unrelated file (b)
1231 1231 - one overwriting a file (d) with a rename (from h to i to d)
1232 1232
1233 1233 $ hg log -G --rev '::(desc("mBFm")+desc("mFBm"))'
1234 1234 o 24 mFBm-0 simple merge - the other way
1235 1235 |\
1236 1236 +---o 23 mBFm-0 simple merge - one way
1237 1237 | |/
1238 1238 | o 22 f-2: rename i -> d
1239 1239 | |
1240 1240 | o 21 f-1: rename h -> i
1241 1241 | |
1242 1242 o | 5 b-1: b update
1243 1243 |/
1244 1244 o 2 i-2: c -move-> d
1245 1245 |
1246 1246 o 1 i-1: a -move-> c
1247 1247 |
1248 1248 o 0 i-0 initial commit: a b h
1249 1249
1250 1250 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBFm-0")'
1251 1251 M b
1252 1252 A d
1253 1253 h
1254 1254 R a
1255 1255 R h
1256 1256 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mFBm-0")'
1257 1257 M b
1258 1258 A d
1259 1259 h
1260 1260 R a
1261 1261 R h
1262 1262 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBFm-0")'
1263 1263 M d
1264 1264 h (no-filelog !)
1265 1265 R h
1266 1266 $ hg status --copies --rev 'desc("f-2")' --rev 'desc("mBFm-0")'
1267 1267 M b
1268 1268 $ hg status --copies --rev 'desc("f-1")' --rev 'desc("mBFm-0")'
1269 1269 M b
1270 1270 M d
1271 1271 i (no-filelog !)
1272 1272 R i
1273 1273 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mFBm-0")'
1274 1274 M d
1275 1275 h (no-filelog !)
1276 1276 R h
1277 1277 $ hg status --copies --rev 'desc("f-2")' --rev 'desc("mFBm-0")'
1278 1278 M b
1279 1279 $ hg status --copies --rev 'desc("f-1")' --rev 'desc("mFBm-0")'
1280 1280 M b
1281 1281 M d
1282 1282 i (no-filelog !)
1283 1283 R i
1284 1284
1285 1285 #if no-changeset
1286 1286 $ hg log -Gfr 'desc("mBFm-0")' d
1287 1287 o 22 f-2: rename i -> d
1288 1288 |
1289 1289 o 21 f-1: rename h -> i
1290 1290 :
1291 1291 o 0 i-0 initial commit: a b h
1292 1292
1293 1293 #else
1294 1294 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
1295 1295 $ hg log -Gfr 'desc("mBFm-0")' d
1296 1296 o 22 f-2: rename i -> d
1297 1297 |
1298 1298 ~
1299 1299 #endif
1300 1300
1301 1301 #if no-changeset
1302 1302 $ hg log -Gfr 'desc("mFBm-0")' d
1303 1303 o 22 f-2: rename i -> d
1304 1304 |
1305 1305 o 21 f-1: rename h -> i
1306 1306 :
1307 1307 o 0 i-0 initial commit: a b h
1308 1308
1309 1309 #else
1310 1310 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
1311 1311 $ hg log -Gfr 'desc("mFBm-0")' d
1312 1312 o 22 f-2: rename i -> d
1313 1313 |
1314 1314 ~
1315 1315 #endif
1316 1316
1317 1317
1318 1318 Merge:
1319 1319 - one with change to a file
1320 1320 - one deleting and recreating the file
1321 1321
1322 1322 Unlike in the 'BD/DB' cases, an actual merge happened here. So we should
1323 1323 consider history and rename on both branch of the merge.
1324 1324
1325 1325 $ hg log -G --rev '::(desc("mDGm")+desc("mGDm"))'
1326 1326 o 27 mGDm-0 simple merge - the other way
1327 1327 |\
1328 1328 +---o 26 mDGm-0 simple merge - one way
1329 1329 | |/
1330 1330 | o 25 g-1: update d
1331 1331 | |
1332 1332 o | 8 d-2 re-add d
1333 1333 | |
1334 1334 o | 7 d-1 delete d
1335 1335 |/
1336 1336 o 2 i-2: c -move-> d
1337 1337 |
1338 1338 o 1 i-1: a -move-> c
1339 1339 |
1340 1340 o 0 i-0 initial commit: a b h
1341 1341
1342 1342 One side of the merge have a long history with rename. The other side of the
1343 1343 merge point to a new file with a smaller history. Each side is "valid".
1344 1344
1345 1345 (and again the filelog based algorithm only explore one, with a pick based on
1346 1346 revision numbers)
1347 1347
1348 1348 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mDGm-0")'
1349 1349 A d
1350 1350 a (filelog !)
1351 1351 R a
1352 1352 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGDm-0")'
1353 1353 A d
1354 1354 a
1355 1355 R a
1356 1356 $ hg status --copies --rev 'desc("d-2")' --rev 'desc("mDGm-0")'
1357 1357 M d
1358 1358 $ hg status --copies --rev 'desc("d-2")' --rev 'desc("mGDm-0")'
1359 1359 M d
1360 1360 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mDGm-0")'
1361 1361 M d
1362 1362 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mGDm-0")'
1363 1363 M d
1364 1364
1365 1365 #if no-changeset
1366 1366 $ hg log -Gfr 'desc("mDGm-0")' d
1367 1367 o 26 mDGm-0 simple merge - one way
1368 1368 |\
1369 1369 | o 25 g-1: update d
1370 1370 | |
1371 1371 o | 8 d-2 re-add d
1372 1372 |/
1373 1373 o 2 i-2: c -move-> d
1374 1374 |
1375 1375 o 1 i-1: a -move-> c
1376 1376 |
1377 1377 o 0 i-0 initial commit: a b h
1378 1378
1379 1379 #else
1380 1380 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
1381 1381 $ hg log -Gfr 'desc("mDGm-0")' d
1382 1382 o 26 mDGm-0 simple merge - one way
1383 1383 |\
1384 1384 | o 25 g-1: update d
1385 1385 | |
1386 1386 o | 8 d-2 re-add d
1387 1387 |/
1388 1388 o 2 i-2: c -move-> d
1389 1389 |
1390 1390 ~
1391 1391 #endif
1392 1392
1393 1393
1394 1394 #if no-changeset
1395 1395 $ hg log -Gfr 'desc("mDGm-0")' d
1396 1396 o 26 mDGm-0 simple merge - one way
1397 1397 |\
1398 1398 | o 25 g-1: update d
1399 1399 | |
1400 1400 o | 8 d-2 re-add d
1401 1401 |/
1402 1402 o 2 i-2: c -move-> d
1403 1403 |
1404 1404 o 1 i-1: a -move-> c
1405 1405 |
1406 1406 o 0 i-0 initial commit: a b h
1407 1407
1408 1408 #else
1409 1409 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
1410 1410 $ hg log -Gfr 'desc("mDGm-0")' d
1411 1411 o 26 mDGm-0 simple merge - one way
1412 1412 |\
1413 1413 | o 25 g-1: update d
1414 1414 | |
1415 1415 o | 8 d-2 re-add d
1416 1416 |/
1417 1417 o 2 i-2: c -move-> d
1418 1418 |
1419 1419 ~
1420 1420 #endif
1421 1421
1422 1422
1423 1423 Merge:
1424 1424 - one with change to a file (d)
1425 1425 - one overwriting that file with a rename (from h to i, to d)
1426 1426
1427 1427 This case is similar to BF/FB, but an actual merge happens, so both side of the
1428 1428 history are relevant.
1429 1429
1430 Note:
1431 | In this case, the merge get conflicting information since on one side we have
1432 | "a -> c -> d". and one the other one we have "h -> i -> d".
1433 |
1434 | The current code arbitrarily pick one side
1435 1430
1436 1431 $ hg log -G --rev '::(desc("mGFm")+desc("mFGm"))'
1437 1432 o 29 mGFm-0 simple merge - the other way
1438 1433 |\
1439 1434 +---o 28 mFGm-0 simple merge - one way
1440 1435 | |/
1441 1436 | o 25 g-1: update d
1442 1437 | |
1443 1438 o | 22 f-2: rename i -> d
1444 1439 | |
1445 1440 o | 21 f-1: rename h -> i
1446 1441 |/
1447 1442 o 2 i-2: c -move-> d
1448 1443 |
1449 1444 o 1 i-1: a -move-> c
1450 1445 |
1451 1446 o 0 i-0 initial commit: a b h
1452 1447
1448
1449 Note:
1450 | In this case, the merge get conflicting information since on one side we have
1451 | "a -> c -> d". and one the other one we have "h -> i -> d".
1452 |
1453 | The current code arbitrarily pick one side depending the ordering of the merged hash:
1454
1455 In this case, the file hash from "f-2" is lower, so it will be `p1` of the resulting filenode its copy tracing information will win (and trace back to "h"):
1456
1457 Details on this hash ordering pick:
1458
1459 $ hg manifest --debug 'desc("g-1")' | egrep 'd$'
1460 f2b277c39e0d2bbac99d8aae075c0d8b5304d266 644 d (no-changeset !)
1461 4ff57b4e8dceedb487e70e6965ea188a7c042cca 644 d (changeset !)
1462 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("g-1")' d
1463 A d
1464 a (no-changeset no-compatibility !)
1465
1466 $ hg manifest --debug 'desc("f-2")' | egrep 'd$'
1467 4a067cf8965d1bfff130057ade26b44f580231be 644 d (no-changeset !)
1468 fe6f8b4f507fe3eb524c527192a84920a4288dac 644 d (changeset !)
1469 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("f-2")' d
1470 A d
1471 h (no-changeset no-compatibility !)
1472
1473 Copy tracing data on the resulting merge:
1474
1453 1475 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mFGm-0")'
1454 1476 A d
1455 1477 h
1456 1478 R a
1457 1479 R h
1458 1480 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGFm-0")'
1459 1481 A d
1460 1482 a (no-filelog !)
1461 1483 h (filelog !)
1462 1484 R a
1463 1485 R h
1464 1486 $ hg status --copies --rev 'desc("f-2")' --rev 'desc("mFGm-0")'
1465 1487 M d
1466 1488 $ hg status --copies --rev 'desc("f-2")' --rev 'desc("mGFm-0")'
1467 1489 M d
1468 1490 $ hg status --copies --rev 'desc("f-1")' --rev 'desc("mFGm-0")'
1469 1491 M d
1470 1492 i (no-filelog !)
1471 1493 R i
1472 1494 $ hg status --copies --rev 'desc("f-1")' --rev 'desc("mGFm-0")'
1473 1495 M d
1474 1496 i (no-filelog !)
1475 1497 R i
1476 1498 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mFGm-0")'
1477 1499 M d
1478 1500 h (no-filelog !)
1479 1501 R h
1480 1502 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mGFm-0")'
1481 1503 M d
1482 1504 h (no-filelog !)
1483 1505 R h
1484 1506
1485 1507 #if no-changeset
1486 1508 $ hg log -Gfr 'desc("mFGm-0")' d
1487 1509 o 28 mFGm-0 simple merge - one way
1488 1510 |\
1489 1511 | o 25 g-1: update d
1490 1512 | |
1491 1513 o | 22 f-2: rename i -> d
1492 1514 | |
1493 1515 o | 21 f-1: rename h -> i
1494 1516 |/
1495 1517 o 2 i-2: c -move-> d
1496 1518 |
1497 1519 o 1 i-1: a -move-> c
1498 1520 |
1499 1521 o 0 i-0 initial commit: a b h
1500 1522
1501 1523 #else
1502 1524 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
1503 1525 $ hg log -Gfr 'desc("mFGm-0")' d
1504 1526 o 28 mFGm-0 simple merge - one way
1505 1527 |\
1506 1528 | o 25 g-1: update d
1507 1529 | |
1508 1530 o | 22 f-2: rename i -> d
1509 1531 |/
1510 1532 o 2 i-2: c -move-> d
1511 1533 |
1512 1534 ~
1513 1535 #endif
1514 1536
1515 1537 #if no-changeset
1516 1538 $ hg log -Gfr 'desc("mGFm-0")' d
1517 1539 o 29 mGFm-0 simple merge - the other way
1518 1540 |\
1519 1541 | o 25 g-1: update d
1520 1542 | |
1521 1543 o | 22 f-2: rename i -> d
1522 1544 | |
1523 1545 o | 21 f-1: rename h -> i
1524 1546 |/
1525 1547 o 2 i-2: c -move-> d
1526 1548 |
1527 1549 o 1 i-1: a -move-> c
1528 1550 |
1529 1551 o 0 i-0 initial commit: a b h
1530 1552
1531 1553 #else
1532 1554 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
1533 1555 $ hg log -Gfr 'desc("mGFm-0")' d
1534 1556 o 29 mGFm-0 simple merge - the other way
1535 1557 |\
1536 1558 | o 25 g-1: update d
1537 1559 | |
1538 1560 o | 22 f-2: rename i -> d
1539 1561 |/
1540 1562 o 2 i-2: c -move-> d
1541 1563 |
1542 1564 ~
1543 1565 #endif
1544 1566
1545 1567
1546 1568 Comparing with merging with a deletion (and keeping the file)
1547 1569 -------------------------------------------------------------
1548 1570
1549 1571 Merge:
1550 1572 - one removing a file (d)
1551 1573 - one updating that file
1552 1574 - the merge keep the modified version of the file (canceling the delete)
1553 1575
1554 1576 In this case, the file keep on living after the merge. So we should not drop its
1555 1577 copy tracing chain.
1556 1578
1557 1579 $ hg log -G --rev '::(desc("mCGm")+desc("mGCm"))'
1558 1580 o 31 mGCm-0
1559 1581 |\
1560 1582 +---o 30 mCGm-0
1561 1583 | |/
1562 1584 | o 25 g-1: update d
1563 1585 | |
1564 1586 o | 6 c-1 delete d
1565 1587 |/
1566 1588 o 2 i-2: c -move-> d
1567 1589 |
1568 1590 o 1 i-1: a -move-> c
1569 1591 |
1570 1592 o 0 i-0 initial commit: a b h
1571 1593
1572 1594
1573 1595 'a' is the copy source of 'd'
1574 1596
1575 1597 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCGm-0")'
1576 1598 A d
1577 1599 a (no-compatibility no-changeset !)
1578 1600 R a
1579 1601 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGCm-0")'
1580 1602 A d
1581 1603 a (no-compatibility no-changeset !)
1582 1604 R a
1583 1605 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCGm-0")'
1584 1606 A d
1585 1607 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mGCm-0")'
1586 1608 A d
1587 1609 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mCGm-0")'
1588 1610 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mGCm-0")'
1589 1611
1590 1612
1591 1613 Comparing with merge restoring an untouched deleted file
1592 1614 --------------------------------------------------------
1593 1615
1594 1616 Merge:
1595 1617 - one removing a file (d)
1596 1618 - one leaving the file untouched
1597 1619 - the merge actively restore the file to the same content.
1598 1620
1599 1621 In this case, the file keep on living after the merge. So we should not drop its
1600 1622 copy tracing chain.
1601 1623
1602 1624 $ hg log -G --rev '::(desc("mCB-revert-m")+desc("mBC-revert-m"))'
1603 1625 o 33 mBC-revert-m-0
1604 1626 |\
1605 1627 +---o 32 mCB-revert-m-0
1606 1628 | |/
1607 1629 | o 6 c-1 delete d
1608 1630 | |
1609 1631 o | 5 b-1: b update
1610 1632 |/
1611 1633 o 2 i-2: c -move-> d
1612 1634 |
1613 1635 o 1 i-1: a -move-> c
1614 1636 |
1615 1637 o 0 i-0 initial commit: a b h
1616 1638
1617 1639
1618 1640 'a' is the the copy source of 'd'
1619 1641
1620 1642 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCB-revert-m-0")'
1621 1643 M b
1622 1644 A d
1623 1645 a (no-compatibility no-changeset !)
1624 1646 R a
1625 1647 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBC-revert-m-0")'
1626 1648 M b
1627 1649 A d
1628 1650 a (no-compatibility no-changeset !)
1629 1651 R a
1630 1652 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCB-revert-m-0")'
1631 1653 M b
1632 1654 A d
1633 1655 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mBC-revert-m-0")'
1634 1656 M b
1635 1657 A d
1636 1658 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mCB-revert-m-0")'
1637 1659 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBC-revert-m-0")'
1638 1660
1639 1661
1640 1662 Merging a branch where a rename was deleted with a branch where the same file was renamed
1641 1663 ------------------------------------------------------------------------------------------
1642 1664
1643 1665 Create a "conflicting" merge where `d` get removed on one branch before its
1644 1666 rename information actually conflict with the other branch.
1645 1667
1646 1668 (the copy information from the branch that was not deleted should win).
1647 1669
1648 1670 $ hg log -G --rev '::(desc("mCH-delete-before-conflict-m")+desc("mHC-delete-before-conflict-m"))'
1649 1671 @ 36 mHC-delete-before-conflict-m-0
1650 1672 |\
1651 1673 +---o 35 mCH-delete-before-conflict-m-0
1652 1674 | |/
1653 1675 | o 34 h-1: b -(move)-> d
1654 1676 | |
1655 1677 o | 6 c-1 delete d
1656 1678 | |
1657 1679 o | 2 i-2: c -move-> d
1658 1680 | |
1659 1681 o | 1 i-1: a -move-> c
1660 1682 |/
1661 1683 o 0 i-0 initial commit: a b h
1662 1684
1663 1685
1664 1686 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCH-delete-before-conflict-m")'
1665 1687 A d
1666 1688 b (no-compatibility no-changeset !)
1667 1689 R a
1668 1690 R b
1669 1691 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mHC-delete-before-conflict-m")'
1670 1692 A d
1671 1693 b
1672 1694 R a
1673 1695 R b
1674 1696 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCH-delete-before-conflict-m")'
1675 1697 A d
1676 1698 b
1677 1699 R b
1678 1700 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mHC-delete-before-conflict-m")'
1679 1701 A d
1680 1702 b
1681 1703 R b
1682 1704 $ hg status --copies --rev 'desc("h-1")' --rev 'desc("mCH-delete-before-conflict-m")'
1683 1705 R a
1684 1706 $ hg status --copies --rev 'desc("h-1")' --rev 'desc("mHC-delete-before-conflict-m")'
1685 1707 R a
General Comments 0
You need to be logged in to leave comments. Login now