# HG changeset patch # User Matt Harbison # Date 2020-04-30 04:33:00 # Node ID 1f114c797961733ea03d0de88390f9555a7edef4 # Parent 9f3aa0d3de41aae5e62d2db28649276b0f431286 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 diff --git a/hgext/rebase.py b/hgext/rebase.py --- a/hgext/rebase.py +++ b/hgext/rebase.py @@ -367,7 +367,9 @@ class rebaseruntime(object): skippedset.update(obsoleteextinctsuccessors) _checkobsrebase(self.repo, self.ui, obsoleteset, skippedset) - def _prepareabortorcontinue(self, isabort, backup=True, suppwarns=False): + def _prepareabortorcontinue( + self, isabort, backup=True, suppwarns=False, dryrun=False, confirm=False + ): self.resume = True try: self.restorestatus() @@ -390,7 +392,12 @@ class rebaseruntime(object): if isabort: backup = backup and self.backupf - return self._abort(backup=backup, suppwarns=suppwarns) + return self._abort( + backup=backup, + suppwarns=suppwarns, + dryrun=dryrun, + confirm=confirm, + ) def _preparenewrebase(self, destmap): if not destmap: @@ -749,7 +756,7 @@ class rebaseruntime(object): ): bookmarks.activate(repo, self.activebookmark) - def _abort(self, backup=True, suppwarns=False): + def _abort(self, backup=True, suppwarns=False, dryrun=False, confirm=False): '''Restore the repository to its original state.''' repo = self.repo @@ -793,7 +800,10 @@ class rebaseruntime(object): updateifonnodes = set(rebased) updateifonnodes.update(self.destmap.values()) - updateifonnodes.add(self.originalwd) + + if not dryrun and not confirm: + updateifonnodes.add(self.originalwd) + shouldupdate = repo[b'.'].rev() in updateifonnodes # Update away from the rebase if necessary @@ -1119,7 +1129,10 @@ def _dryrunrebase(ui, repo, action, opts rbsrt._finishrebase() else: rbsrt._prepareabortorcontinue( - isabort=True, backup=False, suppwarns=True + isabort=True, + backup=False, + suppwarns=True, + confirm=confirm, ) needsabort = False else: @@ -1134,7 +1147,10 @@ def _dryrunrebase(ui, repo, action, opts if needsabort: # no need to store backup in case of dryrun rbsrt._prepareabortorcontinue( - isabort=True, backup=False, suppwarns=True + isabort=True, + backup=False, + suppwarns=True, + dryrun=opts.get(b'dry_run'), ) diff --git a/tests/test-rebase-named-branches.t b/tests/test-rebase-named-branches.t --- a/tests/test-rebase-named-branches.t +++ b/tests/test-rebase-named-branches.t @@ -339,15 +339,23 @@ Reopen branch by rebase -A +A-mod -BUG: This shouldn't affect wdir +--dry-run doesn't affect a dirty working directory that is unrelated to the +source or destination. $ hg rebase -s tip -d 4 --dry-run starting dry-run rebase; repository will not be changed rebasing 11:be1dea60f2a6 "D" (tip) dry-run rebase completed successfully; run without -n/--dry-run to perform this rebase $ hg diff + diff -r 2b586e70108d A + --- a/A Thu Jan 01 00:00:00 1970 +0000 + +++ b/A Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +1,1 @@ + -A + +A-mod -BUG: This shouldn't affect wdir +Bailing out on --confirm doesn't affect a dirty working directory that is +unrelated to the source or destination. $ echo A-mod > A $ echo n | hg rebase -s tip -d 4 --confirm --config ui.interactive=True @@ -356,6 +364,12 @@ BUG: This shouldn't affect wdir rebase completed successfully apply changes (yn)? n $ hg diff + diff -r 2b586e70108d A + --- a/A Thu Jan 01 00:00:00 1970 +0000 + +++ b/A Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +1,1 @@ + -A + +A-mod $ echo A-mod > A $ hg rebase -s tip -d 4 --confirm