comparison tests/test-fix.t @ 43962:eebdd6709868

fix: fix handling of merge commits by using overlayworkingctx Most of this code was conceptually copied from what rebase does, with one small difference: hgext.rebaserev.rebase uses branchmerge=True, while I had to use branchmerge=False, or else it got really confused about updating to the same revision in some situations. I believe that the difference is that rebase is always dealing with *some* form of update - it never gets to mergemod.update if the source and destination are the same, while we can encounter that situation with fix. This may imply that this code has some issues with named branches that should be investigated. Differential Revision: https://phab.mercurial-scm.org/D7703
author Kyle Lippincott <spectral@google.com>
date Wed, 18 Dec 2019 14:07:58 -0800
parents 9595b6a9f0d5
children e685fac56693
comparison
equal deleted inserted replaced
43961:b69d5f3a41d0 43962:eebdd6709868
1454 $ cat baz 1454 $ cat baz
1455 Line ranges: 1455 Line ranges:
1456 2 through 2 1456 2 through 2
1457 1457
1458 $ cd .. 1458 $ cd ..
1459
1460 Test various cases around merges. We were previously dropping files if they were
1461 created on only the p2 side of the merge, so let's test permutations of:
1462 * added, was fixed
1463 * added, considered for fixing but was already good
1464 * added, not considered for fixing
1465 * modified, was fixed
1466 * modified, considered for fixing but was already good
1467 * modified, not considered for fixing
1468
1469 Before the bug was fixed where we would drop files, this test demonstrated the
1470 following issues:
1471 * new_in_r1.ignored, new_in_r1_already_good.changed, and
1472 > mod_in_r1_already_good.changed were NOT in the manifest for the merge commit
1473 * mod_in_r1.ignored had its contents from r0, NOT r1.
1474
1475 We're also setting a named branch for every commit to demonstrate that the
1476 branch is kept intact and there aren't issues updating to another branch in the
1477 middle of fix.
1478
1479 $ hg init merge_keeps_files
1480 $ cd merge_keeps_files
1481 $ for f in r0 mod_in_r1 mod_in_r2 mod_in_merge mod_in_child; do
1482 > for c in changed whole ignored; do
1483 > printf "hello\n" > $f.$c
1484 > done
1485 > printf "HELLO\n" > "mod_in_${f}_already_good.changed"
1486 > done
1487 $ hg branch -q r0
1488 $ hg ci -Aqm 'r0'
1489 $ hg phase -p
1490 $ make_test_files() {
1491 > printf "world\n" >> "mod_in_$1.changed"
1492 > printf "world\n" >> "mod_in_$1.whole"
1493 > printf "world\n" >> "mod_in_$1.ignored"
1494 > printf "WORLD\n" >> "mod_in_$1_already_good.changed"
1495 > printf "new in $1\n" > "new_in_$1.changed"
1496 > printf "new in $1\n" > "new_in_$1.whole"
1497 > printf "new in $1\n" > "new_in_$1.ignored"
1498 > printf "ALREADY GOOD, NEW IN THIS REV\n" > "new_in_$1_already_good.changed"
1499 > }
1500 $ make_test_commit() {
1501 > make_test_files "$1"
1502 > hg branch -q "$1"
1503 > hg ci -Aqm "$2"
1504 > }
1505 $ make_test_commit r1 "merge me, pt1"
1506 $ hg co -q ".^"
1507 $ make_test_commit r2 "merge me, pt2"
1508 $ hg merge -qr 1
1509 $ make_test_commit merge "evil merge"
1510 $ make_test_commit child "child of merge"
1511 $ make_test_files wdir
1512 $ hg fix -r 'not public()' -w
1513 $ hg log -G -T'{rev}:{shortest(node,8)}: branch:{branch} desc:{desc}'
1514 @ 8:c22ce900: branch:child desc:child of merge
1515 |
1516 o 7:5a30615a: branch:merge desc:evil merge
1517 |\
1518 | o 6:4e5acdc4: branch:r2 desc:merge me, pt2
1519 | |
1520 o | 5:eea01878: branch:r1 desc:merge me, pt1
1521 |/
1522 o 0:0c548d87: branch:r0 desc:r0
1523
1524 $ hg files -r tip
1525 mod_in_child.changed
1526 mod_in_child.ignored
1527 mod_in_child.whole
1528 mod_in_child_already_good.changed
1529 mod_in_merge.changed
1530 mod_in_merge.ignored
1531 mod_in_merge.whole
1532 mod_in_merge_already_good.changed
1533 mod_in_mod_in_child_already_good.changed
1534 mod_in_mod_in_merge_already_good.changed
1535 mod_in_mod_in_r1_already_good.changed
1536 mod_in_mod_in_r2_already_good.changed
1537 mod_in_r0_already_good.changed
1538 mod_in_r1.changed
1539 mod_in_r1.ignored
1540 mod_in_r1.whole
1541 mod_in_r1_already_good.changed
1542 mod_in_r2.changed
1543 mod_in_r2.ignored
1544 mod_in_r2.whole
1545 mod_in_r2_already_good.changed
1546 new_in_child.changed
1547 new_in_child.ignored
1548 new_in_child.whole
1549 new_in_child_already_good.changed
1550 new_in_merge.changed
1551 new_in_merge.ignored
1552 new_in_merge.whole
1553 new_in_merge_already_good.changed
1554 new_in_r1.changed
1555 new_in_r1.ignored
1556 new_in_r1.whole
1557 new_in_r1_already_good.changed
1558 new_in_r2.changed
1559 new_in_r2.ignored
1560 new_in_r2.whole
1561 new_in_r2_already_good.changed
1562 r0.changed
1563 r0.ignored
1564 r0.whole
1565 $ for f in "$(hg files -r tip)"; do hg cat -r tip $f -T'{path}:\n{data}\n'; done
1566 mod_in_child.changed:
1567 hello
1568 WORLD
1569
1570 mod_in_child.ignored:
1571 hello
1572 world
1573
1574 mod_in_child.whole:
1575 HELLO
1576 WORLD
1577
1578 mod_in_child_already_good.changed:
1579 WORLD
1580
1581 mod_in_merge.changed:
1582 hello
1583 WORLD
1584
1585 mod_in_merge.ignored:
1586 hello
1587 world
1588
1589 mod_in_merge.whole:
1590 HELLO
1591 WORLD
1592
1593 mod_in_merge_already_good.changed:
1594 WORLD
1595
1596 mod_in_mod_in_child_already_good.changed:
1597 HELLO
1598
1599 mod_in_mod_in_merge_already_good.changed:
1600 HELLO
1601
1602 mod_in_mod_in_r1_already_good.changed:
1603 HELLO
1604
1605 mod_in_mod_in_r2_already_good.changed:
1606 HELLO
1607
1608 mod_in_r0_already_good.changed:
1609 HELLO
1610
1611 mod_in_r1.changed:
1612 hello
1613 WORLD
1614
1615 mod_in_r1.ignored:
1616 hello
1617 world
1618
1619 mod_in_r1.whole:
1620 HELLO
1621 WORLD
1622
1623 mod_in_r1_already_good.changed:
1624 WORLD
1625
1626 mod_in_r2.changed:
1627 hello
1628 WORLD
1629
1630 mod_in_r2.ignored:
1631 hello
1632 world
1633
1634 mod_in_r2.whole:
1635 HELLO
1636 WORLD
1637
1638 mod_in_r2_already_good.changed:
1639 WORLD
1640
1641 new_in_child.changed:
1642 NEW IN CHILD
1643
1644 new_in_child.ignored:
1645 new in child
1646
1647 new_in_child.whole:
1648 NEW IN CHILD
1649
1650 new_in_child_already_good.changed:
1651 ALREADY GOOD, NEW IN THIS REV
1652
1653 new_in_merge.changed:
1654 NEW IN MERGE
1655
1656 new_in_merge.ignored:
1657 new in merge
1658
1659 new_in_merge.whole:
1660 NEW IN MERGE
1661
1662 new_in_merge_already_good.changed:
1663 ALREADY GOOD, NEW IN THIS REV
1664
1665 new_in_r1.changed:
1666 NEW IN R1
1667
1668 new_in_r1.ignored:
1669 new in r1
1670
1671 new_in_r1.whole:
1672 NEW IN R1
1673
1674 new_in_r1_already_good.changed:
1675 ALREADY GOOD, NEW IN THIS REV
1676
1677 new_in_r2.changed:
1678 NEW IN R2
1679
1680 new_in_r2.ignored:
1681 new in r2
1682
1683 new_in_r2.whole:
1684 NEW IN R2
1685
1686 new_in_r2_already_good.changed:
1687 ALREADY GOOD, NEW IN THIS REV
1688
1689 r0.changed:
1690 hello
1691
1692 r0.ignored:
1693 hello
1694
1695 r0.whole:
1696 hello
1697