##// END OF EJS Templates
amend: support amending merge changesets (issue3778)
Brodie Rao -
r18909:3a72c89a default
parent child Browse files
Show More
@@ -1660,7 +1660,13 b' def amend(ui, repo, commitfunc, old, ext'
1660 # Also update it from the intermediate commit or from the wctx
1660 # Also update it from the intermediate commit or from the wctx
1661 extra.update(ctx.extra())
1661 extra.update(ctx.extra())
1662
1662
1663 files = set(old.files())
1663 if len(old.parents()) > 1:
1664 # ctx.files() isn't reliable for merges, so fall back to the
1665 # slower repo.status() method
1666 files = set([fn for st in repo.status(base, old)[:3]
1667 for fn in st])
1668 else:
1669 files = set(old.files())
1664
1670
1665 # Second, we use either the commit we just did, or if there were no
1671 # Second, we use either the commit we just did, or if there were no
1666 # changes the parent of the working directory as the version of the
1672 # changes the parent of the working directory as the version of the
@@ -1725,7 +1731,7 b' def amend(ui, repo, commitfunc, old, ext'
1725 extra['amend_source'] = old.hex()
1731 extra['amend_source'] = old.hex()
1726
1732
1727 new = context.memctx(repo,
1733 new = context.memctx(repo,
1728 parents=[base.node(), nullid],
1734 parents=[base.node(), old.p2().node()],
1729 text=message,
1735 text=message,
1730 files=files,
1736 files=files,
1731 filectxfn=filectxfn,
1737 filectxfn=filectxfn,
@@ -1315,8 +1315,6 b' def commit(ui, repo, *pats, **opts):'
1315 old = repo['.']
1315 old = repo['.']
1316 if old.phase() == phases.public:
1316 if old.phase() == phases.public:
1317 raise util.Abort(_('cannot amend public changesets'))
1317 raise util.Abort(_('cannot amend public changesets'))
1318 if len(old.parents()) > 1:
1319 raise util.Abort(_('cannot amend merge changesets'))
1320 if len(repo[None].parents()) > 1:
1318 if len(repo[None].parents()) > 1:
1321 raise util.Abort(_('cannot amend while merging'))
1319 raise util.Abort(_('cannot amend while merging'))
1322 if (not obsolete._enabled) and old.children():
1320 if (not obsolete._enabled) and old.children():
@@ -304,7 +304,7 b' Same thing, different code path:'
304 $ hg branches
304 $ hg branches
305 default 2:ce12b0b57d46
305 default 2:ce12b0b57d46
306
306
307 Refuse to amend merges:
307 Refuse to amend during a merge:
308
308
309 $ hg up -q default
309 $ hg up -q default
310 $ hg merge foo
310 $ hg merge foo
@@ -314,9 +314,6 b' Refuse to amend merges:'
314 abort: cannot amend while merging
314 abort: cannot amend while merging
315 [255]
315 [255]
316 $ hg ci -m 'merge'
316 $ hg ci -m 'merge'
317 $ hg ci --amend
318 abort: cannot amend merge changesets
319 [255]
320
317
321 Follow copies/renames:
318 Follow copies/renames:
322
319
@@ -518,3 +515,231 b' Test that rewriting leaving instability '
518 date: Thu Jan 01 00:00:00 1970 +0000
515 date: Thu Jan 01 00:00:00 1970 +0000
519 summary: babar
516 summary: babar
520
517
518
519 Amend a merge changeset (with renames and conflicts from the second parent):
520
521 $ hg up -q default
522 $ hg branch -q bar
523 $ hg cp a aa
524 $ hg mv z zz
525 $ echo cc > cc
526 $ hg add cc
527 $ hg ci -m aazzcc
528 $ hg up -q default
529 $ echo a >> a
530 $ echo dd > cc
531 $ hg add cc
532 $ hg ci -m aa
533 $ hg merge -q bar
534 warning: conflicts during merge.
535 merging cc incomplete! (edit conflicts, then use 'hg resolve --mark')
536 [1]
537 $ hg resolve -m cc
538 $ hg ci -m 'merge bar'
539 $ hg log --config diff.git=1 -pr .
540 changeset: 23:d51446492733
541 tag: tip
542 parent: 22:30d96aeaf27b
543 parent: 21:1aa437659d19
544 user: test
545 date: Thu Jan 01 00:00:00 1970 +0000
546 summary: merge bar
547
548 diff --git a/a b/aa
549 copy from a
550 copy to aa
551 diff --git a/cc b/cc
552 --- a/cc
553 +++ b/cc
554 @@ -1,1 +1,5 @@
555 +<<<<<<< local
556 dd
557 +=======
558 +cc
559 +>>>>>>> other
560 diff --git a/z b/zz
561 rename from z
562 rename to zz
563
564 $ hg debugrename aa
565 aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
566 $ hg debugrename zz
567 zz renamed from z:69a1b67522704ec122181c0890bd16e9d3e7516a
568 $ hg debugrename cc
569 cc not renamed
570 $ hg ci --amend -m 'merge bar (amend message)'
571 $ hg log --config diff.git=1 -pr .
572 changeset: 24:59de3dce7a79
573 tag: tip
574 parent: 22:30d96aeaf27b
575 parent: 21:1aa437659d19
576 user: test
577 date: Thu Jan 01 00:00:00 1970 +0000
578 summary: merge bar (amend message)
579
580 diff --git a/a b/aa
581 copy from a
582 copy to aa
583 diff --git a/cc b/cc
584 --- a/cc
585 +++ b/cc
586 @@ -1,1 +1,5 @@
587 +<<<<<<< local
588 dd
589 +=======
590 +cc
591 +>>>>>>> other
592 diff --git a/z b/zz
593 rename from z
594 rename to zz
595
596 $ hg debugrename aa
597 aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
598 $ hg debugrename zz
599 zz renamed from z:69a1b67522704ec122181c0890bd16e9d3e7516a
600 $ hg debugrename cc
601 cc not renamed
602 $ hg mv zz z
603 $ hg ci --amend -m 'merge bar (undo rename)'
604 $ hg log --config diff.git=1 -pr .
605 changeset: 26:7fb89c461f81
606 tag: tip
607 parent: 22:30d96aeaf27b
608 parent: 21:1aa437659d19
609 user: test
610 date: Thu Jan 01 00:00:00 1970 +0000
611 summary: merge bar (undo rename)
612
613 diff --git a/a b/aa
614 copy from a
615 copy to aa
616 diff --git a/cc b/cc
617 --- a/cc
618 +++ b/cc
619 @@ -1,1 +1,5 @@
620 +<<<<<<< local
621 dd
622 +=======
623 +cc
624 +>>>>>>> other
625
626 $ hg debugrename z
627 z not renamed
628
629 Amend a merge changeset (with renames during the merge):
630
631 $ hg up -q bar
632 $ echo x > x
633 $ hg add x
634 $ hg ci -m x
635 $ hg up -q default
636 $ hg merge -q bar
637 $ hg mv aa aaa
638 $ echo aa >> aaa
639 $ hg ci -m 'merge bar again'
640 $ hg log --config diff.git=1 -pr .
641 changeset: 28:982d7a34ffee
642 tag: tip
643 parent: 26:7fb89c461f81
644 parent: 27:4c94d5bc65f5
645 user: test
646 date: Thu Jan 01 00:00:00 1970 +0000
647 summary: merge bar again
648
649 diff --git a/aa b/aa
650 deleted file mode 100644
651 --- a/aa
652 +++ /dev/null
653 @@ -1,2 +0,0 @@
654 -a
655 -a
656 diff --git a/aaa b/aaa
657 new file mode 100644
658 --- /dev/null
659 +++ b/aaa
660 @@ -0,0 +1,3 @@
661 +a
662 +a
663 +aa
664 diff --git a/x b/x
665 new file mode 100644
666 --- /dev/null
667 +++ b/x
668 @@ -0,0 +1,1 @@
669 +x
670
671 $ hg debugrename aaa
672 aaa renamed from aa:37d9b5d994eab34eda9c16b195ace52c7b129980
673 $ hg mv aaa aa
674 $ hg ci --amend -m 'merge bar again (undo rename)'
675 $ hg log --config diff.git=1 -pr .
676 changeset: 30:522688c0e71b
677 tag: tip
678 parent: 26:7fb89c461f81
679 parent: 27:4c94d5bc65f5
680 user: test
681 date: Thu Jan 01 00:00:00 1970 +0000
682 summary: merge bar again (undo rename)
683
684 diff --git a/aa b/aa
685 --- a/aa
686 +++ b/aa
687 @@ -1,2 +1,3 @@
688 a
689 a
690 +aa
691 diff --git a/x b/x
692 new file mode 100644
693 --- /dev/null
694 +++ b/x
695 @@ -0,0 +1,1 @@
696 +x
697
698 $ hg debugrename aa
699 aa not renamed
700 $ hg debugrename -r .^ aa
701 aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
702
703 Amend a merge changeset (with manifest-level conflicts):
704
705 $ hg up -q bar
706 $ hg rm aa
707 $ hg ci -m 'rm aa'
708 $ hg up -q default
709 $ echo aa >> aa
710 $ hg ci -m aa
711 $ hg merge -q bar
712 local changed aa which remote deleted
713 use (c)hanged version or (d)elete? c
714 $ hg ci -m 'merge bar (with conflicts)'
715 $ hg log --config diff.git=1 -pr .
716 changeset: 33:5f9904c491b8
717 tag: tip
718 parent: 32:01780b896f58
719 parent: 31:67db8847a540
720 user: test
721 date: Thu Jan 01 00:00:00 1970 +0000
722 summary: merge bar (with conflicts)
723
724
725 $ hg rm aa
726 $ hg ci --amend -m 'merge bar (with conflicts, amended)'
727 $ hg log --config diff.git=1 -pr .
728 changeset: 35:6ce0c89781a3
729 tag: tip
730 parent: 32:01780b896f58
731 parent: 31:67db8847a540
732 user: test
733 date: Thu Jan 01 00:00:00 1970 +0000
734 summary: merge bar (with conflicts, amended)
735
736 diff --git a/aa b/aa
737 deleted file mode 100644
738 --- a/aa
739 +++ /dev/null
740 @@ -1,4 +0,0 @@
741 -a
742 -a
743 -aa
744 -aa
745
General Comments 0
You need to be logged in to leave comments. Login now