tests/test-copies-chain-merge.t
changeset 46559 a1273bea99cc
parent 46558 eb60dadd1be1
child 46560 c7baff95808c
equal deleted inserted replaced
46558:eb60dadd1be1 46559:a1273bea99cc
   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
  1431   ##### revision "mEAm-0 merge with copies info on both side - A side" #####
  1476   ##### revision "mEAm-0 merge with copies info on both side - A side" #####
  1432   1 sidedata entries
  1477   1 sidedata entries
  1433    entry-0014 size 14
  1478    entry-0014 size 14
  1434     '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00f'
  1479     '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00f'
  1435   merged     : f, ;
  1480   merged     : f, ;
       
  1481   ##### revision "mPQm-0 merge with copies info on both side - P side" #####
       
  1482   1 sidedata entries
       
  1483    entry-0014 size 14
       
  1484     '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00v'
       
  1485   merged     : v, ;
       
  1486   ##### revision "mQPm-0 merge with copies info on both side - P side" #####
       
  1487   1 sidedata entries
       
  1488    entry-0014 size 14
       
  1489     '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00v'
       
  1490   merged     : v, ;
  1436   ##### revision "f-1" #####
  1491   ##### revision "f-1" #####
  1437   1 sidedata entries
  1492   1 sidedata entries
  1438    entry-0014 size 24
  1493    entry-0014 size 24
  1439     '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00hi'
  1494     '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00hi'
  1440   removed    : h, ;
  1495   removed    : h, ;
  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: