[PATCH 3 of 9 V3] amend: use dirstateguard instead of dirstate.invalidate
foozy at lares.dti.ne.jp
Wed May 6 22:15:50 CDT 2015
# HG changeset patch
# User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
# Date 1430968030 -32400
# Thu May 07 12:07:10 2015 +0900
# Node ID e9ae08dbe0177b828b694a7d6afe9a65a60e981f
# Parent cbc75b379738476e9037b4f1adda5669963a42af
amend: use dirstateguard instead of dirstate.invalidate
Before this patch, "cmdutil.amend()" uses "dirstate.invalidate()" as a
kind of "restore .hg/dirstate to the original status" at 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" at failure even if "dirstate.write()" is
executed before failure.
This is a part of preparations to fix the issue that recent (in
memory) dirstate isn't visible to external process (e.g. "precommit"
diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
@@ -2464,9 +2464,10 @@
ui.note(_('amending changeset %s\n') % old)
base = old.p1()
- wlock = lock = newid = None
+ wlock = dsguard = lock = newid = None
wlock = repo.wlock()
+ dsguard = dirstateguard(repo, 'amend')
lock = repo.lock()
tr = repo.transaction('amend')
@@ -2637,6 +2638,7 @@
if not createmarkers and newid != old.node():
# Strip the intermediate commit (if there was one) and the amended
@@ -2645,9 +2647,7 @@
ui.note(_('stripping amended changeset %s\n') % old)
repair.strip(ui, repo, old.node(), topic='amend-backup')
- if newid is None:
- lockmod.release(lock, wlock)
+ lockmod.release(lock, dsguard, wlock)
def commiteditor(repo, ctx, subs, editform=''):
More information about the Mercurial-devel