Mercurial > hg
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 |