420 o i-1: a -move-> c, p -move-> s |
420 o i-1: a -move-> c, p -move-> s |
421 | |
421 | |
422 o i-0 initial commit: a b h |
422 o i-0 initial commit: a b h |
423 |
423 |
424 |
424 |
|
425 Subcase: new copy information on both side with an actual merge happening |
|
426 ````````````````````````````````````````````````````````````````````````` |
|
427 |
|
428 - the "p-" branch renaming 't' to 'v' (through 'u') |
|
429 - the "q-" branch renaming 'r' to 'v' (through 'w') |
|
430 |
|
431 $ case_desc="merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content)" |
|
432 |
|
433 $ hg up 'desc("p-2")' |
|
434 3 files updated, 0 files merged, 2 files removed, 0 files unresolved |
|
435 $ hg merge 'desc("q-2")' --tool ':union' |
|
436 merging v |
|
437 1 files updated, 0 files merged, 1 files removed, 0 files unresolved |
|
438 (branch merge, don't forget to commit) |
|
439 $ hg ci -m "mPQm-0 $case_desc - one way" |
|
440 $ hg up 'desc("q-2")' |
|
441 2 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
442 $ hg merge 'desc("p-2")' --tool ':union' |
|
443 merging v |
|
444 1 files updated, 0 files merged, 1 files removed, 0 files unresolved |
|
445 (branch merge, don't forget to commit) |
|
446 $ hg ci -m "mQPm-0 $case_desc - the other way" |
|
447 created new head |
|
448 $ hg log -G --rev '::(desc("mAEm")+desc("mEAm"))' |
|
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 |\ |
|
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 | |/ |
|
453 | o e-2 g -move-> f |
|
454 | | |
|
455 | o e-1 b -move-> g |
|
456 | | |
|
457 o | a-2: e -move-> f |
|
458 | | |
|
459 o | a-1: d -move-> e |
|
460 |/ |
|
461 o i-2: c -move-> d, s -move-> t |
|
462 | |
|
463 o i-1: a -move-> c, p -move-> s |
|
464 | |
|
465 o i-0 initial commit: a b h |
|
466 |
|
467 |
425 Subcase: existing copy information overwritten on one branch |
468 Subcase: existing copy information overwritten on one branch |
426 ```````````````````````````````````````````````````````````` |
469 ```````````````````````````````````````````````````````````` |
427 |
470 |
428 Merge: |
471 Merge: |
429 - one with change to an unrelated file (b) |
472 - one with change to an unrelated file (b) |
457 $ hg merge 'desc("b-1")' |
500 $ hg merge 'desc("b-1")' |
458 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
501 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
459 (branch merge, don't forget to commit) |
502 (branch merge, don't forget to commit) |
460 $ hg ci -m "mFBm-0 $case_desc - the other way" |
503 $ hg ci -m "mFBm-0 $case_desc - the other way" |
461 created new head |
504 created new head |
|
505 $ hg up null --quiet |
462 $ hg log -G --rev '::(desc("mBFm")+desc("mFBm"))' |
506 $ hg log -G --rev '::(desc("mBFm")+desc("mFBm"))' |
463 @ mFBm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - the other way |
507 o mFBm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - the other way |
464 |\ |
508 |\ |
465 +---o mBFm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - one way |
509 +---o mBFm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - one way |
466 | |/ |
510 | |/ |
467 | o f-2: rename i -> d |
511 | o f-2: rename i -> d |
468 | | |
512 | | |
489 consider history and rename on both branch of the merge. |
533 consider history and rename on both branch of the merge. |
490 |
534 |
491 $ case_desc="actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content" |
535 $ case_desc="actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content" |
492 |
536 |
493 $ hg up 'desc("i-2")' |
537 $ hg up 'desc("i-2")' |
494 3 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !) |
538 6 files updated, 0 files merged, 0 files removed, 0 files unresolved |
495 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !) |
|
496 $ echo "some update" >> d |
539 $ echo "some update" >> d |
497 $ hg commit -m "g-1: update d" |
540 $ hg commit -m "g-1: update d" |
498 created new head |
541 created new head |
499 $ hg up 'desc("d-2")' |
542 $ hg up 'desc("d-2")' |
500 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
543 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
1227 mK,AEm: chained merges (conflict -> simple) - same content everywhere |
1270 mK,AEm: chained merges (conflict -> simple) - same content everywhere |
1228 mL,BC+revertm: chained merges (salvaged -> simple) - same content (when the file exists) |
1271 mL,BC+revertm: chained merges (salvaged -> simple) - same content (when the file exists) |
1229 mL,CB+revertm: chained merges (salvaged -> simple) - same content (when the file exists) |
1272 mL,CB+revertm: chained merges (salvaged -> simple) - same content (when the file exists) |
1230 mN,GFm: chained merges (copy-overwrite -> simple) - same content |
1273 mN,GFm: chained merges (copy-overwrite -> simple) - same content |
1231 mO,FGm: chained merges (copy-overwrite -> simple) - same content |
1274 mO,FGm: chained merges (copy-overwrite -> simple) - same content |
|
1275 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 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 |
1232 n-1: unrelated changes (based on the "f" series of changes) |
1277 n-1: unrelated changes (based on the "f" series of changes) |
1233 o-1: unrelated changes (based on "g" changes) |
1278 o-1: unrelated changes (based on "g" changes) |
1234 p-1: t -move-> u |
1279 p-1: t -move-> u |
1235 p-2: u -move-> v |
1280 p-2: u -move-> v |
1236 q-1 r -move-> w |
1281 q-1 r -move-> w |
2362 o i-2: c -move-> d, s -move-> t |
2417 o i-2: c -move-> d, s -move-> t |
2363 | |
2418 | |
2364 ~ |
2419 ~ |
2365 #endif |
2420 #endif |
2366 |
2421 |
|
2422 Subcase: new copy information on both side with an actual merge happening |
|
2423 ````````````````````````````````````````````````````````````````````````` |
|
2424 |
|
2425 - the "p-" branch renaming 't' to 'v' (through 'u') |
|
2426 - the "q-" branch renaming 'r' to 'v' (through 'w') |
|
2427 |
|
2428 |
|
2429 $ hg log -G --rev '::(desc("mPQm")+desc("mQPm"))' |
|
2430 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 |\ |
|
2432 +---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 | |/ |
|
2434 | o q-2 w -move-> v |
|
2435 | | |
|
2436 | o q-1 r -move-> w |
|
2437 | | |
|
2438 o | p-2: u -move-> v |
|
2439 | | |
|
2440 o | p-1: t -move-> u |
|
2441 |/ |
|
2442 o i-2: c -move-> d, s -move-> t |
|
2443 | |
|
2444 o i-1: a -move-> c, p -move-> s |
|
2445 | |
|
2446 o i-0 initial commit: a b h |
|
2447 |
|
2448 |
|
2449 #if no-changeset |
|
2450 $ hg manifest --debug --rev 'desc("mPQm-0")' | grep '644 v' |
|
2451 0946c662ef16e4e67397fd717389eb6693d41749 644 v |
|
2452 $ hg manifest --debug --rev 'desc("mQPm-0")' | grep '644 v' |
|
2453 0db3aad7fcc1ec27fab57060e327b9e864ea0cc9 644 v |
|
2454 $ hg manifest --debug --rev 'desc("p-2")' | grep '644 v' |
|
2455 3f91841cd75cadc9a1f1b4e7c1aa6d411f76032e 644 v |
|
2456 $ hg manifest --debug --rev 'desc("q-2")' | grep '644 v' |
|
2457 c43c088b811fd27983c0a9aadf44f3343cd4cd7e 644 v |
|
2458 $ hg debugindex v | ../no-linkrev |
|
2459 rev linkrev nodeid p1 p2 |
|
2460 0 * 3f91841cd75c 000000000000 000000000000 |
|
2461 1 * c43c088b811f 000000000000 000000000000 |
|
2462 2 * 0946c662ef16 3f91841cd75c c43c088b811f |
|
2463 3 * 0db3aad7fcc1 c43c088b811f 3f91841cd75c |
|
2464 #else |
|
2465 $ hg manifest --debug --rev 'desc("mPQm-0")' | grep '644 v' |
|
2466 65fde9f6e4d4da23b3f610e07b53673ea9541d75 644 v |
|
2467 $ hg manifest --debug --rev 'desc("mQPm-0")' | grep '644 v' |
|
2468 a098dda6413aecf154eefc976afc38b295acb7e5 644 v |
|
2469 $ hg manifest --debug --rev 'desc("p-2")' | grep '644 v' |
|
2470 5aed6a8dbff0301328c08360d24354d3d064cf0d 644 v |
|
2471 $ hg manifest --debug --rev 'desc("q-2")' | grep '644 v' |
|
2472 a38b2fa170219750dac9bc7d19df831f213ba708 644 v |
|
2473 $ hg debugindex v | ../no-linkrev |
|
2474 rev linkrev nodeid p1 p2 |
|
2475 0 * 5aed6a8dbff0 000000000000 000000000000 |
|
2476 1 * a38b2fa17021 000000000000 000000000000 |
|
2477 2 * 65fde9f6e4d4 5aed6a8dbff0 a38b2fa17021 |
|
2478 3 * a098dda6413a a38b2fa17021 5aed6a8dbff0 |
|
2479 #endif |
|
2480 |
|
2481 # Here the filelog based implementation is not looking at the rename |
|
2482 # information (because the file exist on both side). However the changelog |
|
2483 # based on works fine. We have different output. |
|
2484 |
|
2485 $ hg status --copies --rev 'desc("p-2")' --rev 'desc("mPQm-0")' |
|
2486 M v |
|
2487 r (no-filelog !) |
|
2488 R r |
|
2489 $ hg status --copies --rev 'desc("p-2")' --rev 'desc("mQPm-0")' |
|
2490 M v |
|
2491 r (no-filelog !) |
|
2492 R r |
|
2493 $ hg status --copies --rev 'desc("q-2")' --rev 'desc("mPQm-0")' |
|
2494 M v |
|
2495 t (no-filelog !) |
|
2496 R t |
|
2497 $ hg status --copies --rev 'desc("q-2")' --rev 'desc("mQPm-0")' |
|
2498 M v |
|
2499 t (no-filelog !) |
|
2500 R t |
|
2501 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("p-2")' |
|
2502 A v |
|
2503 t |
|
2504 R t |
|
2505 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("q-2")' |
|
2506 A v |
|
2507 r |
|
2508 R r |
|
2509 |
|
2510 # From here, we run status against revision where both source file exists. |
|
2511 # |
|
2512 # The filelog based implementation picks an arbitrary side based on revision |
|
2513 # numbers. So the same side "wins" whatever the parents order is. This is |
|
2514 # sub-optimal because depending on revision numbers means the result can be |
|
2515 # different from one repository to the next. |
|
2516 # |
|
2517 # The changeset based algorithm use the parent order to break tie on conflicting |
|
2518 # information and will have a different order depending on who is p1 and p2. |
|
2519 # That order is stable accross repositories. (data from p1 prevails) |
|
2520 |
|
2521 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mPQm-0")' |
|
2522 A v |
|
2523 t |
|
2524 R r |
|
2525 R t |
|
2526 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mQPm-0")' |
|
2527 A v |
|
2528 t (filelog !) |
|
2529 r (no-filelog !) |
|
2530 R r |
|
2531 R t |
|
2532 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mPQm-0")' |
|
2533 A d |
|
2534 a |
|
2535 A v |
|
2536 r (filelog !) |
|
2537 p (no-filelog !) |
|
2538 R a |
|
2539 R p |
|
2540 R r |
|
2541 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mQPm-0")' |
|
2542 A d |
|
2543 a |
|
2544 A v |
|
2545 r |
|
2546 R a |
|
2547 R p |
|
2548 R r |
|
2549 |
2367 |
2550 |
2368 Comparing with merging with a deletion (and keeping the file) |
2551 Comparing with merging with a deletion (and keeping the file) |
2369 ------------------------------------------------------------- |
2552 ------------------------------------------------------------- |
2370 |
2553 |
2371 Merge: |
2554 Merge: |