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.
--- 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]