175 e = opts.get('extrafn') # internal, used by e.g. hgsubversion |
175 e = opts.get('extrafn') # internal, used by e.g. hgsubversion |
176 self.extrafns = [_savegraft] |
176 self.extrafns = [_savegraft] |
177 if e: |
177 if e: |
178 self.extrafns = [e] |
178 self.extrafns = [e] |
179 |
179 |
|
180 self.backupf = ui.configbool('ui', 'history-editing-backup') |
180 self.keepf = opts.get('keep', False) |
181 self.keepf = opts.get('keep', False) |
181 self.keepbranchesf = opts.get('keepbranches', False) |
182 self.keepbranchesf = opts.get('keepbranches', False) |
182 self.obsoletenotrebased = {} |
183 self.obsoletenotrebased = {} |
183 self.obsoletewithoutsuccessorindestination = set() |
184 self.obsoletewithoutsuccessorindestination = set() |
184 self.inmemory = inmemory |
185 self.inmemory = inmemory |
341 return 0 |
342 return 0 |
342 else: |
343 else: |
343 msg = _('cannot continue inconsistent rebase') |
344 msg = _('cannot continue inconsistent rebase') |
344 hint = _('use "hg rebase --abort" to clear broken state') |
345 hint = _('use "hg rebase --abort" to clear broken state') |
345 raise error.Abort(msg, hint=hint) |
346 raise error.Abort(msg, hint=hint) |
|
347 |
346 if isabort: |
348 if isabort: |
|
349 backup = backup and self.backupf |
347 return abort(self.repo, self.originalwd, self.destmap, self.state, |
350 return abort(self.repo, self.originalwd, self.destmap, self.state, |
348 activebookmark=self.activebookmark, backup=backup, |
351 activebookmark=self.activebookmark, backup=backup, |
349 suppwarns=suppwarns) |
352 suppwarns=suppwarns) |
350 |
353 |
351 def _preparenewrebase(self, destmap): |
354 def _preparenewrebase(self, destmap): |
583 # commit is completely done. On InterventionRequired, we thus |
586 # commit is completely done. On InterventionRequired, we thus |
584 # won't store the status. Instead, we'll hit the "len(parents) == 2" |
587 # won't store the status. Instead, we'll hit the "len(parents) == 2" |
585 # case and realize that the commit was in progress. |
588 # case and realize that the commit was in progress. |
586 self.storestatus() |
589 self.storestatus() |
587 |
590 |
588 def _finishrebase(self, backup=True): |
591 def _finishrebase(self): |
589 """ |
|
590 backup: if False, no backup will be stored when stripping rebased |
|
591 revisions |
|
592 """ |
|
593 repo, ui, opts = self.repo, self.ui, self.opts |
592 repo, ui, opts = self.repo, self.ui, self.opts |
594 fm = ui.formatter('rebase', opts) |
593 fm = ui.formatter('rebase', opts) |
595 fm.startitem() |
594 fm.startitem() |
596 if self.collapsef: |
595 if self.collapsef: |
597 p1, p2, _base = defineparents(repo, min(self.state), self.destmap, |
596 p1, p2, _base = defineparents(repo, min(self.state), self.destmap, |
634 |
633 |
635 collapsedas = None |
634 collapsedas = None |
636 if self.collapsef and not self.keepf: |
635 if self.collapsef and not self.keepf: |
637 collapsedas = newnode |
636 collapsedas = newnode |
638 clearrebased(ui, repo, self.destmap, self.state, self.skipped, |
637 clearrebased(ui, repo, self.destmap, self.state, self.skipped, |
639 collapsedas, self.keepf, fm=fm, backup=backup) |
638 collapsedas, self.keepf, fm=fm, backup=self.backupf) |
640 |
639 |
641 clearstatus(repo) |
640 clearstatus(repo) |
642 clearcollapsemsg(repo) |
641 clearcollapsemsg(repo) |
643 |
642 |
644 ui.note(_("rebase completed\n")) |
643 ui.note(_("rebase completed\n")) |
831 raise error.Abort(_('--auto-orphans is incompatible with %s') % |
830 raise error.Abort(_('--auto-orphans is incompatible with %s') % |
832 ('--' + key)) |
831 ('--' + key)) |
833 userrevs = list(repo.revs(opts.get('auto_orphans'))) |
832 userrevs = list(repo.revs(opts.get('auto_orphans'))) |
834 opts['rev'] = [revsetlang.formatspec('%ld and orphan()', userrevs)] |
833 opts['rev'] = [revsetlang.formatspec('%ld and orphan()', userrevs)] |
835 opts['dest'] = '_destautoorphanrebase(SRC)' |
834 opts['dest'] = '_destautoorphanrebase(SRC)' |
836 backup = ui.configbool('ui', 'history-editing-backup') |
|
837 opts['backup'] = backup |
|
838 |
835 |
839 if dryrun: |
836 if dryrun: |
840 return _dryrunrebase(ui, repo, opts) |
837 return _dryrunrebase(ui, repo, opts) |
841 elif inmemory: |
838 elif inmemory: |
842 try: |
839 try: |
854 return _dorebase(ui, repo, opts) |
851 return _dorebase(ui, repo, opts) |
855 |
852 |
856 def _dryrunrebase(ui, repo, opts): |
853 def _dryrunrebase(ui, repo, opts): |
857 rbsrt = rebaseruntime(repo, ui, inmemory=True, opts=opts) |
854 rbsrt = rebaseruntime(repo, ui, inmemory=True, opts=opts) |
858 confirm = opts.get('confirm') |
855 confirm = opts.get('confirm') |
859 backup = opts.get('backup') |
|
860 if confirm: |
856 if confirm: |
861 ui.status(_('starting in-memory rebase\n')) |
857 ui.status(_('starting in-memory rebase\n')) |
862 else: |
858 else: |
863 ui.status(_('starting dry-run rebase; repository will not be ' |
859 ui.status(_('starting dry-run rebase; repository will not be ' |
864 'changed\n')) |
860 'changed\n')) |
876 if confirm: |
872 if confirm: |
877 ui.status(_('rebase completed successfully\n')) |
873 ui.status(_('rebase completed successfully\n')) |
878 if not ui.promptchoice(_(b'apply changes (yn)?' |
874 if not ui.promptchoice(_(b'apply changes (yn)?' |
879 b'$$ &Yes $$ &No')): |
875 b'$$ &Yes $$ &No')): |
880 # finish unfinished rebase |
876 # finish unfinished rebase |
881 rbsrt._finishrebase(backup=backup) |
877 rbsrt._finishrebase() |
882 else: |
878 else: |
883 rbsrt._prepareabortorcontinue(isabort=True, backup=False, |
879 rbsrt._prepareabortorcontinue(isabort=True, backup=False, |
884 suppwarns=True) |
880 suppwarns=True) |
885 needsabort = False |
881 needsabort = False |
886 else: |
882 else: |
907 # search default destination in this space |
903 # search default destination in this space |
908 # used in the 'hg pull --rebase' case, see issue 5214. |
904 # used in the 'hg pull --rebase' case, see issue 5214. |
909 destspace = opts.get('_destspace') |
905 destspace = opts.get('_destspace') |
910 contf = opts.get('continue') |
906 contf = opts.get('continue') |
911 abortf = opts.get('abort') |
907 abortf = opts.get('abort') |
912 backup = opts.get('backup') |
|
913 if opts.get('interactive'): |
908 if opts.get('interactive'): |
914 try: |
909 try: |
915 if extensions.find('histedit'): |
910 if extensions.find('histedit'): |
916 enablehistedit = '' |
911 enablehistedit = '' |
917 except KeyError: |
912 except KeyError: |
938 ui.warn(_('tool option will be ignored\n')) |
933 ui.warn(_('tool option will be ignored\n')) |
939 if contf: |
934 if contf: |
940 ms = mergemod.mergestate.read(repo) |
935 ms = mergemod.mergestate.read(repo) |
941 mergeutil.checkunresolved(ms) |
936 mergeutil.checkunresolved(ms) |
942 |
937 |
943 retcode = rbsrt._prepareabortorcontinue(abortf, backup=backup) |
938 retcode = rbsrt._prepareabortorcontinue(abortf) |
944 if retcode is not None: |
939 if retcode is not None: |
945 return retcode |
940 return retcode |
946 else: |
941 else: |
947 destmap = _definedestmap(ui, repo, inmemory, destf, srcf, basef, |
942 destmap = _definedestmap(ui, repo, inmemory, destf, srcf, basef, |
948 revf, destspace=destspace) |
943 revf, destspace=destspace) |
967 if singletr and not inmemory: |
962 if singletr and not inmemory: |
968 dsguard = dirstateguard.dirstateguard(repo, 'rebase') |
963 dsguard = dirstateguard.dirstateguard(repo, 'rebase') |
969 with util.acceptintervention(dsguard): |
964 with util.acceptintervention(dsguard): |
970 rbsrt._performrebase(tr) |
965 rbsrt._performrebase(tr) |
971 if not leaveunfinished: |
966 if not leaveunfinished: |
972 rbsrt._finishrebase(backup=backup) |
967 rbsrt._finishrebase() |
973 |
968 |
974 def _definedestmap(ui, repo, inmemory, destf=None, srcf=None, basef=None, |
969 def _definedestmap(ui, repo, inmemory, destf=None, srcf=None, basef=None, |
975 revf=None, destspace=None): |
970 revf=None, destspace=None): |
976 """use revisions argument to define destmap {srcrev: destrev}""" |
971 """use revisions argument to define destmap {srcrev: destrev}""" |
977 if revf is None: |
972 if revf is None: |