583 # commit is completely done. On InterventionRequired, we thus |
583 # commit is completely done. On InterventionRequired, we thus |
584 # won't store the status. Instead, we'll hit the "len(parents) == 2" |
584 # won't store the status. Instead, we'll hit the "len(parents) == 2" |
585 # case and realize that the commit was in progress. |
585 # case and realize that the commit was in progress. |
586 self.storestatus() |
586 self.storestatus() |
587 |
587 |
588 def _finishrebase(self): |
588 def _finishrebase(self, backup=True): |
|
589 """ |
|
590 backup: if False, no backup will be stored when stripping rebased |
|
591 revisions |
|
592 """ |
589 repo, ui, opts = self.repo, self.ui, self.opts |
593 repo, ui, opts = self.repo, self.ui, self.opts |
590 fm = ui.formatter('rebase', opts) |
594 fm = ui.formatter('rebase', opts) |
591 fm.startitem() |
595 fm.startitem() |
592 if self.collapsef: |
596 if self.collapsef: |
593 p1, p2, _base = defineparents(repo, min(self.state), self.destmap, |
597 p1, p2, _base = defineparents(repo, min(self.state), self.destmap, |
630 |
634 |
631 collapsedas = None |
635 collapsedas = None |
632 if self.collapsef and not self.keepf: |
636 if self.collapsef and not self.keepf: |
633 collapsedas = newnode |
637 collapsedas = newnode |
634 clearrebased(ui, repo, self.destmap, self.state, self.skipped, |
638 clearrebased(ui, repo, self.destmap, self.state, self.skipped, |
635 collapsedas, self.keepf, fm=fm) |
639 collapsedas, self.keepf, fm=fm, backup=backup) |
636 |
640 |
637 clearstatus(repo) |
641 clearstatus(repo) |
638 clearcollapsemsg(repo) |
642 clearcollapsemsg(repo) |
639 |
643 |
640 ui.note(_("rebase completed\n")) |
644 ui.note(_("rebase completed\n")) |
827 raise error.Abort(_('--auto-orphans is incompatible with %s') % |
831 raise error.Abort(_('--auto-orphans is incompatible with %s') % |
828 ('--' + key)) |
832 ('--' + key)) |
829 userrevs = list(repo.revs(opts.get('auto_orphans'))) |
833 userrevs = list(repo.revs(opts.get('auto_orphans'))) |
830 opts['rev'] = [revsetlang.formatspec('%ld and orphan()', userrevs)] |
834 opts['rev'] = [revsetlang.formatspec('%ld and orphan()', userrevs)] |
831 opts['dest'] = '_destautoorphanrebase(SRC)' |
835 opts['dest'] = '_destautoorphanrebase(SRC)' |
|
836 backup = ui.configbool('ui', 'history-editing-backup') |
|
837 opts['backup'] = backup |
832 |
838 |
833 if dryrun: |
839 if dryrun: |
834 return _dryrunrebase(ui, repo, opts) |
840 return _dryrunrebase(ui, repo, opts) |
835 elif inmemory: |
841 elif inmemory: |
836 try: |
842 try: |
848 return _dorebase(ui, repo, opts) |
854 return _dorebase(ui, repo, opts) |
849 |
855 |
850 def _dryrunrebase(ui, repo, opts): |
856 def _dryrunrebase(ui, repo, opts): |
851 rbsrt = rebaseruntime(repo, ui, inmemory=True, opts=opts) |
857 rbsrt = rebaseruntime(repo, ui, inmemory=True, opts=opts) |
852 confirm = opts.get('confirm') |
858 confirm = opts.get('confirm') |
|
859 backup = opts.get('backup') |
853 if confirm: |
860 if confirm: |
854 ui.status(_('starting in-memory rebase\n')) |
861 ui.status(_('starting in-memory rebase\n')) |
855 else: |
862 else: |
856 ui.status(_('starting dry-run rebase; repository will not be ' |
863 ui.status(_('starting dry-run rebase; repository will not be ' |
857 'changed\n')) |
864 'changed\n')) |
869 if confirm: |
876 if confirm: |
870 ui.status(_('rebase completed successfully\n')) |
877 ui.status(_('rebase completed successfully\n')) |
871 if not ui.promptchoice(_(b'apply changes (yn)?' |
878 if not ui.promptchoice(_(b'apply changes (yn)?' |
872 b'$$ &Yes $$ &No')): |
879 b'$$ &Yes $$ &No')): |
873 # finish unfinished rebase |
880 # finish unfinished rebase |
874 rbsrt._finishrebase() |
881 rbsrt._finishrebase(backup=backup) |
875 else: |
882 else: |
876 rbsrt._prepareabortorcontinue(isabort=True, backup=False, |
883 rbsrt._prepareabortorcontinue(isabort=True, backup=False, |
877 suppwarns=True) |
884 suppwarns=True) |
878 needsabort = False |
885 needsabort = False |
879 else: |
886 else: |
900 # search default destination in this space |
907 # search default destination in this space |
901 # used in the 'hg pull --rebase' case, see issue 5214. |
908 # used in the 'hg pull --rebase' case, see issue 5214. |
902 destspace = opts.get('_destspace') |
909 destspace = opts.get('_destspace') |
903 contf = opts.get('continue') |
910 contf = opts.get('continue') |
904 abortf = opts.get('abort') |
911 abortf = opts.get('abort') |
|
912 backup = opts.get('backup') |
905 if opts.get('interactive'): |
913 if opts.get('interactive'): |
906 try: |
914 try: |
907 if extensions.find('histedit'): |
915 if extensions.find('histedit'): |
908 enablehistedit = '' |
916 enablehistedit = '' |
909 except KeyError: |
917 except KeyError: |
930 ui.warn(_('tool option will be ignored\n')) |
938 ui.warn(_('tool option will be ignored\n')) |
931 if contf: |
939 if contf: |
932 ms = mergemod.mergestate.read(repo) |
940 ms = mergemod.mergestate.read(repo) |
933 mergeutil.checkunresolved(ms) |
941 mergeutil.checkunresolved(ms) |
934 |
942 |
935 retcode = rbsrt._prepareabortorcontinue(abortf) |
943 retcode = rbsrt._prepareabortorcontinue(abortf, backup=backup) |
936 if retcode is not None: |
944 if retcode is not None: |
937 return retcode |
945 return retcode |
938 else: |
946 else: |
939 destmap = _definedestmap(ui, repo, inmemory, destf, srcf, basef, |
947 destmap = _definedestmap(ui, repo, inmemory, destf, srcf, basef, |
940 revf, destspace=destspace) |
948 revf, destspace=destspace) |
959 if singletr and not inmemory: |
967 if singletr and not inmemory: |
960 dsguard = dirstateguard.dirstateguard(repo, 'rebase') |
968 dsguard = dirstateguard.dirstateguard(repo, 'rebase') |
961 with util.acceptintervention(dsguard): |
969 with util.acceptintervention(dsguard): |
962 rbsrt._performrebase(tr) |
970 rbsrt._performrebase(tr) |
963 if not leaveunfinished: |
971 if not leaveunfinished: |
964 rbsrt._finishrebase() |
972 rbsrt._finishrebase(backup=backup) |
965 |
973 |
966 def _definedestmap(ui, repo, inmemory, destf=None, srcf=None, basef=None, |
974 def _definedestmap(ui, repo, inmemory, destf=None, srcf=None, basef=None, |
967 revf=None, destspace=None): |
975 revf=None, destspace=None): |
968 """use revisions argument to define destmap {srcrev: destrev}""" |
976 """use revisions argument to define destmap {srcrev: destrev}""" |
969 if revf is None: |
977 if revf is None: |
1726 if parents and all((state.get(p) == p for p in parents)): |
1734 if parents and all((state.get(p) == p for p in parents)): |
1727 state[rev] = rev |
1735 state[rev] = rev |
1728 return originalwd, destmap, state |
1736 return originalwd, destmap, state |
1729 |
1737 |
1730 def clearrebased(ui, repo, destmap, state, skipped, collapsedas=None, |
1738 def clearrebased(ui, repo, destmap, state, skipped, collapsedas=None, |
1731 keepf=False, fm=None): |
1739 keepf=False, fm=None, backup=True): |
1732 """dispose of rebased revision at the end of the rebase |
1740 """dispose of rebased revision at the end of the rebase |
1733 |
1741 |
1734 If `collapsedas` is not None, the rebase was a collapse whose result if the |
1742 If `collapsedas` is not None, the rebase was a collapse whose result if the |
1735 `collapsedas` node. |
1743 `collapsedas` node. |
1736 |
1744 |
1737 If `keepf` is not True, the rebase has --keep set and no nodes should be |
1745 If `keepf` is not True, the rebase has --keep set and no nodes should be |
1738 removed (but bookmarks still need to be moved). |
1746 removed (but bookmarks still need to be moved). |
|
1747 |
|
1748 If `backup` is False, no backup will be stored when stripping rebased |
|
1749 revisions. |
1739 """ |
1750 """ |
1740 tonode = repo.changelog.node |
1751 tonode = repo.changelog.node |
1741 replacements = {} |
1752 replacements = {} |
1742 moves = {} |
1753 moves = {} |
1743 for rev, newrev in sorted(state.items()): |
1754 for rev, newrev in sorted(state.items()): |
1749 if rev in skipped: |
1760 if rev in skipped: |
1750 succs = () |
1761 succs = () |
1751 else: |
1762 else: |
1752 succs = (newnode,) |
1763 succs = (newnode,) |
1753 replacements[oldnode] = succs |
1764 replacements[oldnode] = succs |
1754 scmutil.cleanupnodes(repo, replacements, 'rebase', moves) |
1765 scmutil.cleanupnodes(repo, replacements, 'rebase', moves, backup=backup) |
1755 if fm: |
1766 if fm: |
1756 hf = fm.hexfunc |
1767 hf = fm.hexfunc |
1757 fl = fm.formatlist |
1768 fl = fm.formatlist |
1758 fd = fm.formatdict |
1769 fd = fm.formatdict |
1759 nodechanges = fd({hf(oldn): fl([hf(n) for n in newn], name='node') |
1770 nodechanges = fd({hf(oldn): fl([hf(n) for n in newn], name='node') |