mq: use dirstateguard instead of dirstate.invalidate (qrefresh)
Before this patch, "mq.queue.refresh()" uses "dirstate.invalidate()"
as a kind of "restore .hg/dirstate to the original status" during a failure.
But it just discards changes in memory, and doesn't actually restore
".hg/dirstate". Then, it can't work as expected, if "dirstate.write()"
is executed while processing.
This patch uses "dirstateguard" instead of "dirstate.invalidate()" to
restore ".hg/dirstate" during a failure even if "dirstate.write()" is
executed before a failure.
This patch also removes "beginparentchage()" and "endparentchange()",
because "dirstateguard" makes them useless.
This is a part of preparations to fix the issue that the recent (in
memory) dirstate isn't visible to external processes (e.g. "precommit"
hook).
--- a/hgext/mq.py Thu May 07 12:07:11 2015 +0900
+++ b/hgext/mq.py Thu May 07 12:07:11 2015 +0900
@@ -1683,8 +1683,9 @@
bmlist = repo[top].bookmarks()
+ dsguard = None
try:
- repo.dirstate.beginparentchange()
+ dsguard = cmdutil.dirstateguard(repo, 'mq.refresh')
if diffopts.git or diffopts.upgrade:
copies = {}
for dst in a:
@@ -1737,13 +1738,12 @@
# assumes strip can roll itself back if interrupted
repo.setparents(*cparents)
- repo.dirstate.endparentchange()
self.applied.pop()
self.applieddirty = True
strip(self.ui, repo, [top], update=False, backup=False)
- except: # re-raises
- repo.dirstate.invalidate()
- raise
+ dsguard.close()
+ finally:
+ release(dsguard)
try:
# might be nice to attempt to roll back strip after this