##// END OF EJS Templates
test-copies: add a case involving the `b` and a new `r` branch...
marmoute -
r47307:c7baff95 default
parent child Browse files
Show More
@@ -1,3085 +1,3261 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 >> ./no-linkrev
18 18 > #!$PYTHON
19 19 > # filter out linkrev part of the debugindex command
20 20 > import sys
21 21 > for line in sys.stdin:
22 22 > if " linkrev " in line:
23 23 > print(line.rstrip())
24 24 > else:
25 25 > l = "%s *%s" % (line[:6], line[14:].rstrip())
26 26 > print(l)
27 27 > EOF
28 28 $ chmod +x no-linkrev
29 29
30 30 $ cat << EOF >> $HGRCPATH
31 31 > [diff]
32 32 > git=yes
33 33 > [command-templates]
34 34 > log={desc}\n
35 35 > EOF
36 36
37 37 #if compatibility
38 38 $ cat >> $HGRCPATH << EOF
39 39 > [experimental]
40 40 > copies.read-from = compatibility
41 41 > EOF
42 42 #endif
43 43
44 44 #if changeset
45 45 $ cat >> $HGRCPATH << EOF
46 46 > [experimental]
47 47 > copies.read-from = changeset-only
48 48 > copies.write-to = changeset-only
49 49 > EOF
50 50 #endif
51 51
52 52 #if sidedata
53 53 $ cat >> $HGRCPATH << EOF
54 54 > [format]
55 55 > exp-use-side-data = yes
56 56 > exp-use-copies-side-data-changeset = yes
57 57 > EOF
58 58 #endif
59 59
60 60
61 61 $ cat > same-content.txt << EOF
62 62 > Here is some content that will be the same accros multiple file.
63 63 >
64 64 > This is done on purpose so that we end up in some merge situation, were the
65 65 > resulting content is the same as in the parent(s), but a new filenodes still
66 66 > need to be created to record some file history information (especially
67 67 > about copies).
68 68 > EOF
69 69
70 70 $ hg init repo-chain
71 71 $ cd repo-chain
72 72
73 73 Add some linear rename initialy
74 74
75 75 $ cp ../same-content.txt a
76 76 $ cp ../same-content.txt b
77 77 $ cp ../same-content.txt h
78 78 $ echo "original content for P" > p
79 79 $ echo "original content for Q" > q
80 80 $ echo "original content for R" > r
81 81 $ hg ci -Am 'i-0 initial commit: a b h'
82 82 adding a
83 83 adding b
84 84 adding h
85 85 adding p
86 86 adding q
87 87 adding r
88 88 $ hg mv a c
89 89 $ hg mv p s
90 90 $ hg ci -Am 'i-1: a -move-> c, p -move-> s'
91 91 $ hg mv c d
92 92 $ hg mv s t
93 93 $ hg ci -Am 'i-2: c -move-> d, s -move-> t'
94 94 $ hg log -G
95 95 @ i-2: c -move-> d, s -move-> t
96 96 |
97 97 o i-1: a -move-> c, p -move-> s
98 98 |
99 99 o i-0 initial commit: a b h
100 100
101 101
102 102 And having another branch with renames on the other side
103 103
104 104 $ hg mv d e
105 105 $ hg ci -Am 'a-1: d -move-> e'
106 106 $ hg mv e f
107 107 $ hg ci -Am 'a-2: e -move-> f'
108 108 $ hg log -G --rev '::.'
109 109 @ a-2: e -move-> f
110 110 |
111 111 o a-1: d -move-> e
112 112 |
113 113 o i-2: c -move-> d, s -move-> t
114 114 |
115 115 o i-1: a -move-> c, p -move-> s
116 116 |
117 117 o i-0 initial commit: a b h
118 118
119 119
120 120 Have a branching with nothing on one side
121 121
122 122 $ hg up 'desc("i-2")'
123 123 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
124 124 $ echo foo > b
125 125 $ hg ci -m 'b-1: b update'
126 126 created new head
127 127 $ hg log -G --rev '::.'
128 128 @ b-1: b update
129 129 |
130 130 o i-2: c -move-> d, s -move-> t
131 131 |
132 132 o i-1: a -move-> c, p -move-> s
133 133 |
134 134 o i-0 initial commit: a b h
135 135
136 136
137 137 Create a branch that delete a file previous renamed
138 138
139 139 $ hg up 'desc("i-2")'
140 140 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
141 141 $ hg rm d
142 142 $ hg ci -m 'c-1 delete d'
143 143 created new head
144 144 $ hg log -G --rev '::.'
145 145 @ c-1 delete d
146 146 |
147 147 o i-2: c -move-> d, s -move-> t
148 148 |
149 149 o i-1: a -move-> c, p -move-> s
150 150 |
151 151 o i-0 initial commit: a b h
152 152
153 153
154 154 Create a branch that delete a file previous renamed and recreate it
155 155
156 156 $ hg up 'desc("i-2")'
157 157 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
158 158 $ hg rm d
159 159 $ hg ci -m 'd-1 delete d'
160 160 created new head
161 161 $ echo bar > d
162 162 $ hg add d
163 163 $ hg ci -m 'd-2 re-add d'
164 164 $ hg log -G --rev '::.'
165 165 @ d-2 re-add d
166 166 |
167 167 o d-1 delete d
168 168 |
169 169 o i-2: c -move-> d, s -move-> t
170 170 |
171 171 o i-1: a -move-> c, p -move-> s
172 172 |
173 173 o i-0 initial commit: a b h
174 174
175 175
176 176 Having another branch renaming a different file to the same filename as another
177 177
178 178 $ hg up 'desc("i-2")'
179 179 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
180 180 $ hg mv b g
181 181 $ hg ci -m 'e-1 b -move-> g'
182 182 created new head
183 183 $ hg mv g f
184 184 $ hg ci -m 'e-2 g -move-> f'
185 185 $ hg log -G --rev '::.'
186 186 @ e-2 g -move-> f
187 187 |
188 188 o e-1 b -move-> g
189 189 |
190 190 o i-2: c -move-> d, s -move-> t
191 191 |
192 192 o i-1: a -move-> c, p -move-> s
193 193 |
194 194 o i-0 initial commit: a b h
195 195
196 196 $ hg up -q null
197 197
198 198 Having a branch similar to the 'a' one, but moving the 'p' file around.
199 199
200 200 $ hg up 'desc("i-2")'
201 201 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
202 202 $ hg mv t u
203 203 $ hg ci -Am 'p-1: t -move-> u'
204 204 created new head
205 205 $ hg mv u v
206 206 $ hg ci -Am 'p-2: u -move-> v'
207 207 $ hg log -G --rev '::.'
208 208 @ p-2: u -move-> v
209 209 |
210 210 o p-1: t -move-> u
211 211 |
212 212 o i-2: c -move-> d, s -move-> t
213 213 |
214 214 o i-1: a -move-> c, p -move-> s
215 215 |
216 216 o i-0 initial commit: a b h
217 217
218 218 $ hg up -q null
219 219
220 220 Having another branch renaming a different file to the same filename as another
221 221
222 222 $ hg up 'desc("i-2")'
223 223 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
224 224 $ hg mv r w
225 225 $ hg ci -m 'q-1 r -move-> w'
226 226 created new head
227 227 $ hg mv w v
228 228 $ hg ci -m 'q-2 w -move-> v'
229 229 $ hg log -G --rev '::.'
230 230 @ q-2 w -move-> v
231 231 |
232 232 o q-1 r -move-> w
233 233 |
234 234 o i-2: c -move-> d, s -move-> t
235 235 |
236 236 o i-1: a -move-> c, p -move-> s
237 237 |
238 238 o i-0 initial commit: a b h
239 239
240 240 $ hg up -q null
241 241
242 242 Setup all merge
243 243 ===============
244 244
245 245 This is done beforehand to validate that the upgrade process creates valid copy
246 246 information.
247 247
248 248 merging with unrelated change does not interfere with the renames
249 249 ---------------------------------------------------------------
250 250
251 251 - rename on one side
252 252 - unrelated change on the other side
253 253
254 254 $ case_desc="simple merge - A side: multiple renames, B side: unrelated update"
255 255
256 256 $ hg up 'desc("b-1")'
257 257 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
258 258 $ hg merge 'desc("a-2")'
259 259 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
260 260 (branch merge, don't forget to commit)
261 261 $ hg ci -m "mBAm-0 $case_desc - one way"
262 262 $ hg up 'desc("a-2")'
263 263 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
264 264 $ hg merge 'desc("b-1")'
265 265 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
266 266 (branch merge, don't forget to commit)
267 267 $ hg ci -m "mABm-0 $case_desc - the other way"
268 268 created new head
269 269 $ hg log -G --rev '::(desc("mABm")+desc("mBAm"))'
270 270 @ mABm-0 simple merge - A side: multiple renames, B side: unrelated update - the other way
271 271 |\
272 272 +---o mBAm-0 simple merge - A side: multiple renames, B side: unrelated update - one way
273 273 | |/
274 274 | o b-1: b update
275 275 | |
276 276 o | a-2: e -move-> f
277 277 | |
278 278 o | a-1: d -move-> e
279 279 |/
280 280 o i-2: c -move-> d, s -move-> t
281 281 |
282 282 o i-1: a -move-> c, p -move-> s
283 283 |
284 284 o i-0 initial commit: a b h
285 285
286 286
287 287
288 288 merging with the side having a delete
289 289 -------------------------------------
290 290
291 291 case summary:
292 292 - one with change to an unrelated file
293 293 - one deleting the change
294 294 and recreate an unrelated file after the merge
295 295
296 296 $ case_desc="simple merge - C side: delete a file with copies history , B side: unrelated update"
297 297
298 298 $ hg up 'desc("b-1")'
299 299 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
300 300 $ hg merge 'desc("c-1")'
301 301 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
302 302 (branch merge, don't forget to commit)
303 303 $ hg ci -m "mBCm-0 $case_desc - one way"
304 304 $ echo bar > d
305 305 $ hg add d
306 306 $ hg ci -m 'mBCm-1 re-add d'
307 307 $ hg up 'desc("c-1")'
308 308 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
309 309 $ hg merge 'desc("b-1")'
310 310 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
311 311 (branch merge, don't forget to commit)
312 312 $ hg ci -m "mCBm-0 $case_desc - the other way"
313 313 created new head
314 314 $ echo bar > d
315 315 $ hg add d
316 316 $ hg ci -m 'mCBm-1 re-add d'
317 317 $ hg log -G --rev '::(desc("mCBm")+desc("mBCm"))'
318 318 @ mCBm-1 re-add d
319 319 |
320 320 o mCBm-0 simple merge - C side: delete a file with copies history , B side: unrelated update - the other way
321 321 |\
322 322 | | o mBCm-1 re-add d
323 323 | | |
324 324 +---o mBCm-0 simple merge - C side: delete a file with copies history , B side: unrelated update - one way
325 325 | |/
326 326 | o c-1 delete d
327 327 | |
328 328 o | b-1: b update
329 329 |/
330 330 o i-2: c -move-> d, s -move-> t
331 331 |
332 332 o i-1: a -move-> c, p -move-> s
333 333 |
334 334 o i-0 initial commit: a b h
335 335
336 336
337 337 Comparing with a merge re-adding the file afterward
338 338 ---------------------------------------------------
339 339
340 340 Merge:
341 341 - one with change to an unrelated file
342 342 - one deleting and recreating the change
343 343
344 344 $ case_desc="simple merge - B side: unrelated update, D side: delete and recreate a file (with different content)"
345 345
346 346 $ hg up 'desc("b-1")'
347 347 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
348 348 $ hg merge 'desc("d-2")'
349 349 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
350 350 (branch merge, don't forget to commit)
351 351 $ hg ci -m "mBDm-0 $case_desc - one way"
352 352 $ hg up 'desc("d-2")'
353 353 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
354 354 $ hg merge 'desc("b-1")'
355 355 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
356 356 (branch merge, don't forget to commit)
357 357 $ hg ci -m "mDBm-0 $case_desc - the other way"
358 358 created new head
359 359 $ hg log -G --rev '::(desc("mDBm")+desc("mBDm"))'
360 360 @ mDBm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - the other way
361 361 |\
362 362 +---o mBDm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - one way
363 363 | |/
364 364 | o d-2 re-add d
365 365 | |
366 366 | o d-1 delete d
367 367 | |
368 368 o | b-1: b update
369 369 |/
370 370 o i-2: c -move-> d, s -move-> t
371 371 |
372 372 o i-1: a -move-> c, p -move-> s
373 373 |
374 374 o i-0 initial commit: a b h
375 375
376 376
377 377
378 378 Comparing with a merge with colliding rename
379 379 --------------------------------------------
380 380
381 381 Subcase: new copy information on both side
382 382 ``````````````````````````````````````````
383 383
384 384 - the "e-" branch renaming b to f (through 'g')
385 385 - the "a-" branch renaming d to f (through e)
386 386
387 387 $ case_desc="merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f)"
388 388
389 389 $ hg up 'desc("a-2")'
390 390 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
391 391 $ hg merge 'desc("e-2")'
392 392 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
393 393 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
394 394 (branch merge, don't forget to commit)
395 395 $ hg ci -m "mAEm-0 $case_desc - one way"
396 396 $ hg up 'desc("e-2")'
397 397 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
398 398 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
399 399 $ hg merge 'desc("a-2")'
400 400 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
401 401 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
402 402 (branch merge, don't forget to commit)
403 403 $ hg ci -m "mEAm-0 $case_desc - the other way"
404 404 created new head
405 405 $ hg log -G --rev '::(desc("mAEm")+desc("mEAm"))'
406 406 @ mEAm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - the other way
407 407 |\
408 408 +---o mAEm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - one way
409 409 | |/
410 410 | o e-2 g -move-> f
411 411 | |
412 412 | o e-1 b -move-> g
413 413 | |
414 414 o | a-2: e -move-> f
415 415 | |
416 416 o | a-1: d -move-> e
417 417 |/
418 418 o i-2: c -move-> d, s -move-> t
419 419 |
420 420 o i-1: a -move-> c, p -move-> s
421 421 |
422 422 o i-0 initial commit: a b h
423 423
424 424
425 425 Subcase: new copy information on both side with an actual merge happening
426 426 `````````````````````````````````````````````````````````````````````````
427 427
428 428 - the "p-" branch renaming 't' to 'v' (through 'u')
429 429 - the "q-" branch renaming 'r' to 'v' (through 'w')
430 430
431 431 $ case_desc="merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content)"
432 432
433 433 $ hg up 'desc("p-2")'
434 434 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
435 435 $ hg merge 'desc("q-2")' --tool ':union'
436 436 merging v
437 437 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
438 438 (branch merge, don't forget to commit)
439 439 $ hg ci -m "mPQm-0 $case_desc - one way"
440 440 $ hg up 'desc("q-2")'
441 441 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
442 442 $ hg merge 'desc("p-2")' --tool ':union'
443 443 merging v
444 444 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
445 445 (branch merge, don't forget to commit)
446 446 $ hg ci -m "mQPm-0 $case_desc - the other way"
447 447 created new head
448 448 $ hg log -G --rev '::(desc("mAEm")+desc("mEAm"))'
449 449 o mEAm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - the other way
450 450 |\
451 451 +---o mAEm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - one way
452 452 | |/
453 453 | o e-2 g -move-> f
454 454 | |
455 455 | o e-1 b -move-> g
456 456 | |
457 457 o | a-2: e -move-> f
458 458 | |
459 459 o | a-1: d -move-> e
460 460 |/
461 461 o i-2: c -move-> d, s -move-> t
462 462 |
463 463 o i-1: a -move-> c, p -move-> s
464 464 |
465 465 o i-0 initial commit: a b h
466 466
467 467
468 468 Subcase: existing copy information overwritten on one branch
469 469 ````````````````````````````````````````````````````````````
470 470
471 471 Merge:
472 472 - one with change to an unrelated file (b)
473 473 - one overwriting a file (d) with a rename (from h to i to d)
474 474
475 475 $ case_desc="simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d)"
476 476
477 477 $ hg up 'desc("i-2")'
478 478 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
479 479 $ hg mv h i
480 480 $ hg commit -m "f-1: rename h -> i"
481 481 created new head
482 482 $ hg mv --force i d
483 483 $ hg commit -m "f-2: rename i -> d"
484 484 $ hg debugindex d | ../no-linkrev
485 485 rev linkrev nodeid p1 p2
486 486 0 * d8252ab2e760 000000000000 000000000000 (no-changeset !)
487 487 0 * ae258f702dfe 000000000000 000000000000 (changeset !)
488 488 1 * b004912a8510 000000000000 000000000000
489 489 2 * 7b79e2fe0c89 000000000000 000000000000 (no-changeset !)
490 490 $ hg up 'desc("b-1")'
491 491 3 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
492 492 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
493 493 $ hg merge 'desc("f-2")'
494 494 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
495 495 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
496 496 (branch merge, don't forget to commit)
497 497 $ hg ci -m "mBFm-0 $case_desc - one way"
498 498 $ hg up 'desc("f-2")'
499 499 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
500 500 $ hg merge 'desc("b-1")'
501 501 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
502 502 (branch merge, don't forget to commit)
503 503 $ hg ci -m "mFBm-0 $case_desc - the other way"
504 504 created new head
505 505 $ hg up null --quiet
506 506 $ hg log -G --rev '::(desc("mBFm")+desc("mFBm"))'
507 507 o mFBm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - the other way
508 508 |\
509 509 +---o mBFm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - one way
510 510 | |/
511 511 | o f-2: rename i -> d
512 512 | |
513 513 | o f-1: rename h -> i
514 514 | |
515 515 o | b-1: b update
516 516 |/
517 517 o i-2: c -move-> d, s -move-> t
518 518 |
519 519 o i-1: a -move-> c, p -move-> s
520 520 |
521 521 o i-0 initial commit: a b h
522 522
523 523
524 Subcase: existing copy information overwritten on one branch, with different content)
525 `````````````````````````````````````````````````````````````````````````````````````
526
527 Merge:
528 - one with change to an unrelated file (b)
529 - one overwriting a file (t) with a rename (from r to x to t), v content is not the same as on the other branch
530
531 $ case_desc="simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content"
532
533 $ hg up 'desc("i-2")'
534 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
535 $ hg mv r x
536 $ hg commit -m "r-1: rename r -> x"
537 created new head
538 $ hg mv --force x t
539 $ hg commit -m "r-2: rename t -> x"
540 $ hg debugindex t | ../no-linkrev
541 rev linkrev nodeid p1 p2
542 0 * d74efbf65309 000000000000 000000000000 (no-changeset !)
543 1 * 02a930b9d7ad 000000000000 000000000000 (no-changeset !)
544 0 * 5aed6a8dbff0 000000000000 000000000000 (changeset !)
545 1 * a38b2fa17021 000000000000 000000000000 (changeset !)
546 $ hg up 'desc("b-1")'
547 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
548 $ hg merge 'desc("r-2")'
549 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
550 (branch merge, don't forget to commit)
551 $ hg ci -m "mBRm-0 $case_desc - one way"
552 $ hg up 'desc("r-2")'
553 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
554 $ hg merge 'desc("b-1")'
555 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
556 (branch merge, don't forget to commit)
557 $ hg ci -m "mRBm-0 $case_desc - the other way"
558 created new head
559 $ hg up null --quiet
560 $ hg log -G --rev '::(desc("mBRm")+desc("mRBm"))'
561 o mRBm-0 simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content - the other way
562 |\
563 +---o mBRm-0 simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content - one way
564 | |/
565 | o r-2: rename t -> x
566 | |
567 | o r-1: rename r -> x
568 | |
569 o | b-1: b update
570 |/
571 o i-2: c -move-> d, s -move-> t
572 |
573 o i-1: a -move-> c, p -move-> s
574 |
575 o i-0 initial commit: a b h
576
577
524 578
525 579 Subcase: reset of the copy history on one side
526 580 ``````````````````````````````````````````````
527 581
528 582 Merge:
529 583 - one with change to a file
530 584 - one deleting and recreating the file
531 585
532 586 Unlike in the 'BD/DB' cases, an actual merge happened here. So we should
533 587 consider history and rename on both branch of the merge.
534 588
535 589 $ case_desc="actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content"
536 590
537 591 $ hg up 'desc("i-2")'
538 592 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
539 593 $ echo "some update" >> d
540 594 $ hg commit -m "g-1: update d"
541 595 created new head
542 596 $ hg up 'desc("d-2")'
543 597 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
544 598 $ hg merge 'desc("g-1")' --tool :union
545 599 merging d
546 600 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
547 601 (branch merge, don't forget to commit)
548 602 $ hg ci -m "mDGm-0 $case_desc - one way"
549 603 $ hg up 'desc("g-1")'
550 604 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
551 605 $ hg merge 'desc("d-2")' --tool :union
552 606 merging d
553 607 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
554 608 (branch merge, don't forget to commit)
555 609 $ hg ci -m "mGDm-0 $case_desc - the other way"
556 610 created new head
557 611 $ hg log -G --rev '::(desc("mDGm")+desc("mGDm"))'
558 612 @ mGDm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - the other way
559 613 |\
560 614 +---o mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
561 615 | |/
562 616 | o g-1: update d
563 617 | |
564 618 o | d-2 re-add d
565 619 | |
566 620 o | d-1 delete d
567 621 |/
568 622 o i-2: c -move-> d, s -move-> t
569 623 |
570 624 o i-1: a -move-> c, p -move-> s
571 625 |
572 626 o i-0 initial commit: a b h
573 627
574 628
575 629 Subcase: merging a change to a file with a "copy overwrite" to that file from another branch
576 630 ````````````````````````````````````````````````````````````````````````````````````````````
577 631
578 632 Merge:
579 633 - one with change to a file (d)
580 634 - one overwriting that file with a rename (from h to i, to d)
581 635
582 636 This case is similar to BF/FB, but an actual merge happens, so both side of the
583 637 history are relevant.
584 638
585 639 Note:
586 640 | In this case, the merge get conflicting information since on one side we have
587 641 | "a -> c -> d". and one the other one we have "h -> i -> d".
588 642 |
589 643 | The current code arbitrarily pick one side
590 644
591 645 $ case_desc="merge - G side: content change, F side: copy overwrite, no content change"
592 646
593 647 $ hg up 'desc("f-2")'
594 648 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
595 649 $ hg merge 'desc("g-1")' --tool :union
596 650 merging d (no-changeset !)
597 651 0 files updated, 1 files merged, 0 files removed, 0 files unresolved (no-changeset !)
598 652 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
599 653 (branch merge, don't forget to commit)
600 654 $ hg ci -m "mFGm-0 $case_desc - one way"
601 655 created new head
602 656 $ hg up 'desc("g-1")'
603 657 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
604 658 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
605 659 $ hg merge 'desc("f-2")' --tool :union
606 660 merging d (no-changeset !)
607 661 0 files updated, 1 files merged, 1 files removed, 0 files unresolved (no-changeset !)
608 662 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
609 663 (branch merge, don't forget to commit)
610 664 $ hg ci -m "mGFm-0 $case_desc - the other way"
611 665 created new head
612 666 $ hg log -G --rev '::(desc("mGFm")+desc("mFGm"))'
613 667 @ mGFm-0 merge - G side: content change, F side: copy overwrite, no content change - the other way
614 668 |\
615 669 +---o mFGm-0 merge - G side: content change, F side: copy overwrite, no content change - one way
616 670 | |/
617 671 | o g-1: update d
618 672 | |
619 673 o | f-2: rename i -> d
620 674 | |
621 675 o | f-1: rename h -> i
622 676 |/
623 677 o i-2: c -move-> d, s -move-> t
624 678 |
625 679 o i-1: a -move-> c, p -move-> s
626 680 |
627 681 o i-0 initial commit: a b h
628 682
629 683
630 684
631 685 Comparing with merging with a deletion (and keeping the file)
632 686 -------------------------------------------------------------
633 687
634 688 Merge:
635 689 - one removing a file (d)
636 690 - one updating that file
637 691 - the merge keep the modified version of the file (canceling the delete)
638 692
639 693 In this case, the file keep on living after the merge. So we should not drop its
640 694 copy tracing chain.
641 695
642 696 $ case_desc="merge updated/deleted - revive the file (updated content)"
643 697
644 698 $ hg up 'desc("c-1")'
645 699 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
646 700 $ hg merge 'desc("g-1")'
647 701 file 'd' was deleted in local [working copy] but was modified in other [merge rev].
648 702 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
649 703 What do you want to do? u
650 704 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
651 705 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
652 706 [1]
653 707 $ hg resolve -t :other d
654 708 (no more unresolved files)
655 709 $ hg ci -m "mCGm-0 $case_desc - one way"
656 710 created new head
657 711
658 712 $ hg up 'desc("g-1")'
659 713 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
660 714 $ hg merge 'desc("c-1")'
661 715 file 'd' was deleted in other [merge rev] but was modified in local [working copy].
662 716 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
663 717 What do you want to do? u
664 718 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
665 719 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
666 720 [1]
667 721 $ hg resolve -t :local d
668 722 (no more unresolved files)
669 723 $ hg ci -m "mGCm-0 $case_desc - the other way"
670 724 created new head
671 725
672 726 $ hg log -G --rev '::(desc("mCGm")+desc("mGCm"))'
673 727 @ mGCm-0 merge updated/deleted - revive the file (updated content) - the other way
674 728 |\
675 729 +---o mCGm-0 merge updated/deleted - revive the file (updated content) - one way
676 730 | |/
677 731 | o g-1: update d
678 732 | |
679 733 o | c-1 delete d
680 734 |/
681 735 o i-2: c -move-> d, s -move-> t
682 736 |
683 737 o i-1: a -move-> c, p -move-> s
684 738 |
685 739 o i-0 initial commit: a b h
686 740
687 741
688 742
689 743
690 744 Comparing with merge restoring an untouched deleted file
691 745 --------------------------------------------------------
692 746
693 747 Merge:
694 748 - one removing a file (d)
695 749 - one leaving the file untouched
696 750 - the merge actively restore the file to the same content.
697 751
698 752 In this case, the file keep on living after the merge. So we should not drop its
699 753 copy tracing chain.
700 754
701 755 $ case_desc="merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge)"
702 756
703 757 $ hg up 'desc("c-1")'
704 758 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
705 759 $ hg merge 'desc("b-1")'
706 760 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
707 761 (branch merge, don't forget to commit)
708 762 $ hg revert --rev 'desc("b-1")' d
709 763 $ hg ci -m "mCB-revert-m-0 $case_desc - one way"
710 764 created new head
711 765
712 766 $ hg up 'desc("b-1")'
713 767 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
714 768 $ hg merge 'desc("c-1")'
715 769 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
716 770 (branch merge, don't forget to commit)
717 771 $ hg revert --rev 'desc("b-1")' d
718 772 $ hg ci -m "mBC-revert-m-0 $case_desc - the other way"
719 773 created new head
720 774
721 775 $ hg log -G --rev '::(desc("mCB-revert-m")+desc("mBC-revert-m"))'
722 776 @ mBC-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - the other way
723 777 |\
724 778 +---o mCB-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - one way
725 779 | |/
726 780 | o c-1 delete d
727 781 | |
728 782 o | b-1: b update
729 783 |/
730 784 o i-2: c -move-> d, s -move-> t
731 785 |
732 786 o i-1: a -move-> c, p -move-> s
733 787 |
734 788 o i-0 initial commit: a b h
735 789
736 790
737 791
738 792 $ hg up null --quiet
739 793
740 794 Merging a branch where a rename was deleted with a branch where the same file was renamed
741 795 ------------------------------------------------------------------------------------------
742 796
743 797 Create a "conflicting" merge where `d` get removed on one branch before its
744 798 rename information actually conflict with the other branch.
745 799
746 800 (the copy information from the branch that was not deleted should win).
747 801
748 802 $ case_desc="simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch)"
749 803
750 804 $ hg up 'desc("i-0")'
751 805 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
752 806 $ hg mv b d
753 807 $ hg ci -m "h-1: b -(move)-> d"
754 808 created new head
755 809
756 810 $ hg up 'desc("c-1")'
757 811 2 files updated, 0 files merged, 3 files removed, 0 files unresolved
758 812 $ hg merge 'desc("h-1")'
759 813 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
760 814 (branch merge, don't forget to commit)
761 815 $ hg ci -m "mCH-delete-before-conflict-m-0 $case_desc - one way"
762 816
763 817 $ hg up 'desc("h-1")'
764 818 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
765 819 $ hg merge 'desc("c-1")'
766 820 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
767 821 (branch merge, don't forget to commit)
768 822 $ hg ci -m "mHC-delete-before-conflict-m-0 $case_desc - the other way"
769 823 created new head
770 824 $ hg log -G --rev '::(desc("mCH-delete-before-conflict-m")+desc("mHC-delete-before-conflict-m"))'
771 825 @ mHC-delete-before-conflict-m-0 simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch) - the other way
772 826 |\
773 827 +---o mCH-delete-before-conflict-m-0 simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch) - one way
774 828 | |/
775 829 | o h-1: b -(move)-> d
776 830 | |
777 831 o | c-1 delete d
778 832 | |
779 833 o | i-2: c -move-> d, s -move-> t
780 834 | |
781 835 o | i-1: a -move-> c, p -move-> s
782 836 |/
783 837 o i-0 initial commit: a b h
784 838
785 839
786 840 Variant of previous with extra changes introduced by the merge
787 841 --------------------------------------------------------------
788 842
789 843 Multiple cases above explicitely test cases where content are the same on both side during merge. In this section we will introduce variants for theses cases where new change are introduced to these file content during the merges.
790 844
791 845
792 846 Subcase: merge has same initial content on both side, but merge introduced a change
793 847 ```````````````````````````````````````````````````````````````````````````````````
794 848
795 849 Same as `mAEm` and `mEAm` but with extra change to the file before commiting
796 850
797 851 - the "e-" branch renaming b to f (through 'g')
798 852 - the "a-" branch renaming d to f (through e)
799 853
800 854 $ case_desc="merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent)"
801 855
802 856 $ hg up 'desc("a-2")'
803 857 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
804 858 $ hg merge 'desc("e-2")'
805 859 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
806 860 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
807 861 (branch merge, don't forget to commit)
808 862 $ echo "content change for mAE-change-m" > f
809 863 $ hg ci -m "mAE-change-m-0 $case_desc - one way"
810 864 created new head
811 865 $ hg up 'desc("e-2")'
812 866 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
813 867 $ hg merge 'desc("a-2")'
814 868 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
815 869 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
816 870 (branch merge, don't forget to commit)
817 871 $ echo "content change for mEA-change-m" > f
818 872 $ hg ci -m "mEA-change-m-0 $case_desc - the other way"
819 873 created new head
820 874 $ hg log -G --rev '::(desc("mAE-change-m")+desc("mEA-change-m"))'
821 875 @ mEA-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - the other way
822 876 |\
823 877 +---o mAE-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - one way
824 878 | |/
825 879 | o e-2 g -move-> f
826 880 | |
827 881 | o e-1 b -move-> g
828 882 | |
829 883 o | a-2: e -move-> f
830 884 | |
831 885 o | a-1: d -move-> e
832 886 |/
833 887 o i-2: c -move-> d, s -move-> t
834 888 |
835 889 o i-1: a -move-> c, p -move-> s
836 890 |
837 891 o i-0 initial commit: a b h
838 892
839 893
840 894 Decision from previous merge are properly chained with later merge
841 895 ------------------------------------------------------------------
842 896
843 897 Subcase: chaining conflicting rename resolution
844 898 ```````````````````````````````````````````````
845 899
846 900 The "mAEm" and "mEAm" case create a rename tracking conflict on file 'f'. We
847 901 add more change on the respective branch and merge again. These second merge
848 902 does not involve the file 'f' and the arbitration done within "mAEm" and "mEA"
849 903 about that file should stay unchanged.
850 904
851 905 $ case_desc="chained merges (conflict -> simple) - same content everywhere"
852 906
853 907 (extra unrelated changes)
854 908
855 909 $ hg up 'desc("a-2")'
856 910 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
857 911 $ echo j > unrelated-j
858 912 $ hg add unrelated-j
859 913 $ hg ci -m 'j-1: unrelated changes (based on the "a" series of changes)'
860 914 created new head
861 915
862 916 $ hg up 'desc("e-2")'
863 917 2 files updated, 0 files merged, 2 files removed, 0 files unresolved (no-changeset !)
864 918 1 files updated, 0 files merged, 2 files removed, 0 files unresolved (changeset !)
865 919 $ echo k > unrelated-k
866 920 $ hg add unrelated-k
867 921 $ hg ci -m 'k-1: unrelated changes (based on "e" changes)'
868 922 created new head
869 923
870 924 (merge variant 1)
871 925
872 926 $ hg up 'desc("mAEm")'
873 927 1 files updated, 0 files merged, 2 files removed, 0 files unresolved (no-changeset !)
874 928 0 files updated, 0 files merged, 2 files removed, 0 files unresolved (changeset !)
875 929 $ hg merge 'desc("k-1")'
876 930 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
877 931 (branch merge, don't forget to commit)
878 932 $ hg ci -m "mAE,Km: $case_desc"
879 933
880 934 (merge variant 2)
881 935
882 936 $ hg up 'desc("k-1")'
883 937 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
884 938 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
885 939
886 940 $ hg merge 'desc("mAEm")'
887 941 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
888 942 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
889 943 (branch merge, don't forget to commit)
890 944 $ hg ci -m "mK,AEm: $case_desc"
891 945 created new head
892 946
893 947 (merge variant 3)
894 948
895 949 $ hg up 'desc("mEAm")'
896 950 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
897 951 $ hg merge 'desc("j-1")'
898 952 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
899 953 (branch merge, don't forget to commit)
900 954 $ hg ci -m "mEA,Jm: $case_desc"
901 955
902 956 (merge variant 4)
903 957
904 958 $ hg up 'desc("j-1")'
905 959 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
906 960 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
907 961 $ hg merge 'desc("mEAm")'
908 962 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
909 963 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
910 964 (branch merge, don't forget to commit)
911 965 $ hg ci -m "mJ,EAm: $case_desc"
912 966 created new head
913 967
914 968
915 969 $ hg log -G --rev '::(desc("mAE,Km") + desc("mK,AEm") + desc("mEA,Jm") + desc("mJ,EAm"))'
916 970 @ mJ,EAm: chained merges (conflict -> simple) - same content everywhere
917 971 |\
918 972 +---o mEA,Jm: chained merges (conflict -> simple) - same content everywhere
919 973 | |/
920 974 | | o mK,AEm: chained merges (conflict -> simple) - same content everywhere
921 975 | | |\
922 976 | | +---o mAE,Km: chained merges (conflict -> simple) - same content everywhere
923 977 | | | |/
924 978 | | | o k-1: unrelated changes (based on "e" changes)
925 979 | | | |
926 980 | o | | j-1: unrelated changes (based on the "a" series of changes)
927 981 | | | |
928 982 o-----+ mEAm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - the other way
929 983 |/ / /
930 984 | o / mAEm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - one way
931 985 |/|/
932 986 | o e-2 g -move-> f
933 987 | |
934 988 | o e-1 b -move-> g
935 989 | |
936 990 o | a-2: e -move-> f
937 991 | |
938 992 o | a-1: d -move-> e
939 993 |/
940 994 o i-2: c -move-> d, s -move-> t
941 995 |
942 996 o i-1: a -move-> c, p -move-> s
943 997 |
944 998 o i-0 initial commit: a b h
945 999
946 1000
947 1001 Subcase: chaining salvage information during a merge
948 1002 ````````````````````````````````````````````````````
949 1003
950 1004 We add more change on the branch were the file was deleted. merging again
951 1005 should preserve the fact eh file was salvaged.
952 1006
953 1007 $ case_desc="chained merges (salvaged -> simple) - same content (when the file exists)"
954 1008
955 1009 (creating the change)
956 1010
957 1011 $ hg up 'desc("c-1")'
958 1012 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
959 1013 $ echo l > unrelated-l
960 1014 $ hg add unrelated-l
961 1015 $ hg ci -m 'l-1: unrelated changes (based on "c" changes)'
962 1016 created new head
963 1017
964 1018 (Merge variant 1)
965 1019
966 1020 $ hg up 'desc("mBC-revert-m")'
967 1021 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
968 1022 $ hg merge 'desc("l-1")'
969 1023 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
970 1024 (branch merge, don't forget to commit)
971 1025 $ hg ci -m "mBC+revert,Lm: $case_desc"
972 1026
973 1027 (Merge variant 2)
974 1028
975 1029 $ hg up 'desc("mCB-revert-m")'
976 1030 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
977 1031 $ hg merge 'desc("l-1")'
978 1032 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
979 1033 (branch merge, don't forget to commit)
980 1034 $ hg ci -m "mCB+revert,Lm: $case_desc"
981 1035
982 1036 (Merge variant 3)
983 1037
984 1038 $ hg up 'desc("l-1")'
985 1039 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
986 1040
987 1041 $ hg merge 'desc("mBC-revert-m")'
988 1042 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
989 1043 (branch merge, don't forget to commit)
990 1044 $ hg ci -m "mL,BC+revertm: $case_desc"
991 1045 created new head
992 1046
993 1047 (Merge variant 4)
994 1048
995 1049 $ hg up 'desc("l-1")'
996 1050 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
997 1051
998 1052 $ hg merge 'desc("mCB-revert-m")'
999 1053 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1000 1054 (branch merge, don't forget to commit)
1001 1055 $ hg ci -m "mL,CB+revertm: $case_desc"
1002 1056 created new head
1003 1057
1004 1058 $ hg log -G --rev '::(desc("mBC+revert,Lm") + desc("mCB+revert,Lm") + desc("mL,BC+revertm") + desc("mL,CB+revertm"))'
1005 1059 @ mL,CB+revertm: chained merges (salvaged -> simple) - same content (when the file exists)
1006 1060 |\
1007 1061 | | o mL,BC+revertm: chained merges (salvaged -> simple) - same content (when the file exists)
1008 1062 | |/|
1009 1063 +-+---o mCB+revert,Lm: chained merges (salvaged -> simple) - same content (when the file exists)
1010 1064 | | |
1011 1065 | +---o mBC+revert,Lm: chained merges (salvaged -> simple) - same content (when the file exists)
1012 1066 | | |/
1013 1067 | o | l-1: unrelated changes (based on "c" changes)
1014 1068 | | |
1015 1069 | | o mBC-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - the other way
1016 1070 | |/|
1017 1071 o---+ mCB-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - one way
1018 1072 |/ /
1019 1073 o | c-1 delete d
1020 1074 | |
1021 1075 | o b-1: b update
1022 1076 |/
1023 1077 o i-2: c -move-> d, s -move-> t
1024 1078 |
1025 1079 o i-1: a -move-> c, p -move-> s
1026 1080 |
1027 1081 o i-0 initial commit: a b h
1028 1082
1029 1083
1030 1084
1031 1085 Subcase: chaining "merged" information during a merge
1032 1086 ``````````````````````````````````````````````````````
1033 1087
1034 1088 When a non-rename change are merged with a copy overwrite, the merge pick the copy source from (p1) as the reference. We should preserve this information in subsequent merges.
1035 1089
1036 1090 $ case_desc="chained merges (copy-overwrite -> simple) - same content"
1037 1091
1038 1092 (extra unrelated changes)
1039 1093
1040 1094 $ hg up 'desc("f-2")'
1041 1095 2 files updated, 0 files merged, 2 files removed, 0 files unresolved (no-changeset !)
1042 1096 1 files updated, 0 files merged, 2 files removed, 0 files unresolved (changeset !)
1043 1097 $ echo n > unrelated-n
1044 1098 $ hg add unrelated-n
1045 1099 $ hg ci -m 'n-1: unrelated changes (based on the "f" series of changes)'
1046 1100 created new head
1047 1101
1048 1102 $ hg up 'desc("g-1")'
1049 1103 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
1050 1104 $ echo o > unrelated-o
1051 1105 $ hg add unrelated-o
1052 1106 $ hg ci -m 'o-1: unrelated changes (based on "g" changes)'
1053 1107 created new head
1054 1108
1055 1109 (merge variant 1)
1056 1110
1057 1111 $ hg up 'desc("mFGm")'
1058 1112 1 files updated, 0 files merged, 2 files removed, 0 files unresolved (no-changeset !)
1059 1113 0 files updated, 0 files merged, 2 files removed, 0 files unresolved (changeset !)
1060 1114 $ hg merge 'desc("o-1")'
1061 1115 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1062 1116 (branch merge, don't forget to commit)
1063 1117 $ hg ci -m "mFG,Om: $case_desc"
1064 1118
1065 1119 (merge variant 2)
1066 1120
1067 1121 $ hg up 'desc("o-1")'
1068 1122 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
1069 1123 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
1070 1124 $ hg merge 'desc("FGm")'
1071 1125 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
1072 1126 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
1073 1127 (branch merge, don't forget to commit)
1074 1128 $ hg ci -m "mO,FGm: $case_desc"
1075 1129 created new head
1076 1130
1077 1131 (merge variant 3)
1078 1132
1079 1133 $ hg up 'desc("mGFm")'
1080 1134 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1081 1135 $ hg merge 'desc("n-1")'
1082 1136 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1083 1137 (branch merge, don't forget to commit)
1084 1138 $ hg ci -m "mGF,Nm: $case_desc"
1085 1139
1086 1140 (merge variant 4)
1087 1141
1088 1142 $ hg up 'desc("n-1")'
1089 1143 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1090 1144 $ hg merge 'desc("mGFm")'
1091 1145 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1092 1146 (branch merge, don't forget to commit)
1093 1147 $ hg ci -m "mN,GFm: $case_desc"
1094 1148 created new head
1095 1149
1096 1150 $ hg log -G --rev '::(desc("mFG,Om") + desc("mO,FGm") + desc("mGF,Nm") + desc("mN,GFm"))'
1097 1151 @ mN,GFm: chained merges (copy-overwrite -> simple) - same content
1098 1152 |\
1099 1153 +---o mGF,Nm: chained merges (copy-overwrite -> simple) - same content
1100 1154 | |/
1101 1155 | | o mO,FGm: chained merges (copy-overwrite -> simple) - same content
1102 1156 | | |\
1103 1157 | | +---o mFG,Om: chained merges (copy-overwrite -> simple) - same content
1104 1158 | | | |/
1105 1159 | | | o o-1: unrelated changes (based on "g" changes)
1106 1160 | | | |
1107 1161 | o | | n-1: unrelated changes (based on the "f" series of changes)
1108 1162 | | | |
1109 1163 o-----+ mGFm-0 merge - G side: content change, F side: copy overwrite, no content change - the other way
1110 1164 |/ / /
1111 1165 | o / mFGm-0 merge - G side: content change, F side: copy overwrite, no content change - one way
1112 1166 |/|/
1113 1167 | o g-1: update d
1114 1168 | |
1115 1169 o | f-2: rename i -> d
1116 1170 | |
1117 1171 o | f-1: rename h -> i
1118 1172 |/
1119 1173 o i-2: c -move-> d, s -move-> t
1120 1174 |
1121 1175 o i-1: a -move-> c, p -move-> s
1122 1176 |
1123 1177 o i-0 initial commit: a b h
1124 1178
1125 1179
1126 1180 Subcase: chaining conflicting rename resolution, with extra change during the merge
1127 1181 ```````````````````````````````````````````````````````````````````````````````````
1128 1182
1129 1183 The "mEA-change-m-0" and "mAE-change-m-0" case create a rename tracking conflict on file 'f'. We
1130 1184 add more change on the respective branch and merge again. These second merge
1131 1185 does not involve the file 'f' and the arbitration done within "mAEm" and "mEA"
1132 1186 about that file should stay unchanged.
1133 1187
1134 1188 $ case_desc="chained merges (conflict+change -> simple) - same content on both branch in the initial merge"
1135 1189
1136 1190
1137 1191 (merge variant 1)
1138 1192
1139 1193 $ hg up 'desc("mAE-change-m")'
1140 1194 2 files updated, 0 files merged, 3 files removed, 0 files unresolved
1141 1195 $ hg merge 'desc("k-1")'
1142 1196 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1143 1197 (branch merge, don't forget to commit)
1144 1198 $ hg ci -m "mAE-change,Km: $case_desc"
1145 1199
1146 1200 (merge variant 2)
1147 1201
1148 1202 $ hg up 'desc("k-1")'
1149 1203 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1150 1204
1151 1205 $ hg merge 'desc("mAE-change-m")'
1152 1206 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1153 1207 (branch merge, don't forget to commit)
1154 1208 $ hg ci -m "mK,AE-change-m: $case_desc"
1155 1209 created new head
1156 1210
1157 1211 (merge variant 3)
1158 1212
1159 1213 $ hg up 'desc("mEA-change-m")'
1160 1214 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1161 1215 $ hg merge 'desc("j-1")'
1162 1216 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1163 1217 (branch merge, don't forget to commit)
1164 1218 $ hg ci -m "mEA-change,Jm: $case_desc"
1165 1219
1166 1220 (merge variant 4)
1167 1221
1168 1222 $ hg up 'desc("j-1")'
1169 1223 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1170 1224 $ hg merge 'desc("mEA-change-m")'
1171 1225 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1172 1226 (branch merge, don't forget to commit)
1173 1227 $ hg ci -m "mJ,EA-change-m: $case_desc"
1174 1228 created new head
1175 1229
1176 1230
1177 1231 $ hg log -G --rev '::(desc("mAE-change,Km") + desc("mK,AE-change-m") + desc("mEA-change,Jm") + desc("mJ,EA-change-m"))'
1178 1232 @ mJ,EA-change-m: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1179 1233 |\
1180 1234 +---o mEA-change,Jm: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1181 1235 | |/
1182 1236 | | o mK,AE-change-m: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1183 1237 | | |\
1184 1238 | | +---o mAE-change,Km: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1185 1239 | | | |/
1186 1240 | | | o k-1: unrelated changes (based on "e" changes)
1187 1241 | | | |
1188 1242 | o | | j-1: unrelated changes (based on the "a" series of changes)
1189 1243 | | | |
1190 1244 o-----+ mEA-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - the other way
1191 1245 |/ / /
1192 1246 | o / mAE-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - one way
1193 1247 |/|/
1194 1248 | o e-2 g -move-> f
1195 1249 | |
1196 1250 | o e-1 b -move-> g
1197 1251 | |
1198 1252 o | a-2: e -move-> f
1199 1253 | |
1200 1254 o | a-1: d -move-> e
1201 1255 |/
1202 1256 o i-2: c -move-> d, s -move-> t
1203 1257 |
1204 1258 o i-1: a -move-> c, p -move-> s
1205 1259 |
1206 1260 o i-0 initial commit: a b h
1207 1261
1208 1262
1209 1263 Summary of all created cases
1210 1264 ----------------------------
1211 1265
1212 1266 $ hg up --quiet null
1213 1267
1214 1268 (This exists to help keeping a compact list of the various cases we have built)
1215 1269
1216 1270 $ hg log -T '{desc|firstline}\n'| sort
1217 1271 a-1: d -move-> e
1218 1272 a-2: e -move-> f
1219 1273 b-1: b update
1220 1274 c-1 delete d
1221 1275 d-1 delete d
1222 1276 d-2 re-add d
1223 1277 e-1 b -move-> g
1224 1278 e-2 g -move-> f
1225 1279 f-1: rename h -> i
1226 1280 f-2: rename i -> d
1227 1281 g-1: update d
1228 1282 h-1: b -(move)-> d
1229 1283 i-0 initial commit: a b h
1230 1284 i-1: a -move-> c, p -move-> s
1231 1285 i-2: c -move-> d, s -move-> t
1232 1286 j-1: unrelated changes (based on the "a" series of changes)
1233 1287 k-1: unrelated changes (based on "e" changes)
1234 1288 l-1: unrelated changes (based on "c" changes)
1235 1289 mABm-0 simple merge - A side: multiple renames, B side: unrelated update - the other way
1236 1290 mAE,Km: chained merges (conflict -> simple) - same content everywhere
1237 1291 mAE-change,Km: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1238 1292 mAE-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - one way
1239 1293 mAEm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - one way
1240 1294 mBAm-0 simple merge - A side: multiple renames, B side: unrelated update - one way
1241 1295 mBC+revert,Lm: chained merges (salvaged -> simple) - same content (when the file exists)
1242 1296 mBC-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - the other way
1243 1297 mBCm-0 simple merge - C side: delete a file with copies history , B side: unrelated update - one way
1244 1298 mBCm-1 re-add d
1245 1299 mBDm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - one way
1246 1300 mBFm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - one way
1301 mBRm-0 simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content - one way
1247 1302 mCB+revert,Lm: chained merges (salvaged -> simple) - same content (when the file exists)
1248 1303 mCB-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - one way
1249 1304 mCBm-0 simple merge - C side: delete a file with copies history , B side: unrelated update - the other way
1250 1305 mCBm-1 re-add d
1251 1306 mCGm-0 merge updated/deleted - revive the file (updated content) - one way
1252 1307 mCH-delete-before-conflict-m-0 simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch) - one way
1253 1308 mDBm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - the other way
1254 1309 mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
1255 1310 mEA,Jm: chained merges (conflict -> simple) - same content everywhere
1256 1311 mEA-change,Jm: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1257 1312 mEA-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - the other way
1258 1313 mEAm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - the other way
1259 1314 mFBm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - the other way
1260 1315 mFG,Om: chained merges (copy-overwrite -> simple) - same content
1261 1316 mFGm-0 merge - G side: content change, F side: copy overwrite, no content change - one way
1262 1317 mGCm-0 merge updated/deleted - revive the file (updated content) - the other way
1263 1318 mGDm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - the other way
1264 1319 mGF,Nm: chained merges (copy-overwrite -> simple) - same content
1265 1320 mGFm-0 merge - G side: content change, F side: copy overwrite, no content change - the other way
1266 1321 mHC-delete-before-conflict-m-0 simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch) - the other way
1267 1322 mJ,EA-change-m: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1268 1323 mJ,EAm: chained merges (conflict -> simple) - same content everywhere
1269 1324 mK,AE-change-m: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1270 1325 mK,AEm: chained merges (conflict -> simple) - same content everywhere
1271 1326 mL,BC+revertm: chained merges (salvaged -> simple) - same content (when the file exists)
1272 1327 mL,CB+revertm: chained merges (salvaged -> simple) - same content (when the file exists)
1273 1328 mN,GFm: chained merges (copy-overwrite -> simple) - same content
1274 1329 mO,FGm: chained merges (copy-overwrite -> simple) - same content
1275 1330 mPQm-0 merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content) - one way
1276 1331 mQPm-0 merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content) - the other way
1332 mRBm-0 simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content - the other way
1277 1333 n-1: unrelated changes (based on the "f" series of changes)
1278 1334 o-1: unrelated changes (based on "g" changes)
1279 1335 p-1: t -move-> u
1280 1336 p-2: u -move-> v
1281 1337 q-1 r -move-> w
1282 1338 q-2 w -move-> v
1339 r-1: rename r -> x
1340 r-2: rename t -> x
1283 1341
1284 1342
1285 1343 Test that sidedata computations during upgrades are correct
1286 1344 ===========================================================
1287 1345
1288 1346 We upgrade a repository that is not using sidedata (the filelog case) and
1289 1347 check that the same side data have been generated as if they were computed at
1290 1348 commit time.
1291 1349
1292 1350
1293 1351 #if upgraded
1294 1352 $ cat >> $HGRCPATH << EOF
1295 1353 > [format]
1296 1354 > exp-use-side-data = yes
1297 1355 > exp-use-copies-side-data-changeset = yes
1298 1356 > EOF
1299 1357 $ hg debugformat -v
1300 1358 format-variant repo config default
1301 1359 fncache: yes yes yes
1302 1360 dotencode: yes yes yes
1303 1361 generaldelta: yes yes yes
1304 1362 share-safe: no no no
1305 1363 sparserevlog: yes yes yes
1306 1364 sidedata: no yes no
1307 1365 persistent-nodemap: no no no
1308 1366 copies-sdc: no yes no
1309 1367 plain-cl-delta: yes yes yes
1310 1368 compression: * (glob)
1311 1369 compression-level: default default default
1312 1370 $ hg debugupgraderepo --run --quiet
1313 1371 upgrade will perform the following actions:
1314 1372
1315 1373 requirements
1316 1374 preserved: * (glob)
1317 1375 added: exp-copies-sidedata-changeset, exp-sidedata-flag
1318 1376
1319 1377 processed revlogs:
1320 1378 - all-filelogs
1321 1379 - changelog
1322 1380 - manifest
1323 1381
1324 1382 #endif
1325 1383
1326 1384
1327 1385 #if no-compatibility no-filelog no-changeset
1328 1386
1329 1387 $ hg debugchangedfiles --compute 0
1330 1388 added : a, ;
1331 1389 added : b, ;
1332 1390 added : h, ;
1333 1391 added : p, ;
1334 1392 added : q, ;
1335 1393 added : r, ;
1336 1394
1337 1395 $ for rev in `hg log --rev 'all()' -T '{rev}\n'`; do
1338 1396 > case_id=`hg log -r $rev -T '{word(0, desc, ":")}\n'`
1339 1397 > echo "##### revision \"$case_id\" #####"
1340 1398 > hg debugsidedata -c -v -- $rev
1341 1399 > hg debugchangedfiles $rev
1342 1400 > done
1343 1401 ##### revision "i-0 initial commit" #####
1344 1402 1 sidedata entries
1345 1403 entry-0014 size 64
1346 1404 '\x00\x00\x00\x06\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\x00\x04\x00\x00\x00\x04\x00\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x00\x04\x00\x00\x00\x06\x00\x00\x00\x00abhpqr'
1347 1405 added : a, ;
1348 1406 added : b, ;
1349 1407 added : h, ;
1350 1408 added : p, ;
1351 1409 added : q, ;
1352 1410 added : r, ;
1353 1411 ##### revision "i-1" #####
1354 1412 1 sidedata entries
1355 1413 entry-0014 size 44
1356 1414 '\x00\x00\x00\x04\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00\x0c\x00\x00\x00\x03\x00\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\x02acps'
1357 1415 removed : a, ;
1358 1416 added p1: c, a;
1359 1417 removed : p, ;
1360 1418 added p1: s, p;
1361 1419 ##### revision "i-2" #####
1362 1420 1 sidedata entries
1363 1421 entry-0014 size 44
1364 1422 '\x00\x00\x00\x04\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00\x0c\x00\x00\x00\x03\x00\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\x02cdst'
1365 1423 removed : c, ;
1366 1424 added p1: d, c;
1367 1425 removed : s, ;
1368 1426 added p1: t, s;
1369 1427 ##### revision "a-1" #####
1370 1428 1 sidedata entries
1371 1429 entry-0014 size 24
1372 1430 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00de'
1373 1431 removed : d, ;
1374 1432 added p1: e, d;
1375 1433 ##### revision "a-2" #####
1376 1434 1 sidedata entries
1377 1435 entry-0014 size 24
1378 1436 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00ef'
1379 1437 removed : e, ;
1380 1438 added p1: f, e;
1381 1439 ##### revision "b-1" #####
1382 1440 1 sidedata entries
1383 1441 entry-0014 size 14
1384 1442 '\x00\x00\x00\x01\x14\x00\x00\x00\x01\x00\x00\x00\x00b'
1385 1443 touched : b, ;
1386 1444 ##### revision "c-1 delete d" #####
1387 1445 1 sidedata entries
1388 1446 entry-0014 size 14
1389 1447 '\x00\x00\x00\x01\x0c\x00\x00\x00\x01\x00\x00\x00\x00d'
1390 1448 removed : d, ;
1391 1449 ##### revision "d-1 delete d" #####
1392 1450 1 sidedata entries
1393 1451 entry-0014 size 14
1394 1452 '\x00\x00\x00\x01\x0c\x00\x00\x00\x01\x00\x00\x00\x00d'
1395 1453 removed : d, ;
1396 1454 ##### revision "d-2 re-add d" #####
1397 1455 1 sidedata entries
1398 1456 entry-0014 size 14
1399 1457 '\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x00\x00\x00d'
1400 1458 added : d, ;
1401 1459 ##### revision "e-1 b -move-> g" #####
1402 1460 1 sidedata entries
1403 1461 entry-0014 size 24
1404 1462 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00bg'
1405 1463 removed : b, ;
1406 1464 added p1: g, b;
1407 1465 ##### revision "e-2 g -move-> f" #####
1408 1466 1 sidedata entries
1409 1467 entry-0014 size 24
1410 1468 '\x00\x00\x00\x02\x06\x00\x00\x00\x01\x00\x00\x00\x01\x0c\x00\x00\x00\x02\x00\x00\x00\x00fg'
1411 1469 added p1: f, g;
1412 1470 removed : g, ;
1413 1471 ##### revision "p-1" #####
1414 1472 1 sidedata entries
1415 1473 entry-0014 size 24
1416 1474 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00tu'
1417 1475 removed : t, ;
1418 1476 added p1: u, t;
1419 1477 ##### revision "p-2" #####
1420 1478 1 sidedata entries
1421 1479 entry-0014 size 24
1422 1480 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00uv'
1423 1481 removed : u, ;
1424 1482 added p1: v, u;
1425 1483 ##### revision "q-1 r -move-> w" #####
1426 1484 1 sidedata entries
1427 1485 entry-0014 size 24
1428 1486 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00rw'
1429 1487 removed : r, ;
1430 1488 added p1: w, r;
1431 1489 ##### revision "q-2 w -move-> v" #####
1432 1490 1 sidedata entries
1433 1491 entry-0014 size 24
1434 1492 '\x00\x00\x00\x02\x06\x00\x00\x00\x01\x00\x00\x00\x01\x0c\x00\x00\x00\x02\x00\x00\x00\x00vw'
1435 1493 added p1: v, w;
1436 1494 removed : w, ;
1437 1495 ##### revision "mBAm-0 simple merge - A side" #####
1438 1496 1 sidedata entries
1439 1497 entry-0014 size 4
1440 1498 '\x00\x00\x00\x00'
1441 1499 ##### revision "mABm-0 simple merge - A side" #####
1442 1500 1 sidedata entries
1443 1501 entry-0014 size 4
1444 1502 '\x00\x00\x00\x00'
1445 1503 ##### revision "mBCm-0 simple merge - C side" #####
1446 1504 1 sidedata entries
1447 1505 entry-0014 size 4
1448 1506 '\x00\x00\x00\x00'
1449 1507 ##### revision "mBCm-1 re-add d" #####
1450 1508 1 sidedata entries
1451 1509 entry-0014 size 14
1452 1510 '\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x00\x00\x00d'
1453 1511 added : d, ;
1454 1512 ##### revision "mCBm-0 simple merge - C side" #####
1455 1513 1 sidedata entries
1456 1514 entry-0014 size 4
1457 1515 '\x00\x00\x00\x00'
1458 1516 ##### revision "mCBm-1 re-add d" #####
1459 1517 1 sidedata entries
1460 1518 entry-0014 size 14
1461 1519 '\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x00\x00\x00d'
1462 1520 added : d, ;
1463 1521 ##### revision "mBDm-0 simple merge - B side" #####
1464 1522 1 sidedata entries
1465 1523 entry-0014 size 4
1466 1524 '\x00\x00\x00\x00'
1467 1525 ##### revision "mDBm-0 simple merge - B side" #####
1468 1526 1 sidedata entries
1469 1527 entry-0014 size 4
1470 1528 '\x00\x00\x00\x00'
1471 1529 ##### revision "mAEm-0 merge with copies info on both side - A side" #####
1472 1530 1 sidedata entries
1473 1531 entry-0014 size 14
1474 1532 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00f'
1475 1533 merged : f, ;
1476 1534 ##### revision "mEAm-0 merge with copies info on both side - A side" #####
1477 1535 1 sidedata entries
1478 1536 entry-0014 size 14
1479 1537 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00f'
1480 1538 merged : f, ;
1481 1539 ##### revision "mPQm-0 merge with copies info on both side - P side" #####
1482 1540 1 sidedata entries
1483 1541 entry-0014 size 14
1484 1542 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00v'
1485 1543 merged : v, ;
1486 1544 ##### revision "mQPm-0 merge with copies info on both side - P side" #####
1487 1545 1 sidedata entries
1488 1546 entry-0014 size 14
1489 1547 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00v'
1490 1548 merged : v, ;
1491 1549 ##### revision "f-1" #####
1492 1550 1 sidedata entries
1493 1551 entry-0014 size 24
1494 1552 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00hi'
1495 1553 removed : h, ;
1496 1554 added p1: i, h;
1497 1555 ##### revision "f-2" #####
1498 1556 1 sidedata entries
1499 1557 entry-0014 size 24
1500 1558 '\x00\x00\x00\x02\x16\x00\x00\x00\x01\x00\x00\x00\x01\x0c\x00\x00\x00\x02\x00\x00\x00\x00di'
1501 1559 touched p1: d, i;
1502 1560 removed : i, ;
1503 1561 ##### revision "mBFm-0 simple merge - B side" #####
1504 1562 1 sidedata entries
1505 1563 entry-0014 size 4
1506 1564 '\x00\x00\x00\x00'
1507 1565 ##### revision "mFBm-0 simple merge - B side" #####
1508 1566 1 sidedata entries
1509 1567 entry-0014 size 4
1510 1568 '\x00\x00\x00\x00'
1569 ##### revision "r-1" #####
1570 1 sidedata entries
1571 entry-0014 size 24
1572 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00rx'
1573 removed : r, ;
1574 added p1: x, r;
1575 ##### revision "r-2" #####
1576 1 sidedata entries
1577 entry-0014 size 24
1578 '\x00\x00\x00\x02\x16\x00\x00\x00\x01\x00\x00\x00\x01\x0c\x00\x00\x00\x02\x00\x00\x00\x00tx'
1579 touched p1: t, x;
1580 removed : x, ;
1581 ##### revision "mBRm-0 simple merge - B side" #####
1582 1 sidedata entries
1583 entry-0014 size 4
1584 '\x00\x00\x00\x00'
1585 ##### revision "mRBm-0 simple merge - B side" #####
1586 1 sidedata entries
1587 entry-0014 size 4
1588 '\x00\x00\x00\x00'
1511 1589 ##### revision "g-1" #####
1512 1590 1 sidedata entries
1513 1591 entry-0014 size 14
1514 1592 '\x00\x00\x00\x01\x14\x00\x00\x00\x01\x00\x00\x00\x00d'
1515 1593 touched : d, ;
1516 1594 ##### revision "mDGm-0 actual content merge, copies on one side - D side" #####
1517 1595 1 sidedata entries
1518 1596 entry-0014 size 14
1519 1597 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d'
1520 1598 merged : d, ;
1521 1599 ##### revision "mGDm-0 actual content merge, copies on one side - D side" #####
1522 1600 1 sidedata entries
1523 1601 entry-0014 size 14
1524 1602 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d'
1525 1603 merged : d, ;
1526 1604 ##### revision "mFGm-0 merge - G side" #####
1527 1605 1 sidedata entries
1528 1606 entry-0014 size 14
1529 1607 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d'
1530 1608 merged : d, ;
1531 1609 ##### revision "mGFm-0 merge - G side" #####
1532 1610 1 sidedata entries
1533 1611 entry-0014 size 14
1534 1612 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d'
1535 1613 merged : d, ;
1536 1614 ##### revision "mCGm-0 merge updated/deleted - revive the file (updated content) - one way" #####
1537 1615 1 sidedata entries
1538 1616 entry-0014 size 14
1539 1617 '\x00\x00\x00\x01\x10\x00\x00\x00\x01\x00\x00\x00\x00d'
1540 1618 salvaged : d, ;
1541 1619 ##### revision "mGCm-0 merge updated/deleted - revive the file (updated content) - the other way" #####
1542 1620 1 sidedata entries
1543 1621 entry-0014 size 14
1544 1622 '\x00\x00\x00\x01\x10\x00\x00\x00\x01\x00\x00\x00\x00d'
1545 1623 salvaged : d, ;
1546 1624 ##### revision "mCB-revert-m-0 merge explicitely revive deleted file - B side" #####
1547 1625 1 sidedata entries
1548 1626 entry-0014 size 14
1549 1627 '\x00\x00\x00\x01\x10\x00\x00\x00\x01\x00\x00\x00\x00d'
1550 1628 salvaged : d, ;
1551 1629 ##### revision "mBC-revert-m-0 merge explicitely revive deleted file - B side" #####
1552 1630 1 sidedata entries
1553 1631 entry-0014 size 14
1554 1632 '\x00\x00\x00\x01\x10\x00\x00\x00\x01\x00\x00\x00\x00d'
1555 1633 salvaged : d, ;
1556 1634 ##### revision "h-1" #####
1557 1635 1 sidedata entries
1558 1636 entry-0014 size 24
1559 1637 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00bd'
1560 1638 removed : b, ;
1561 1639 added p1: d, b;
1562 1640 ##### revision "mCH-delete-before-conflict-m-0 simple merge - C side" #####
1563 1641 1 sidedata entries
1564 1642 entry-0014 size 4
1565 1643 '\x00\x00\x00\x00'
1566 1644 ##### revision "mHC-delete-before-conflict-m-0 simple merge - C side" #####
1567 1645 1 sidedata entries
1568 1646 entry-0014 size 4
1569 1647 '\x00\x00\x00\x00'
1570 1648 ##### revision "mAE-change-m-0 merge with file update and copies info on both side - A side" #####
1571 1649 1 sidedata entries
1572 1650 entry-0014 size 14
1573 1651 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00f'
1574 1652 merged : f, ;
1575 1653 ##### revision "mEA-change-m-0 merge with file update and copies info on both side - A side" #####
1576 1654 1 sidedata entries
1577 1655 entry-0014 size 14
1578 1656 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00f'
1579 1657 merged : f, ;
1580 1658 ##### revision "j-1" #####
1581 1659 1 sidedata entries
1582 1660 entry-0014 size 24
1583 1661 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-j'
1584 1662 added : unrelated-j, ;
1585 1663 ##### revision "k-1" #####
1586 1664 1 sidedata entries
1587 1665 entry-0014 size 24
1588 1666 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-k'
1589 1667 added : unrelated-k, ;
1590 1668 ##### revision "mAE,Km" #####
1591 1669 1 sidedata entries
1592 1670 entry-0014 size 4
1593 1671 '\x00\x00\x00\x00'
1594 1672 ##### revision "mK,AEm" #####
1595 1673 1 sidedata entries
1596 1674 entry-0014 size 4
1597 1675 '\x00\x00\x00\x00'
1598 1676 ##### revision "mEA,Jm" #####
1599 1677 1 sidedata entries
1600 1678 entry-0014 size 4
1601 1679 '\x00\x00\x00\x00'
1602 1680 ##### revision "mJ,EAm" #####
1603 1681 1 sidedata entries
1604 1682 entry-0014 size 4
1605 1683 '\x00\x00\x00\x00'
1606 1684 ##### revision "l-1" #####
1607 1685 1 sidedata entries
1608 1686 entry-0014 size 24
1609 1687 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-l'
1610 1688 added : unrelated-l, ;
1611 1689 ##### revision "mBC+revert,Lm" #####
1612 1690 1 sidedata entries
1613 1691 entry-0014 size 4
1614 1692 '\x00\x00\x00\x00'
1615 1693 ##### revision "mCB+revert,Lm" #####
1616 1694 1 sidedata entries
1617 1695 entry-0014 size 4
1618 1696 '\x00\x00\x00\x00'
1619 1697 ##### revision "mL,BC+revertm" #####
1620 1698 1 sidedata entries
1621 1699 entry-0014 size 4
1622 1700 '\x00\x00\x00\x00'
1623 1701 ##### revision "mL,CB+revertm" #####
1624 1702 1 sidedata entries
1625 1703 entry-0014 size 4
1626 1704 '\x00\x00\x00\x00'
1627 1705 ##### revision "n-1" #####
1628 1706 1 sidedata entries
1629 1707 entry-0014 size 24
1630 1708 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-n'
1631 1709 added : unrelated-n, ;
1632 1710 ##### revision "o-1" #####
1633 1711 1 sidedata entries
1634 1712 entry-0014 size 24
1635 1713 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-o'
1636 1714 added : unrelated-o, ;
1637 1715 ##### revision "mFG,Om" #####
1638 1716 1 sidedata entries
1639 1717 entry-0014 size 4
1640 1718 '\x00\x00\x00\x00'
1641 1719 ##### revision "mO,FGm" #####
1642 1720 1 sidedata entries
1643 1721 entry-0014 size 4
1644 1722 '\x00\x00\x00\x00'
1645 1723 ##### revision "mGF,Nm" #####
1646 1724 1 sidedata entries
1647 1725 entry-0014 size 4
1648 1726 '\x00\x00\x00\x00'
1649 1727 ##### revision "mN,GFm" #####
1650 1728 1 sidedata entries
1651 1729 entry-0014 size 4
1652 1730 '\x00\x00\x00\x00'
1653 1731 ##### revision "mAE-change,Km" #####
1654 1732 1 sidedata entries
1655 1733 entry-0014 size 4
1656 1734 '\x00\x00\x00\x00'
1657 1735 ##### revision "mK,AE-change-m" #####
1658 1736 1 sidedata entries
1659 1737 entry-0014 size 4
1660 1738 '\x00\x00\x00\x00'
1661 1739 ##### revision "mEA-change,Jm" #####
1662 1740 1 sidedata entries
1663 1741 entry-0014 size 4
1664 1742 '\x00\x00\x00\x00'
1665 1743 ##### revision "mJ,EA-change-m" #####
1666 1744 1 sidedata entries
1667 1745 entry-0014 size 4
1668 1746 '\x00\x00\x00\x00'
1669 1747
1670 1748 #endif
1671 1749
1672 1750
1673 1751 Test copy information chaining
1674 1752 ==============================
1675 1753
1676 1754 Check that matching only affect the destination and not intermediate path
1677 1755 -------------------------------------------------------------------------
1678 1756
1679 1757 The two status call should give the same value for f
1680 1758
1681 1759 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("a-2")'
1682 1760 A f
1683 1761 a
1684 1762 A t
1685 1763 p
1686 1764 R a
1687 1765 R p
1688 1766 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("a-2")' f
1689 1767 A f
1690 1768 a (no-changeset no-compatibility !)
1691 1769
1692 1770 merging with unrelated change does not interfere with the renames
1693 1771 ---------------------------------------------------------------
1694 1772
1695 1773 - rename on one side
1696 1774 - unrelated change on the other side
1697 1775
1698 1776 $ hg log -G --rev '::(desc("mABm")+desc("mBAm"))'
1699 1777 o mABm-0 simple merge - A side: multiple renames, B side: unrelated update - the other way
1700 1778 |\
1701 1779 +---o mBAm-0 simple merge - A side: multiple renames, B side: unrelated update - one way
1702 1780 | |/
1703 1781 | o b-1: b update
1704 1782 | |
1705 1783 o | a-2: e -move-> f
1706 1784 | |
1707 1785 o | a-1: d -move-> e
1708 1786 |/
1709 1787 o i-2: c -move-> d, s -move-> t
1710 1788 |
1711 1789 o i-1: a -move-> c, p -move-> s
1712 1790 |
1713 1791 o i-0 initial commit: a b h
1714 1792
1715 1793
1716 1794 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mABm")'
1717 1795 A f
1718 1796 d
1719 1797 R d
1720 1798 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBAm")'
1721 1799 A f
1722 1800 d
1723 1801 R d
1724 1802 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mABm")'
1725 1803 M b
1726 1804 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mBAm")'
1727 1805 M b
1728 1806 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mABm")'
1729 1807 M b
1730 1808 A f
1731 1809 d
1732 1810 R d
1733 1811 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mBAm")'
1734 1812 M b
1735 1813 A f
1736 1814 d
1737 1815 R d
1738 1816 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mABm")'
1739 1817 M b
1740 1818 A f
1741 1819 a
1742 1820 A t
1743 1821 p
1744 1822 R a
1745 1823 R p
1746 1824 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBAm")'
1747 1825 M b
1748 1826 A f
1749 1827 a
1750 1828 A t
1751 1829 p
1752 1830 R a
1753 1831 R p
1754 1832
1755 1833 merging with the side having a delete
1756 1834 -------------------------------------
1757 1835
1758 1836 case summary:
1759 1837 - one with change to an unrelated file
1760 1838 - one deleting the change
1761 1839 and recreate an unrelated file after the merge
1762 1840
1763 1841 $ hg log -G --rev '::(desc("mCBm")+desc("mBCm"))'
1764 1842 o mCBm-1 re-add d
1765 1843 |
1766 1844 o mCBm-0 simple merge - C side: delete a file with copies history , B side: unrelated update - the other way
1767 1845 |\
1768 1846 | | o mBCm-1 re-add d
1769 1847 | | |
1770 1848 +---o mBCm-0 simple merge - C side: delete a file with copies history , B side: unrelated update - one way
1771 1849 | |/
1772 1850 | o c-1 delete d
1773 1851 | |
1774 1852 o | b-1: b update
1775 1853 |/
1776 1854 o i-2: c -move-> d, s -move-> t
1777 1855 |
1778 1856 o i-1: a -move-> c, p -move-> s
1779 1857 |
1780 1858 o i-0 initial commit: a b h
1781 1859
1782 1860 - comparing from the merge
1783 1861
1784 1862 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBCm-0")'
1785 1863 R d
1786 1864 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mCBm-0")'
1787 1865 R d
1788 1866 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mBCm-0")'
1789 1867 M b
1790 1868 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCBm-0")'
1791 1869 M b
1792 1870 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mBCm-0")'
1793 1871 M b
1794 1872 R d
1795 1873 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mCBm-0")'
1796 1874 M b
1797 1875 R d
1798 1876 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBCm-0")'
1799 1877 M b
1800 1878 A t
1801 1879 p
1802 1880 R a
1803 1881 R p
1804 1882 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCBm-0")'
1805 1883 M b
1806 1884 A t
1807 1885 p
1808 1886 R a
1809 1887 R p
1810 1888
1811 1889 - comparing with the merge children re-adding the file
1812 1890
1813 1891 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBCm-1")'
1814 1892 M d
1815 1893 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mCBm-1")'
1816 1894 M d
1817 1895 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mBCm-1")'
1818 1896 M b
1819 1897 A d
1820 1898 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCBm-1")'
1821 1899 M b
1822 1900 A d
1823 1901 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mBCm-1")'
1824 1902 M b
1825 1903 M d
1826 1904 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mCBm-1")'
1827 1905 M b
1828 1906 M d
1829 1907 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBCm-1")'
1830 1908 M b
1831 1909 A d
1832 1910 A t
1833 1911 p
1834 1912 R a
1835 1913 R p
1836 1914 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCBm-1")'
1837 1915 M b
1838 1916 A d
1839 1917 A t
1840 1918 p
1841 1919 R a
1842 1920 R p
1843 1921
1844 1922 Comparing with a merge re-adding the file afterward
1845 1923 ---------------------------------------------------
1846 1924
1847 1925 Merge:
1848 1926 - one with change to an unrelated file
1849 1927 - one deleting and recreating the change
1850 1928
1851 1929 $ hg log -G --rev '::(desc("mDBm")+desc("mBDm"))'
1852 1930 o mDBm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - the other way
1853 1931 |\
1854 1932 +---o mBDm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - one way
1855 1933 | |/
1856 1934 | o d-2 re-add d
1857 1935 | |
1858 1936 | o d-1 delete d
1859 1937 | |
1860 1938 o | b-1: b update
1861 1939 |/
1862 1940 o i-2: c -move-> d, s -move-> t
1863 1941 |
1864 1942 o i-1: a -move-> c, p -move-> s
1865 1943 |
1866 1944 o i-0 initial commit: a b h
1867 1945
1868 1946 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBDm-0")'
1869 1947 M d
1870 1948 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mDBm-0")'
1871 1949 M d
1872 1950 $ hg status --copies --rev 'desc("d-2")' --rev 'desc("mBDm-0")'
1873 1951 M b
1874 1952 $ hg status --copies --rev 'desc("d-2")' --rev 'desc("mDBm-0")'
1875 1953 M b
1876 1954 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mBDm-0")'
1877 1955 M b
1878 1956 M d
1879 1957 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mDBm-0")'
1880 1958 M b
1881 1959 M d
1882 1960
1883 1961 The bugs makes recorded copy is different depending of where we started the merge from since
1884 1962
1885 1963 $ hg manifest --debug --rev 'desc("mBDm-0")' | grep '644 d'
1886 1964 b004912a8510032a0350a74daa2803dadfb00e12 644 d
1887 1965 $ hg manifest --debug --rev 'desc("mDBm-0")' | grep '644 d'
1888 1966 b004912a8510032a0350a74daa2803dadfb00e12 644 d
1889 1967
1890 1968 $ hg manifest --debug --rev 'desc("d-2")' | grep '644 d'
1891 1969 b004912a8510032a0350a74daa2803dadfb00e12 644 d
1892 1970 $ hg manifest --debug --rev 'desc("b-1")' | grep '644 d'
1893 1971 d8252ab2e760b0d4e5288fd44cbd15a0fa567e16 644 d (no-changeset !)
1894 1972 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 d (changeset !)
1895 1973 $ hg debugindex d | head -n 4 | ../no-linkrev
1896 1974 rev linkrev nodeid p1 p2
1897 1975 0 * d8252ab2e760 000000000000 000000000000 (no-changeset !)
1898 1976 0 * ae258f702dfe 000000000000 000000000000 (changeset !)
1899 1977 1 * b004912a8510 000000000000 000000000000
1900 1978 2 * 7b79e2fe0c89 000000000000 000000000000 (no-changeset !)
1901 1979 2 * 5cce88bf349f ae258f702dfe 000000000000 (changeset !)
1902 1980
1903 1981 Log output should not include a merge commit as it did not happen
1904 1982
1905 1983 $ hg log -Gfr 'desc("mBDm-0")' d
1906 1984 o d-2 re-add d
1907 1985 |
1908 1986 ~
1909 1987
1910 1988 $ hg log -Gfr 'desc("mDBm-0")' d
1911 1989 o d-2 re-add d
1912 1990 |
1913 1991 ~
1914 1992
1915 1993 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBDm-0")'
1916 1994 M b
1917 1995 A d
1918 1996 A t
1919 1997 p
1920 1998 R a
1921 1999 R p
1922 2000 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mDBm-0")'
1923 2001 M b
1924 2002 A d
1925 2003 A t
1926 2004 p
1927 2005 R a
1928 2006 R p
1929 2007
1930 2008
1931 2009 Comparing with a merge with colliding rename
1932 2010 --------------------------------------------
1933 2011
1934 2012 Subcase: new copy information on both side
1935 2013 ``````````````````````````````````````````
1936 2014
1937 2015 - the "e-" branch renaming b to f (through 'g')
1938 2016 - the "a-" branch renaming d to f (through e)
1939 2017
1940 2018 $ hg log -G --rev '::(desc("mAEm")+desc("mEAm"))'
1941 2019 o mEAm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - the other way
1942 2020 |\
1943 2021 +---o mAEm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - one way
1944 2022 | |/
1945 2023 | o e-2 g -move-> f
1946 2024 | |
1947 2025 | o e-1 b -move-> g
1948 2026 | |
1949 2027 o | a-2: e -move-> f
1950 2028 | |
1951 2029 o | a-1: d -move-> e
1952 2030 |/
1953 2031 o i-2: c -move-> d, s -move-> t
1954 2032 |
1955 2033 o i-1: a -move-> c, p -move-> s
1956 2034 |
1957 2035 o i-0 initial commit: a b h
1958 2036
1959 2037 #if no-changeset
1960 2038 $ hg manifest --debug --rev 'desc("mAEm-0")' | grep '644 f'
1961 2039 2ff93c643948464ee1f871867910ae43a45b0bea 644 f
1962 2040 $ hg manifest --debug --rev 'desc("mEAm-0")' | grep '644 f'
1963 2041 2ff93c643948464ee1f871867910ae43a45b0bea 644 f
1964 2042 $ hg manifest --debug --rev 'desc("a-2")' | grep '644 f'
1965 2043 b76eb76580df486c3d51d63c5c210d4dd43a8ac7 644 f
1966 2044 $ hg manifest --debug --rev 'desc("e-2")' | grep '644 f'
1967 2045 e8825b386367b29fec957283a80bb47b47483fe1 644 f
1968 2046 $ hg debugindex f | ../no-linkrev
1969 2047 rev linkrev nodeid p1 p2
1970 2048 0 * b76eb76580df 000000000000 000000000000
1971 2049 1 * e8825b386367 000000000000 000000000000
1972 2050 2 * 2ff93c643948 b76eb76580df e8825b386367
1973 2051 3 * 2f649fba7eb2 b76eb76580df e8825b386367
1974 2052 4 * 774e7c1637d5 e8825b386367 b76eb76580df
1975 2053 #else
1976 2054 $ hg manifest --debug --rev 'desc("mAEm-0")' | grep '644 f'
1977 2055 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 f
1978 2056 $ hg manifest --debug --rev 'desc("mEAm-0")' | grep '644 f'
1979 2057 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 f
1980 2058 $ hg manifest --debug --rev 'desc("a-2")' | grep '644 f'
1981 2059 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 f
1982 2060 $ hg manifest --debug --rev 'desc("e-2")' | grep '644 f'
1983 2061 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 f
1984 2062 $ hg debugindex f | ../no-linkrev
1985 2063 rev linkrev nodeid p1 p2
1986 2064 0 * ae258f702dfe 000000000000 000000000000
1987 2065 1 * d3613c1ec831 ae258f702dfe 000000000000
1988 2066 2 * 05e03c868bbc ae258f702dfe 000000000000
1989 2067 #endif
1990 2068
1991 2069 # Here the filelog based implementation is not looking at the rename
1992 2070 # information (because the file exist on both side). However the changelog
1993 2071 # based on works fine. We have different output.
1994 2072
1995 2073 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mAEm-0")'
1996 2074 M f (no-changeset !)
1997 2075 b (no-filelog no-changeset !)
1998 2076 R b
1999 2077 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mEAm-0")'
2000 2078 M f (no-changeset !)
2001 2079 b (no-filelog no-changeset !)
2002 2080 R b
2003 2081 $ hg status --copies --rev 'desc("e-2")' --rev 'desc("mAEm-0")'
2004 2082 M f (no-changeset !)
2005 2083 d (no-filelog no-changeset !)
2006 2084 R d
2007 2085 $ hg status --copies --rev 'desc("e-2")' --rev 'desc("mEAm-0")'
2008 2086 M f (no-changeset !)
2009 2087 d (no-filelog no-changeset !)
2010 2088 R d
2011 2089 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("a-2")'
2012 2090 A f
2013 2091 d
2014 2092 R d
2015 2093 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("e-2")'
2016 2094 A f
2017 2095 b
2018 2096 R b
2019 2097
2020 2098 # From here, we run status against revision where both source file exists.
2021 2099 #
2022 2100 # The filelog based implementation picks an arbitrary side based on revision
2023 2101 # numbers. So the same side "wins" whatever the parents order is. This is
2024 2102 # sub-optimal because depending on revision numbers means the result can be
2025 2103 # different from one repository to the next.
2026 2104 #
2027 2105 # The changeset based algorithm use the parent order to break tie on conflicting
2028 2106 # information and will have a different order depending on who is p1 and p2.
2029 2107 # That order is stable accross repositories. (data from p1 prevails)
2030 2108
2031 2109 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mAEm-0")'
2032 2110 A f
2033 2111 d
2034 2112 R b
2035 2113 R d
2036 2114 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mEAm-0")'
2037 2115 A f
2038 2116 d (filelog !)
2039 2117 b (no-filelog !)
2040 2118 R b
2041 2119 R d
2042 2120 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAEm-0")'
2043 2121 A f
2044 2122 a
2045 2123 A t
2046 2124 p
2047 2125 R a
2048 2126 R b
2049 2127 R p
2050 2128 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEAm-0")'
2051 2129 A f
2052 2130 a (filelog !)
2053 2131 b (no-filelog !)
2054 2132 A t
2055 2133 p
2056 2134 R a
2057 2135 R b
2058 2136 R p
2059 2137
2060 2138
2061 2139 Subcase: existing copy information overwritten on one branch
2062 2140 ````````````````````````````````````````````````````````````
2063 2141
2064 2142 Note:
2065 2143 | In this case, one of the merge wrongly record a merge while there is none.
2066 2144 | This lead to bad copy tracing information to be dug up.
2067 2145
2068 2146
2069 2147 Merge:
2070 2148 - one with change to an unrelated file (b)
2071 2149 - one overwriting a file (d) with a rename (from h to i to d)
2072 2150
2073 2151 $ hg log -G --rev '::(desc("mBFm")+desc("mFBm"))'
2074 2152 o mFBm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - the other way
2075 2153 |\
2076 2154 +---o mBFm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - one way
2077 2155 | |/
2078 2156 | o f-2: rename i -> d
2079 2157 | |
2080 2158 | o f-1: rename h -> i
2081 2159 | |
2082 2160 o | b-1: b update
2083 2161 |/
2084 2162 o i-2: c -move-> d, s -move-> t
2085 2163 |
2086 2164 o i-1: a -move-> c, p -move-> s
2087 2165 |
2088 2166 o i-0 initial commit: a b h
2089 2167
2090 2168 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBFm-0")'
2091 2169 M b
2092 2170 A d
2093 2171 h
2094 2172 A t
2095 2173 p
2096 2174 R a
2097 2175 R h
2098 2176 R p
2099 2177 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mFBm-0")'
2100 2178 M b
2101 2179 A d
2102 2180 h
2103 2181 A t
2104 2182 p
2105 2183 R a
2106 2184 R h
2107 2185 R p
2108 2186 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBFm-0")'
2109 2187 M d (no-changeset !)
2110 2188 h (no-filelog no-changeset !)
2111 2189 R h
2112 2190 $ hg status --copies --rev 'desc("f-2")' --rev 'desc("mBFm-0")'
2113 2191 M b
2114 2192 $ hg status --copies --rev 'desc("f-1")' --rev 'desc("mBFm-0")'
2115 2193 M b
2116 2194 M d (no-changeset !)
2117 2195 i (no-filelog no-changeset !)
2118 2196 R i
2119 2197 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mFBm-0")'
2120 2198 M d (no-changeset !)
2121 2199 h (no-filelog no-changeset !)
2122 2200 R h
2123 2201 $ hg status --copies --rev 'desc("f-2")' --rev 'desc("mFBm-0")'
2124 2202 M b
2125 2203 $ hg status --copies --rev 'desc("f-1")' --rev 'desc("mFBm-0")'
2126 2204 M b
2127 2205 M d (no-changeset !)
2128 2206 i (no-filelog no-changeset !)
2129 2207 R i
2130 2208
2131 2209 #if no-changeset
2132 2210 $ hg log -Gfr 'desc("mBFm-0")' d
2133 2211 o f-2: rename i -> d
2134 2212 |
2135 2213 o f-1: rename h -> i
2136 2214 :
2137 2215 o i-0 initial commit: a b h
2138 2216
2139 2217 #else
2140 2218 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2141 2219 $ hg log -Gfr 'desc("mBFm-0")' d
2142 2220 o i-2: c -move-> d, s -move-> t
2143 2221 |
2144 2222 ~
2145 2223 #endif
2146 2224
2147 2225 #if no-changeset
2148 2226 $ hg log -Gfr 'desc("mFBm-0")' d
2149 2227 o f-2: rename i -> d
2150 2228 |
2151 2229 o f-1: rename h -> i
2152 2230 :
2153 2231 o i-0 initial commit: a b h
2154 2232
2155 2233 #else
2156 2234 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2157 2235 $ hg log -Gfr 'desc("mFBm-0")' d
2158 2236 o i-2: c -move-> d, s -move-> t
2159 2237 |
2160 2238 ~
2161 2239 #endif
2162 2240
2241
2242 Subcase: existing copy information overwritten on one branch, with different content)
2243 `````````````````````````````````````````````````````````````````````````````````````
2244
2245 Merge:
2246 - one with change to an unrelated file (b)
2247 - one overwriting a file (t) with a rename (from r to x to t), v content is not the same as on the other branch
2248
2249 $ hg log -G --rev '::(desc("mBRm")+desc("mRBm"))'
2250 o mRBm-0 simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content - the other way
2251 |\
2252 +---o mBRm-0 simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content - one way
2253 | |/
2254 | o r-2: rename t -> x
2255 | |
2256 | o r-1: rename r -> x
2257 | |
2258 o | b-1: b update
2259 |/
2260 o i-2: c -move-> d, s -move-> t
2261 |
2262 o i-1: a -move-> c, p -move-> s
2263 |
2264 o i-0 initial commit: a b h
2265
2266 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBRm-0")'
2267 M b
2268 A d
2269 a
2270 A t
2271 r
2272 R a
2273 R p
2274 R r
2275 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mRBm-0")'
2276 M b
2277 A d
2278 a
2279 A t
2280 r
2281 R a
2282 R p
2283 R r
2284 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBRm-0")'
2285 M t
2286 r (no-filelog !)
2287 R r
2288 $ hg status --copies --rev 'desc("r-2")' --rev 'desc("mBRm-0")'
2289 M b
2290 $ hg status --copies --rev 'desc("r-1")' --rev 'desc("mBRm-0")'
2291 M b
2292 M t
2293 x (no-filelog !)
2294 R x
2295 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mRBm-0")'
2296 M t
2297 r (no-filelog !)
2298 R r
2299 $ hg status --copies --rev 'desc("r-2")' --rev 'desc("mRBm-0")'
2300 M b
2301 $ hg status --copies --rev 'desc("r-1")' --rev 'desc("mRBm-0")'
2302 M b
2303 M t
2304 x (no-filelog !)
2305 R x
2306
2307 #if no-changeset
2308 $ hg log -Gfr 'desc("mBRm-0")' d
2309 o i-2: c -move-> d, s -move-> t
2310 |
2311 o i-1: a -move-> c, p -move-> s
2312 |
2313 o i-0 initial commit: a b h
2314
2315 #else
2316 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2317 $ hg log -Gfr 'desc("mBRm-0")' d
2318 o i-2: c -move-> d, s -move-> t
2319 |
2320 ~
2321 #endif
2322
2323 #if no-changeset
2324 $ hg log -Gfr 'desc("mRBm-0")' d
2325 o i-2: c -move-> d, s -move-> t
2326 |
2327 o i-1: a -move-> c, p -move-> s
2328 |
2329 o i-0 initial commit: a b h
2330
2331 #else
2332 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2333 $ hg log -Gfr 'desc("mRBm-0")' d
2334 o i-2: c -move-> d, s -move-> t
2335 |
2336 ~
2337 #endif
2338
2163 2339 Subcase: reset of the copy history on one side
2164 2340 ``````````````````````````````````````````````
2165 2341
2166 2342 Merge:
2167 2343 - one with change to a file
2168 2344 - one deleting and recreating the file
2169 2345
2170 2346 Unlike in the 'BD/DB' cases, an actual merge happened here. So we should
2171 2347 consider history and rename on both branch of the merge.
2172 2348
2173 2349 $ hg log -G --rev '::(desc("mDGm")+desc("mGDm"))'
2174 2350 o mGDm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - the other way
2175 2351 |\
2176 2352 +---o mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
2177 2353 | |/
2178 2354 | o g-1: update d
2179 2355 | |
2180 2356 o | d-2 re-add d
2181 2357 | |
2182 2358 o | d-1 delete d
2183 2359 |/
2184 2360 o i-2: c -move-> d, s -move-> t
2185 2361 |
2186 2362 o i-1: a -move-> c, p -move-> s
2187 2363 |
2188 2364 o i-0 initial commit: a b h
2189 2365
2190 2366 One side of the merge have a long history with rename. The other side of the
2191 2367 merge point to a new file with a smaller history. Each side is "valid".
2192 2368
2193 2369 (and again the filelog based algorithm only explore one, with a pick based on
2194 2370 revision numbers)
2195 2371
2196 2372 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mDGm-0")'
2197 2373 A d
2198 2374 a (filelog !)
2199 2375 A t
2200 2376 p
2201 2377 R a
2202 2378 R p
2203 2379 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGDm-0")'
2204 2380 A d
2205 2381 a
2206 2382 A t
2207 2383 p
2208 2384 R a
2209 2385 R p
2210 2386 $ hg status --copies --rev 'desc("d-2")' --rev 'desc("mDGm-0")'
2211 2387 M d
2212 2388 $ hg status --copies --rev 'desc("d-2")' --rev 'desc("mGDm-0")'
2213 2389 M d
2214 2390 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mDGm-0")'
2215 2391 M d
2216 2392 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mGDm-0")'
2217 2393 M d
2218 2394
2219 2395 #if no-changeset
2220 2396 $ hg log -Gfr 'desc("mDGm-0")' d
2221 2397 o mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
2222 2398 |\
2223 2399 | o g-1: update d
2224 2400 | |
2225 2401 o | d-2 re-add d
2226 2402 |/
2227 2403 o i-2: c -move-> d, s -move-> t
2228 2404 |
2229 2405 o i-1: a -move-> c, p -move-> s
2230 2406 |
2231 2407 o i-0 initial commit: a b h
2232 2408
2233 2409 #else
2234 2410 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2235 2411 $ hg log -Gfr 'desc("mDGm-0")' d
2236 2412 o mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
2237 2413 |\
2238 2414 | o g-1: update d
2239 2415 | |
2240 2416 o | d-2 re-add d
2241 2417 |/
2242 2418 o i-2: c -move-> d, s -move-> t
2243 2419 |
2244 2420 ~
2245 2421 #endif
2246 2422
2247 2423
2248 2424 #if no-changeset
2249 2425 $ hg log -Gfr 'desc("mDGm-0")' d
2250 2426 o mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
2251 2427 |\
2252 2428 | o g-1: update d
2253 2429 | |
2254 2430 o | d-2 re-add d
2255 2431 |/
2256 2432 o i-2: c -move-> d, s -move-> t
2257 2433 |
2258 2434 o i-1: a -move-> c, p -move-> s
2259 2435 |
2260 2436 o i-0 initial commit: a b h
2261 2437
2262 2438 #else
2263 2439 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2264 2440 $ hg log -Gfr 'desc("mDGm-0")' d
2265 2441 o mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
2266 2442 |\
2267 2443 | o g-1: update d
2268 2444 | |
2269 2445 o | d-2 re-add d
2270 2446 |/
2271 2447 o i-2: c -move-> d, s -move-> t
2272 2448 |
2273 2449 ~
2274 2450 #endif
2275 2451
2276 2452 Subcase: merging a change to a file with a "copy overwrite" to that file from another branch
2277 2453 ````````````````````````````````````````````````````````````````````````````````````````````
2278 2454
2279 2455 Merge:
2280 2456 - one with change to a file (d)
2281 2457 - one overwriting that file with a rename (from h to i, to d)
2282 2458
2283 2459 This case is similar to BF/FB, but an actual merge happens, so both side of the
2284 2460 history are relevant.
2285 2461
2286 2462
2287 2463 $ hg log -G --rev '::(desc("mGFm")+desc("mFGm"))'
2288 2464 o mGFm-0 merge - G side: content change, F side: copy overwrite, no content change - the other way
2289 2465 |\
2290 2466 +---o mFGm-0 merge - G side: content change, F side: copy overwrite, no content change - one way
2291 2467 | |/
2292 2468 | o g-1: update d
2293 2469 | |
2294 2470 o | f-2: rename i -> d
2295 2471 | |
2296 2472 o | f-1: rename h -> i
2297 2473 |/
2298 2474 o i-2: c -move-> d, s -move-> t
2299 2475 |
2300 2476 o i-1: a -move-> c, p -move-> s
2301 2477 |
2302 2478 o i-0 initial commit: a b h
2303 2479
2304 2480
2305 2481 Note:
2306 2482 | In this case, the merge get conflicting information since on one side we have
2307 2483 | "a -> c -> d". and one the other one we have "h -> i -> d".
2308 2484 |
2309 2485 | The current code arbitrarily pick one side depending the ordering of the merged hash:
2310 2486
2311 2487 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"):
2312 2488
2313 2489 Details on this hash ordering pick:
2314 2490
2315 2491 $ hg manifest --debug 'desc("g-1")' | egrep 'd$'
2316 2492 17ec97e605773eb44a117d1136b3849bcdc1924f 644 d (no-changeset !)
2317 2493 5cce88bf349f7c742bb440f2c53f81db9c294279 644 d (changeset !)
2318 2494 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("g-1")' d
2319 2495 A d
2320 2496 a (no-changeset no-compatibility !)
2321 2497
2322 2498 $ hg manifest --debug 'desc("f-2")' | egrep 'd$'
2323 2499 7b79e2fe0c8924e0e598a82f048a7b024afa4d96 644 d (no-changeset !)
2324 2500 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 d (changeset !)
2325 2501 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("f-2")' d
2326 2502 A d
2327 2503 h (no-changeset no-compatibility !)
2328 2504
2329 2505 Copy tracing data on the resulting merge:
2330 2506
2331 2507 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mFGm-0")'
2332 2508 A d
2333 2509 h (no-filelog !)
2334 2510 a (filelog !)
2335 2511 A t
2336 2512 p
2337 2513 R a
2338 2514 R h
2339 2515 R p
2340 2516 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGFm-0")'
2341 2517 A d
2342 2518 a (no-changeset !)
2343 2519 h (changeset !)
2344 2520 A t
2345 2521 p
2346 2522 R a
2347 2523 R h
2348 2524 R p
2349 2525 $ hg status --copies --rev 'desc("f-2")' --rev 'desc("mFGm-0")'
2350 2526 M d
2351 2527 $ hg status --copies --rev 'desc("f-2")' --rev 'desc("mGFm-0")'
2352 2528 M d
2353 2529 $ hg status --copies --rev 'desc("f-1")' --rev 'desc("mFGm-0")'
2354 2530 M d
2355 2531 i (no-filelog !)
2356 2532 R i
2357 2533 $ hg status --copies --rev 'desc("f-1")' --rev 'desc("mGFm-0")'
2358 2534 M d
2359 2535 i (no-filelog !)
2360 2536 R i
2361 2537 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mFGm-0")'
2362 2538 M d (no-changeset !)
2363 2539 h (no-filelog no-changeset !)
2364 2540 R h
2365 2541 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mGFm-0")'
2366 2542 M d (no-changeset !)
2367 2543 h (no-filelog no-changeset !)
2368 2544 R h
2369 2545
2370 2546 #if no-changeset
2371 2547 $ hg log -Gfr 'desc("mFGm-0")' d
2372 2548 o mFGm-0 merge - G side: content change, F side: copy overwrite, no content change - one way
2373 2549 |\
2374 2550 | o g-1: update d
2375 2551 | |
2376 2552 o | f-2: rename i -> d
2377 2553 | |
2378 2554 o | f-1: rename h -> i
2379 2555 |/
2380 2556 o i-2: c -move-> d, s -move-> t
2381 2557 |
2382 2558 o i-1: a -move-> c, p -move-> s
2383 2559 |
2384 2560 o i-0 initial commit: a b h
2385 2561
2386 2562 #else
2387 2563 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2388 2564 $ hg log -Gfr 'desc("mFGm-0")' d
2389 2565 o g-1: update d
2390 2566 |
2391 2567 o i-2: c -move-> d, s -move-> t
2392 2568 |
2393 2569 ~
2394 2570 #endif
2395 2571
2396 2572 #if no-changeset
2397 2573 $ hg log -Gfr 'desc("mGFm-0")' d
2398 2574 o mGFm-0 merge - G side: content change, F side: copy overwrite, no content change - the other way
2399 2575 |\
2400 2576 | o g-1: update d
2401 2577 | |
2402 2578 o | f-2: rename i -> d
2403 2579 | |
2404 2580 o | f-1: rename h -> i
2405 2581 |/
2406 2582 o i-2: c -move-> d, s -move-> t
2407 2583 |
2408 2584 o i-1: a -move-> c, p -move-> s
2409 2585 |
2410 2586 o i-0 initial commit: a b h
2411 2587
2412 2588 #else
2413 2589 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2414 2590 $ hg log -Gfr 'desc("mGFm-0")' d
2415 2591 o g-1: update d
2416 2592 |
2417 2593 o i-2: c -move-> d, s -move-> t
2418 2594 |
2419 2595 ~
2420 2596 #endif
2421 2597
2422 2598 Subcase: new copy information on both side with an actual merge happening
2423 2599 `````````````````````````````````````````````````````````````````````````
2424 2600
2425 2601 - the "p-" branch renaming 't' to 'v' (through 'u')
2426 2602 - the "q-" branch renaming 'r' to 'v' (through 'w')
2427 2603
2428 2604
2429 2605 $ hg log -G --rev '::(desc("mPQm")+desc("mQPm"))'
2430 2606 o mQPm-0 merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content) - the other way
2431 2607 |\
2432 2608 +---o mPQm-0 merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content) - one way
2433 2609 | |/
2434 2610 | o q-2 w -move-> v
2435 2611 | |
2436 2612 | o q-1 r -move-> w
2437 2613 | |
2438 2614 o | p-2: u -move-> v
2439 2615 | |
2440 2616 o | p-1: t -move-> u
2441 2617 |/
2442 2618 o i-2: c -move-> d, s -move-> t
2443 2619 |
2444 2620 o i-1: a -move-> c, p -move-> s
2445 2621 |
2446 2622 o i-0 initial commit: a b h
2447 2623
2448 2624
2449 2625 #if no-changeset
2450 2626 $ hg manifest --debug --rev 'desc("mPQm-0")' | grep '644 v'
2451 2627 0946c662ef16e4e67397fd717389eb6693d41749 644 v
2452 2628 $ hg manifest --debug --rev 'desc("mQPm-0")' | grep '644 v'
2453 2629 0db3aad7fcc1ec27fab57060e327b9e864ea0cc9 644 v
2454 2630 $ hg manifest --debug --rev 'desc("p-2")' | grep '644 v'
2455 2631 3f91841cd75cadc9a1f1b4e7c1aa6d411f76032e 644 v
2456 2632 $ hg manifest --debug --rev 'desc("q-2")' | grep '644 v'
2457 2633 c43c088b811fd27983c0a9aadf44f3343cd4cd7e 644 v
2458 2634 $ hg debugindex v | ../no-linkrev
2459 2635 rev linkrev nodeid p1 p2
2460 2636 0 * 3f91841cd75c 000000000000 000000000000
2461 2637 1 * c43c088b811f 000000000000 000000000000
2462 2638 2 * 0946c662ef16 3f91841cd75c c43c088b811f
2463 2639 3 * 0db3aad7fcc1 c43c088b811f 3f91841cd75c
2464 2640 #else
2465 2641 $ hg manifest --debug --rev 'desc("mPQm-0")' | grep '644 v'
2466 2642 65fde9f6e4d4da23b3f610e07b53673ea9541d75 644 v
2467 2643 $ hg manifest --debug --rev 'desc("mQPm-0")' | grep '644 v'
2468 2644 a098dda6413aecf154eefc976afc38b295acb7e5 644 v
2469 2645 $ hg manifest --debug --rev 'desc("p-2")' | grep '644 v'
2470 2646 5aed6a8dbff0301328c08360d24354d3d064cf0d 644 v
2471 2647 $ hg manifest --debug --rev 'desc("q-2")' | grep '644 v'
2472 2648 a38b2fa170219750dac9bc7d19df831f213ba708 644 v
2473 2649 $ hg debugindex v | ../no-linkrev
2474 2650 rev linkrev nodeid p1 p2
2475 2651 0 * 5aed6a8dbff0 000000000000 000000000000
2476 2652 1 * a38b2fa17021 000000000000 000000000000
2477 2653 2 * 65fde9f6e4d4 5aed6a8dbff0 a38b2fa17021
2478 2654 3 * a098dda6413a a38b2fa17021 5aed6a8dbff0
2479 2655 #endif
2480 2656
2481 2657 # Here the filelog based implementation is not looking at the rename
2482 2658 # information (because the file exist on both side). However the changelog
2483 2659 # based on works fine. We have different output.
2484 2660
2485 2661 $ hg status --copies --rev 'desc("p-2")' --rev 'desc("mPQm-0")'
2486 2662 M v
2487 2663 r (no-filelog !)
2488 2664 R r
2489 2665 $ hg status --copies --rev 'desc("p-2")' --rev 'desc("mQPm-0")'
2490 2666 M v
2491 2667 r (no-filelog !)
2492 2668 R r
2493 2669 $ hg status --copies --rev 'desc("q-2")' --rev 'desc("mPQm-0")'
2494 2670 M v
2495 2671 t (no-filelog !)
2496 2672 R t
2497 2673 $ hg status --copies --rev 'desc("q-2")' --rev 'desc("mQPm-0")'
2498 2674 M v
2499 2675 t (no-filelog !)
2500 2676 R t
2501 2677 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("p-2")'
2502 2678 A v
2503 2679 t
2504 2680 R t
2505 2681 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("q-2")'
2506 2682 A v
2507 2683 r
2508 2684 R r
2509 2685
2510 2686 # From here, we run status against revision where both source file exists.
2511 2687 #
2512 2688 # The filelog based implementation picks an arbitrary side based on revision
2513 2689 # numbers. So the same side "wins" whatever the parents order is. This is
2514 2690 # sub-optimal because depending on revision numbers means the result can be
2515 2691 # different from one repository to the next.
2516 2692 #
2517 2693 # The changeset based algorithm use the parent order to break tie on conflicting
2518 2694 # information and will have a different order depending on who is p1 and p2.
2519 2695 # That order is stable accross repositories. (data from p1 prevails)
2520 2696
2521 2697 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mPQm-0")'
2522 2698 A v
2523 2699 t
2524 2700 R r
2525 2701 R t
2526 2702 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mQPm-0")'
2527 2703 A v
2528 2704 t (filelog !)
2529 2705 r (no-filelog !)
2530 2706 R r
2531 2707 R t
2532 2708 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mPQm-0")'
2533 2709 A d
2534 2710 a
2535 2711 A v
2536 2712 r (filelog !)
2537 2713 p (no-filelog !)
2538 2714 R a
2539 2715 R p
2540 2716 R r
2541 2717 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mQPm-0")'
2542 2718 A d
2543 2719 a
2544 2720 A v
2545 2721 r
2546 2722 R a
2547 2723 R p
2548 2724 R r
2549 2725
2550 2726
2551 2727 Comparing with merging with a deletion (and keeping the file)
2552 2728 -------------------------------------------------------------
2553 2729
2554 2730 Merge:
2555 2731 - one removing a file (d)
2556 2732 - one updating that file
2557 2733 - the merge keep the modified version of the file (canceling the delete)
2558 2734
2559 2735 In this case, the file keep on living after the merge. So we should not drop its
2560 2736 copy tracing chain.
2561 2737
2562 2738 $ hg log -G --rev '::(desc("mCGm")+desc("mGCm"))'
2563 2739 o mGCm-0 merge updated/deleted - revive the file (updated content) - the other way
2564 2740 |\
2565 2741 +---o mCGm-0 merge updated/deleted - revive the file (updated content) - one way
2566 2742 | |/
2567 2743 | o g-1: update d
2568 2744 | |
2569 2745 o | c-1 delete d
2570 2746 |/
2571 2747 o i-2: c -move-> d, s -move-> t
2572 2748 |
2573 2749 o i-1: a -move-> c, p -move-> s
2574 2750 |
2575 2751 o i-0 initial commit: a b h
2576 2752
2577 2753
2578 2754 'a' is the copy source of 'd'
2579 2755
2580 2756 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCGm-0")'
2581 2757 A d
2582 2758 a (no-compatibility no-changeset !)
2583 2759 A t
2584 2760 p
2585 2761 R a
2586 2762 R p
2587 2763 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGCm-0")'
2588 2764 A d
2589 2765 a (no-compatibility no-changeset !)
2590 2766 A t
2591 2767 p
2592 2768 R a
2593 2769 R p
2594 2770 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCGm-0")'
2595 2771 A d
2596 2772 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mGCm-0")'
2597 2773 A d
2598 2774 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mCGm-0")'
2599 2775 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mGCm-0")'
2600 2776
2601 2777
2602 2778 Comparing with merge restoring an untouched deleted file
2603 2779 --------------------------------------------------------
2604 2780
2605 2781 Merge:
2606 2782 - one removing a file (d)
2607 2783 - one leaving the file untouched
2608 2784 - the merge actively restore the file to the same content.
2609 2785
2610 2786 In this case, the file keep on living after the merge. So we should not drop its
2611 2787 copy tracing chain.
2612 2788
2613 2789 $ hg log -G --rev '::(desc("mCB-revert-m")+desc("mBC-revert-m"))'
2614 2790 o mBC-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - the other way
2615 2791 |\
2616 2792 +---o mCB-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - one way
2617 2793 | |/
2618 2794 | o c-1 delete d
2619 2795 | |
2620 2796 o | b-1: b update
2621 2797 |/
2622 2798 o i-2: c -move-> d, s -move-> t
2623 2799 |
2624 2800 o i-1: a -move-> c, p -move-> s
2625 2801 |
2626 2802 o i-0 initial commit: a b h
2627 2803
2628 2804
2629 2805 'a' is the the copy source of 'd'
2630 2806
2631 2807 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCB-revert-m-0")'
2632 2808 M b
2633 2809 A d
2634 2810 a (no-compatibility no-changeset !)
2635 2811 A t
2636 2812 p
2637 2813 R a
2638 2814 R p
2639 2815 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBC-revert-m-0")'
2640 2816 M b
2641 2817 A d
2642 2818 a (no-compatibility no-changeset !)
2643 2819 A t
2644 2820 p
2645 2821 R a
2646 2822 R p
2647 2823 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCB-revert-m-0")'
2648 2824 M b
2649 2825 A d
2650 2826 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mBC-revert-m-0")'
2651 2827 M b
2652 2828 A d
2653 2829 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mCB-revert-m-0")'
2654 2830 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBC-revert-m-0")'
2655 2831
2656 2832
2657 2833 Merging a branch where a rename was deleted with a branch where the same file was renamed
2658 2834 ------------------------------------------------------------------------------------------
2659 2835
2660 2836 Create a "conflicting" merge where `d` get removed on one branch before its
2661 2837 rename information actually conflict with the other branch.
2662 2838
2663 2839 (the copy information from the branch that was not deleted should win).
2664 2840
2665 2841 $ hg log -G --rev '::(desc("mCH-delete-before-conflict-m")+desc("mHC-delete-before-conflict-m"))'
2666 2842 o mHC-delete-before-conflict-m-0 simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch) - the other way
2667 2843 |\
2668 2844 +---o mCH-delete-before-conflict-m-0 simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch) - one way
2669 2845 | |/
2670 2846 | o h-1: b -(move)-> d
2671 2847 | |
2672 2848 o | c-1 delete d
2673 2849 | |
2674 2850 o | i-2: c -move-> d, s -move-> t
2675 2851 | |
2676 2852 o | i-1: a -move-> c, p -move-> s
2677 2853 |/
2678 2854 o i-0 initial commit: a b h
2679 2855
2680 2856
2681 2857 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCH-delete-before-conflict-m")'
2682 2858 A d
2683 2859 b (no-compatibility no-changeset !)
2684 2860 A t
2685 2861 p
2686 2862 R a
2687 2863 R b
2688 2864 R p
2689 2865 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mHC-delete-before-conflict-m")'
2690 2866 A d
2691 2867 b
2692 2868 A t
2693 2869 p
2694 2870 R a
2695 2871 R b
2696 2872 R p
2697 2873 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCH-delete-before-conflict-m")'
2698 2874 A d
2699 2875 b
2700 2876 R b
2701 2877 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mHC-delete-before-conflict-m")'
2702 2878 A d
2703 2879 b
2704 2880 R b
2705 2881 $ hg status --copies --rev 'desc("h-1")' --rev 'desc("mCH-delete-before-conflict-m")'
2706 2882 A t
2707 2883 p
2708 2884 R a
2709 2885 R p
2710 2886 $ hg status --copies --rev 'desc("h-1")' --rev 'desc("mHC-delete-before-conflict-m")'
2711 2887 A t
2712 2888 p
2713 2889 R a
2714 2890 R p
2715 2891
2716 2892 Variant of previous with extra changes introduced by the merge
2717 2893 --------------------------------------------------------------
2718 2894
2719 2895 (see case declaration for details)
2720 2896
2721 2897 Subcase: merge has same initial content on both side, but merge introduced a change
2722 2898 ```````````````````````````````````````````````````````````````````````````````````
2723 2899
2724 2900 - the "e-" branch renaming b to f (through 'g')
2725 2901 - the "a-" branch renaming d to f (through e)
2726 2902 - the merge add new change to b
2727 2903
2728 2904 $ hg log -G --rev '::(desc("mAE-change-m")+desc("mEA-change-m"))'
2729 2905 o mEA-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - the other way
2730 2906 |\
2731 2907 +---o mAE-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - one way
2732 2908 | |/
2733 2909 | o e-2 g -move-> f
2734 2910 | |
2735 2911 | o e-1 b -move-> g
2736 2912 | |
2737 2913 o | a-2: e -move-> f
2738 2914 | |
2739 2915 o | a-1: d -move-> e
2740 2916 |/
2741 2917 o i-2: c -move-> d, s -move-> t
2742 2918 |
2743 2919 o i-1: a -move-> c, p -move-> s
2744 2920 |
2745 2921 o i-0 initial commit: a b h
2746 2922
2747 2923 #if no-changeset
2748 2924 $ hg manifest --debug --rev 'desc("mAE-change-m-0")' | grep '644 f'
2749 2925 2f649fba7eb284e720d02b61f0546fcef694c045 644 f
2750 2926 $ hg manifest --debug --rev 'desc("mEA-change-m-0")' | grep '644 f'
2751 2927 774e7c1637d536b99e2d8ef16fd731f87a82bd09 644 f
2752 2928 $ hg manifest --debug --rev 'desc("a-2")' | grep '644 f'
2753 2929 b76eb76580df486c3d51d63c5c210d4dd43a8ac7 644 f
2754 2930 $ hg manifest --debug --rev 'desc("e-2")' | grep '644 f'
2755 2931 e8825b386367b29fec957283a80bb47b47483fe1 644 f
2756 2932 $ hg debugindex f | ../no-linkrev
2757 2933 rev linkrev nodeid p1 p2
2758 2934 0 * b76eb76580df 000000000000 000000000000
2759 2935 1 * e8825b386367 000000000000 000000000000
2760 2936 2 * 2ff93c643948 b76eb76580df e8825b386367
2761 2937 3 * 2f649fba7eb2 b76eb76580df e8825b386367
2762 2938 4 * 774e7c1637d5 e8825b386367 b76eb76580df
2763 2939 #else
2764 2940 $ hg manifest --debug --rev 'desc("mAE-change-m-0")' | grep '644 f'
2765 2941 d3613c1ec8310a812ac4268fd853ac576b6caea5 644 f
2766 2942 $ hg manifest --debug --rev 'desc("mEA-change-m-0")' | grep '644 f'
2767 2943 05e03c868bbcab4a649cb33a238d7aa07398a469 644 f
2768 2944 $ hg manifest --debug --rev 'desc("a-2")' | grep '644 f'
2769 2945 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 f
2770 2946 $ hg manifest --debug --rev 'desc("e-2")' | grep '644 f'
2771 2947 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 f
2772 2948 $ hg debugindex f | ../no-linkrev
2773 2949 rev linkrev nodeid p1 p2
2774 2950 0 * ae258f702dfe 000000000000 000000000000
2775 2951 1 * d3613c1ec831 ae258f702dfe 000000000000
2776 2952 2 * 05e03c868bbc ae258f702dfe 000000000000
2777 2953 #endif
2778 2954
2779 2955 # Here the filelog based implementation is not looking at the rename
2780 2956 # information (because the file exist on both side). However the changelog
2781 2957 # based on works fine. We have different output.
2782 2958
2783 2959 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mAE-change-m-0")'
2784 2960 M f
2785 2961 b (no-filelog !)
2786 2962 R b
2787 2963 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mEA-change-m-0")'
2788 2964 M f
2789 2965 b (no-filelog !)
2790 2966 R b
2791 2967 $ hg status --copies --rev 'desc("e-2")' --rev 'desc("mAE-change-m-0")'
2792 2968 M f
2793 2969 d (no-filelog !)
2794 2970 R d
2795 2971 $ hg status --copies --rev 'desc("e-2")' --rev 'desc("mEA-change-m-0")'
2796 2972 M f
2797 2973 d (no-filelog !)
2798 2974 R d
2799 2975 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("a-2")'
2800 2976 A f
2801 2977 d
2802 2978 R d
2803 2979 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("e-2")'
2804 2980 A f
2805 2981 b
2806 2982 R b
2807 2983
2808 2984 # From here, we run status against revision where both source file exists.
2809 2985 #
2810 2986 # The filelog based implementation picks an arbitrary side based on revision
2811 2987 # numbers. So the same side "wins" whatever the parents order is. This is
2812 2988 # sub-optimal because depending on revision numbers means the result can be
2813 2989 # different from one repository to the next.
2814 2990 #
2815 2991 # The changeset based algorithm use the parent order to break tie on conflicting
2816 2992 # information and will have a different order depending on who is p1 and p2.
2817 2993 # That order is stable accross repositories. (data from p1 prevails)
2818 2994
2819 2995 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mAE-change-m-0")'
2820 2996 A f
2821 2997 d
2822 2998 R b
2823 2999 R d
2824 3000 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mEA-change-m-0")'
2825 3001 A f
2826 3002 d (filelog !)
2827 3003 b (no-filelog !)
2828 3004 R b
2829 3005 R d
2830 3006 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAE-change-m-0")'
2831 3007 A f
2832 3008 a
2833 3009 A t
2834 3010 p
2835 3011 R a
2836 3012 R b
2837 3013 R p
2838 3014 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEA-change-m-0")'
2839 3015 A f
2840 3016 a (filelog !)
2841 3017 b (no-filelog !)
2842 3018 A t
2843 3019 p
2844 3020 R a
2845 3021 R b
2846 3022 R p
2847 3023
2848 3024
2849 3025 Decision from previous merge are properly chained with later merge
2850 3026 ------------------------------------------------------------------
2851 3027
2852 3028
2853 3029 Subcase: chaining conflicting rename resolution
2854 3030 ```````````````````````````````````````````````
2855 3031
2856 3032 The "mAEm" and "mEAm" case create a rename tracking conflict on file 'f'. We
2857 3033 add more change on the respective branch and merge again. These second merge
2858 3034 does not involve the file 'f' and the arbitration done within "mAEm" and "mEA"
2859 3035 about that file should stay unchanged.
2860 3036
2861 3037 The result from mAEm is the same for the subsequent merge:
2862 3038
2863 3039 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAEm")' f
2864 3040 A f
2865 3041 a (filelog !)
2866 3042 a (sidedata !)
2867 3043 a (upgraded !)
2868 3044
2869 3045 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAE,Km")' f
2870 3046 A f
2871 3047 a (filelog !)
2872 3048 a (sidedata !)
2873 3049 a (upgraded !)
2874 3050
2875 3051 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mK,AEm")' f
2876 3052 A f
2877 3053 a (filelog !)
2878 3054 a (missing-correct-output sidedata !)
2879 3055 a (missing-correct-output upgraded !)
2880 3056 b (known-bad-output sidedata !)
2881 3057 b (known-bad-output upgraded !)
2882 3058
2883 3059
2884 3060 The result from mEAm is the same for the subsequent merge:
2885 3061
2886 3062 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEAm")' f
2887 3063 A f
2888 3064 a (filelog !)
2889 3065 b (sidedata !)
2890 3066 b (upgraded !)
2891 3067
2892 3068 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEA,Jm")' f
2893 3069 A f
2894 3070 a (filelog !)
2895 3071 b (sidedata !)
2896 3072 b (upgraded !)
2897 3073
2898 3074 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mJ,EAm")' f
2899 3075 A f
2900 3076 a (filelog !)
2901 3077 b (missing-correct-output sidedata !)
2902 3078 b (missing-correct-output upgraded !)
2903 3079 a (known-bad-output sidedata !)
2904 3080 a (known-bad-output upgraded !)
2905 3081
2906 3082
2907 3083 Subcase: chaining salvage information during a merge
2908 3084 ````````````````````````````````````````````````````
2909 3085
2910 3086 We add more change on the branch were the file was deleted. merging again
2911 3087 should preserve the fact eh file was salvaged.
2912 3088
2913 3089 reference output:
2914 3090
2915 3091 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCB-revert-m-0")'
2916 3092 M b
2917 3093 A d
2918 3094 a (filelog !)
2919 3095 a (sidedata !)
2920 3096 a (upgraded !)
2921 3097 A t
2922 3098 p
2923 3099 R a
2924 3100 R p
2925 3101 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBC-revert-m-0")'
2926 3102 M b
2927 3103 A d
2928 3104 a (filelog !)
2929 3105 a (sidedata !)
2930 3106 a (upgraded !)
2931 3107 A t
2932 3108 p
2933 3109 R a
2934 3110 R p
2935 3111
2936 3112 chained output
2937 3113
2938 3114 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBC+revert,Lm")'
2939 3115 M b
2940 3116 A d
2941 3117 a (filelog !)
2942 3118 a (missing-correct-output sidedata !)
2943 3119 a (missing-correct-output upgraded !)
2944 3120 A t
2945 3121 p
2946 3122 A unrelated-l
2947 3123 R a
2948 3124 R p
2949 3125 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCB+revert,Lm")'
2950 3126 M b
2951 3127 A d
2952 3128 a (filelog !)
2953 3129 a (missing-correct-output sidedata !)
2954 3130 a (missing-correct-output upgraded !)
2955 3131 A t
2956 3132 p
2957 3133 A unrelated-l
2958 3134 R a
2959 3135 R p
2960 3136 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mL,BC+revertm")'
2961 3137 M b
2962 3138 A d
2963 3139 a (filelog !)
2964 3140 a (missing-correct-output sidedata !)
2965 3141 a (missing-correct-output upgraded !)
2966 3142 A t
2967 3143 p
2968 3144 A unrelated-l
2969 3145 R a
2970 3146 R p
2971 3147 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mL,CB+revertm")'
2972 3148 M b
2973 3149 A d
2974 3150 a (filelog !)
2975 3151 a (missing-correct-output sidedata !)
2976 3152 a (missing-correct-output upgraded !)
2977 3153 A t
2978 3154 p
2979 3155 A unrelated-l
2980 3156 R a
2981 3157 R p
2982 3158
2983 3159 Subcase: chaining "merged" information during a merge
2984 3160 ``````````````````````````````````````````````````````
2985 3161
2986 3162 When a non-rename change are merged with a copy overwrite, the merge pick the copy source from (p1) as the reference. We should preserve this information in subsequent merges.
2987 3163
2988 3164
2989 3165 reference output:
2990 3166
2991 3167 (for details about the filelog pick, check the mFGm/mGFm case)
2992 3168
2993 3169 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mFGm")' d
2994 3170 A d
2995 3171 a (filelog !)
2996 3172 h (sidedata !)
2997 3173 h (upgraded !)
2998 3174 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGFm")' d
2999 3175 A d
3000 3176 a (filelog !)
3001 3177 a (sidedata !)
3002 3178 a (upgraded !)
3003 3179
3004 3180 Chained output
3005 3181
3006 3182 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mO,FGm")' d
3007 3183 A d
3008 3184 a (filelog !)
3009 3185 h (sidedata !)
3010 3186 h (upgraded !)
3011 3187 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mFG,Om")' d
3012 3188 A d
3013 3189 a (filelog !)
3014 3190 h (sidedata !)
3015 3191 h (upgraded !)
3016 3192
3017 3193
3018 3194 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGF,Nm")' d
3019 3195 A d
3020 3196 a (filelog !)
3021 3197 a (missing-correct-output sidedata !)
3022 3198 a (missing-correct-output upgraded !)
3023 3199 h (known-bad-output sidedata !)
3024 3200 h (known-bad-output upgraded !)
3025 3201 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mN,GFm")' d
3026 3202 A d
3027 3203 a (filelog !)
3028 3204 a (missing-correct-output sidedata !)
3029 3205 a (missing-correct-output upgraded !)
3030 3206 h (known-bad-output sidedata !)
3031 3207 h (known-bad-output upgraded !)
3032 3208
3033 3209
3034 3210 Subcase: chaining conflicting rename resolution, with extra change during the merge
3035 3211 ```````````````````````````````````````````````````````````````````````````````````
3036 3212
3037 3213 The "mAEm" and "mEAm" case create a rename tracking conflict on file 'f'. We
3038 3214 add more change on the respective branch and merge again. These second merge
3039 3215 does not involve the file 'f' and the arbitration done within "mAEm" and "mEA"
3040 3216 about that file should stay unchanged.
3041 3217
3042 3218 The result from mAEm is the same for the subsequent merge:
3043 3219
3044 3220 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAE-change-m")' f
3045 3221 A f
3046 3222 a (filelog !)
3047 3223 a (sidedata !)
3048 3224 a (upgraded !)
3049 3225
3050 3226 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAE-change,Km")' f
3051 3227 A f
3052 3228 a (filelog !)
3053 3229 a (sidedata !)
3054 3230 a (upgraded !)
3055 3231
3056 3232 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mK,AE-change-m")' f
3057 3233 A f
3058 3234 a (filelog !)
3059 3235 a (missing-correct-output sidedata !)
3060 3236 a (missing-correct-output upgraded !)
3061 3237 b (known-bad-output sidedata !)
3062 3238 b (known-bad-output upgraded !)
3063 3239
3064 3240
3065 3241 The result from mEAm is the same for the subsequent merge:
3066 3242
3067 3243 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEA-change-m")' f
3068 3244 A f
3069 3245 a (filelog !)
3070 3246 b (sidedata !)
3071 3247 b (upgraded !)
3072 3248
3073 3249 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEA-change,Jm")' f
3074 3250 A f
3075 3251 a (filelog !)
3076 3252 b (sidedata !)
3077 3253 b (upgraded !)
3078 3254
3079 3255 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mJ,EA-change-m")' f
3080 3256 A f
3081 3257 a (filelog !)
3082 3258 b (missing-correct-output sidedata !)
3083 3259 b (missing-correct-output upgraded !)
3084 3260 a (known-bad-output sidedata !)
3085 3261 a (known-bad-output upgraded !)
General Comments 0
You need to be logged in to leave comments. Login now