changeset 33068:2312e70cf78b

rebase: clean up rebasestate from active transaction Previously, rebase assumes the following pattern: rebase: with transaction as tr: # top-level ... tr.__close__ writes rebasestate unlink('rebasestate') However it's possible that "rebase" was called inside a transaction: with transaction as tr1: rebase: with transaction as tr2: # not top-level ... tr2.__close__ does not write rebasestate unlink('rebasestate') tr1.__close__ writes rebasestate That leaves a rebasestate on disk incorrectly. This patch adds "removefilegenerator" to notify transaction code that the state file is no longer needed therefore fixes the issue.
author Jun Wu <quark@fb.com>
date Sat, 24 Jun 2017 21:13:48 -0700
parents be3584712b20
children 03eefca3ed33
files hgext/rebase.py mercurial/transaction.py tests/test-rebase-scenario-global.t
diffstat 3 files changed, 11 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/rebase.py	Sat Jun 24 21:01:28 2017 -0700
+++ b/hgext/rebase.py	Sat Jun 24 21:13:48 2017 -0700
@@ -1148,6 +1148,10 @@
 def clearstatus(repo):
     'Remove the status files'
     _clearrebasesetvisibiliy(repo)
+    # Make sure the active transaction won't write the state file
+    tr = repo.currenttransaction()
+    if tr:
+        tr.removefilegenerator('rebasestate')
     repo.vfs.unlinkpath("rebasestate", ignoremissing=True)
 
 def needupdate(repo, state):
--- a/mercurial/transaction.py	Sat Jun 24 21:01:28 2017 -0700
+++ b/mercurial/transaction.py	Sat Jun 24 21:13:48 2017 -0700
@@ -292,6 +292,12 @@
         # but for bookmarks that are handled outside this mechanism.
         self._filegenerators[genid] = (order, filenames, genfunc, location)
 
+    @active
+    def removefilegenerator(self, genid):
+        """reverse of addfilegenerator, remove a file generator function"""
+        if genid in self._filegenerators:
+            del self._filegenerators[genid]
+
     def _generatefiles(self, suffix='', group=gengroupall):
         # write files registered for generation
         any = False
--- a/tests/test-rebase-scenario-global.t	Sat Jun 24 21:01:28 2017 -0700
+++ b/tests/test-rebase-scenario-global.t	Sat Jun 24 21:13:48 2017 -0700
@@ -954,4 +954,4 @@
   rebasing 2:dc0947a82db8 "C" (C tip)
 
   $ [ -f .hg/rebasestate ] && echo 'WRONG: rebasestate should not exist'
-  WRONG: rebasestate should not exist
+  [1]