Mercurial > hg
comparison hgext/rebase.py @ 44923:1f114c797961 stable
rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
See 56d3e0b499df for the source of adding originalwd to the list of things that
cause wdir to be updated. That change didn't come with tests, and attempts to
recreate the scenario described have thus far failed.
Differential Revision: https://phab.mercurial-scm.org/D8489
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Thu, 30 Apr 2020 00:33:00 -0400 |
parents | e7af56a0733e |
children | 78cafd48b9b2 |
comparison
equal
deleted
inserted
replaced
44922:9f3aa0d3de41 | 44923:1f114c797961 |
---|---|
365 skippedset = set(self.obsoletenotrebased) | 365 skippedset = set(self.obsoletenotrebased) |
366 skippedset.update(self.obsoletewithoutsuccessorindestination) | 366 skippedset.update(self.obsoletewithoutsuccessorindestination) |
367 skippedset.update(obsoleteextinctsuccessors) | 367 skippedset.update(obsoleteextinctsuccessors) |
368 _checkobsrebase(self.repo, self.ui, obsoleteset, skippedset) | 368 _checkobsrebase(self.repo, self.ui, obsoleteset, skippedset) |
369 | 369 |
370 def _prepareabortorcontinue(self, isabort, backup=True, suppwarns=False): | 370 def _prepareabortorcontinue( |
371 self, isabort, backup=True, suppwarns=False, dryrun=False, confirm=False | |
372 ): | |
371 self.resume = True | 373 self.resume = True |
372 try: | 374 try: |
373 self.restorestatus() | 375 self.restorestatus() |
374 self.collapsemsg = restorecollapsemsg(self.repo, isabort) | 376 self.collapsemsg = restorecollapsemsg(self.repo, isabort) |
375 except error.RepoLookupError: | 377 except error.RepoLookupError: |
388 hint = _(b'use "hg rebase --abort" to clear broken state') | 390 hint = _(b'use "hg rebase --abort" to clear broken state') |
389 raise error.Abort(msg, hint=hint) | 391 raise error.Abort(msg, hint=hint) |
390 | 392 |
391 if isabort: | 393 if isabort: |
392 backup = backup and self.backupf | 394 backup = backup and self.backupf |
393 return self._abort(backup=backup, suppwarns=suppwarns) | 395 return self._abort( |
396 backup=backup, | |
397 suppwarns=suppwarns, | |
398 dryrun=dryrun, | |
399 confirm=confirm, | |
400 ) | |
394 | 401 |
395 def _preparenewrebase(self, destmap): | 402 def _preparenewrebase(self, destmap): |
396 if not destmap: | 403 if not destmap: |
397 return _nothingtorebase() | 404 return _nothingtorebase() |
398 | 405 |
747 and self.activebookmark in repo._bookmarks | 754 and self.activebookmark in repo._bookmarks |
748 and repo[b'.'].node() == repo._bookmarks[self.activebookmark] | 755 and repo[b'.'].node() == repo._bookmarks[self.activebookmark] |
749 ): | 756 ): |
750 bookmarks.activate(repo, self.activebookmark) | 757 bookmarks.activate(repo, self.activebookmark) |
751 | 758 |
752 def _abort(self, backup=True, suppwarns=False): | 759 def _abort(self, backup=True, suppwarns=False, dryrun=False, confirm=False): |
753 '''Restore the repository to its original state.''' | 760 '''Restore the repository to its original state.''' |
754 | 761 |
755 repo = self.repo | 762 repo = self.repo |
756 try: | 763 try: |
757 # If the first commits in the rebased set get skipped during the | 764 # If the first commits in the rebased set get skipped during the |
791 c.node() for c in repo.set(b'roots(%ld)', rebased) | 798 c.node() for c in repo.set(b'roots(%ld)', rebased) |
792 ] | 799 ] |
793 | 800 |
794 updateifonnodes = set(rebased) | 801 updateifonnodes = set(rebased) |
795 updateifonnodes.update(self.destmap.values()) | 802 updateifonnodes.update(self.destmap.values()) |
796 updateifonnodes.add(self.originalwd) | 803 |
804 if not dryrun and not confirm: | |
805 updateifonnodes.add(self.originalwd) | |
806 | |
797 shouldupdate = repo[b'.'].rev() in updateifonnodes | 807 shouldupdate = repo[b'.'].rev() in updateifonnodes |
798 | 808 |
799 # Update away from the rebase if necessary | 809 # Update away from the rebase if necessary |
800 if shouldupdate: | 810 if shouldupdate: |
801 mergemod.clean_update(repo[self.originalwd]) | 811 mergemod.clean_update(repo[self.originalwd]) |
1117 if not ui.promptchoice(_(b'apply changes (yn)?$$ &Yes $$ &No')): | 1127 if not ui.promptchoice(_(b'apply changes (yn)?$$ &Yes $$ &No')): |
1118 # finish unfinished rebase | 1128 # finish unfinished rebase |
1119 rbsrt._finishrebase() | 1129 rbsrt._finishrebase() |
1120 else: | 1130 else: |
1121 rbsrt._prepareabortorcontinue( | 1131 rbsrt._prepareabortorcontinue( |
1122 isabort=True, backup=False, suppwarns=True | 1132 isabort=True, |
1133 backup=False, | |
1134 suppwarns=True, | |
1135 confirm=confirm, | |
1123 ) | 1136 ) |
1124 needsabort = False | 1137 needsabort = False |
1125 else: | 1138 else: |
1126 ui.status( | 1139 ui.status( |
1127 _( | 1140 _( |
1132 return 0 | 1145 return 0 |
1133 finally: | 1146 finally: |
1134 if needsabort: | 1147 if needsabort: |
1135 # no need to store backup in case of dryrun | 1148 # no need to store backup in case of dryrun |
1136 rbsrt._prepareabortorcontinue( | 1149 rbsrt._prepareabortorcontinue( |
1137 isabort=True, backup=False, suppwarns=True | 1150 isabort=True, |
1151 backup=False, | |
1152 suppwarns=True, | |
1153 dryrun=opts.get(b'dry_run'), | |
1138 ) | 1154 ) |
1139 | 1155 |
1140 | 1156 |
1141 def _dorebase(ui, repo, action, opts, inmemory=False): | 1157 def _dorebase(ui, repo, action, opts, inmemory=False): |
1142 rbsrt = rebaseruntime(repo, ui, inmemory, opts) | 1158 rbsrt = rebaseruntime(repo, ui, inmemory, opts) |