Patchwork [3,of,4] histedit: switch state to store node instead of ctx

login
register
mail settings
Submitter Mateusz Kwapich
Date Feb. 2, 2015, 11:55 p.m.
Message ID <5868827d6d1a2a75d962.1422921321@dev1429.prn1.facebook.com>
Download mbox | patch
Permalink /patch/7611/
State Superseded
Headers show

Comments

Mateusz Kwapich - Feb. 2, 2015, 11:55 p.m.
# HG changeset patch
# User Mateusz Kwapich <mitrandir@fb.com>
# Date 1422314748 28800
#      Mon Jan 26 15:25:48 2015 -0800
# Node ID 5868827d6d1a2a75d9628d502281d0d7fad2b115
# Parent  0c8cf9835334d76f52e7cebf9d70b5b0df646871
histedit: switch state to store node instead of ctx

As part of making histedit more robust to odd changes between actions, we need
to store the parentctxnode on the state instead of the parentctx. This will
allow the parentctx to be deleted in the middle of a histedit (like if someone
pauses the histedit and amends a file away).

This change just changes what is stored, it doesn't actually fix histedit to
work if the parentctx gets deleted. That will come later.
Pierre-Yves David - Feb. 3, 2015, 11:06 a.m.
On 02/02/2015 11:55 PM, Mateusz Kwapich wrote:
> # HG changeset patch
> # User Mateusz Kwapich <mitrandir@fb.com>
> # Date 1422314748 28800
> #      Mon Jan 26 15:25:48 2015 -0800
> # Node ID 5868827d6d1a2a75d9628d502281d0d7fad2b115
> # Parent  0c8cf9835334d76f52e7cebf9d70b5b0df646871
> histedit: switch state to store node instead of ctx
>
> As part of making histedit more robust to odd changes between actions, we need
> to store the parentctxnode on the state instead of the parentctx. This will
> allow the parentctx to be deleted in the middle of a histedit (like if someone
> pauses the histedit and amends a file away).

why is it necessary to change it on the state object itself? It is not 
obvious to me how it helps.

(If you want to clean stuff in this area, feel free to also nuke the 
last on disk usage of pickle in the Mercurial codebase (beside convert 
madness).

Patch

diff --git a/hgext/histedit.py b/hgext/histedit.py
--- a/hgext/histedit.py
+++ b/hgext/histedit.py
@@ -189,13 +189,13 @@ 
 """)
 
 class histeditstate(object):
-    def __init__(self, repo, parentctx=None, rules=None, keep=None,
+    def __init__(self, repo, parentctxnode=None, rules=None, keep=None,
             topmost=None, replacements=None, lock=None, wlock=None):
         self.repo = repo
         self.rules = rules
         self.keep = keep
         self.topmost = topmost
-        self.parentctx = parentctx
+        self.parentctxnode = parentctxnode
         self.lock = lock
         self.wlock = wlock
         if replacements is None:
@@ -214,7 +214,7 @@ 
 
         parentctxnode, rules, keep, topmost, replacements = pickle.load(fp)
 
-        self.parentctx = self.repo[parentctxnode]
+        self.parentctxnode = parentctxnode
         self.rules = rules
         self.keep = keep
         self.topmost = topmost
@@ -222,7 +222,7 @@ 
 
     def write(self):
         fp = self.repo.vfs('histedit-state', 'w')
-        pickle.dump((self.parentctx.node(), self.rules, self.keep,
+        pickle.dump((self.parentctxnode, self.rules, self.keep,
                      self.topmost, self.replacements), fp)
         fp.close()
 
@@ -346,7 +346,8 @@ 
     return repo.commitctx(new)
 
 def pick(ui, state, ha, opts):
-    repo, ctx = state.repo, state.parentctx
+    repo, ctxnode = state.repo, state.parentctxnode
+    ctx = repo[ctxnode]
     oldctx = repo[ha]
     if oldctx.parents()[0] == ctx:
         ui.debug('node %s unchanged\n' % ha[:12])
@@ -368,7 +369,8 @@ 
 
 
 def edit(ui, state, ha, opts):
-    repo, ctx = state.repo, state.parentctx
+    repo, ctxnode = state.repo, state.parentctxnode
+    ctx = repo[ctxnode]
     oldctx = repo[ha]
     hg.update(repo, ctx.node())
     applychanges(ui, repo, oldctx, opts)
@@ -382,7 +384,8 @@ 
     return fold(ui, state, ha, rollupopts)
 
 def fold(ui, state, ha, opts):
-    repo, ctx = state.repo, state.parentctx
+    repo, ctxnode = state.repo, state.parentctxnode
+    ctx = repo[ctxnode]
     oldctx = repo[ha]
     hg.update(repo, ctx.node())
     stats = applychanges(ui, repo, oldctx, opts)
@@ -438,12 +441,14 @@ 
     return repo[n], replacements
 
 def drop(ui, state, ha, opts):
-    repo, ctx = state.repo, state.parentctx
+    repo, ctxnode = state.repo, state.parentctxnode
+    ctx = repo[ctxnode]
     return ctx, [(repo[ha].node(), ())]
 
 
 def message(ui, state, ha, opts):
-    repo, ctx = state.repo, state.parentctx
+    repo, ctxnode = state.repo, state.parentctxnode
+    ctx = repo[ctxnode]
     oldctx = repo[ha]
     hg.update(repo, ctx.node())
     stats = applychanges(ui, repo, oldctx, opts)
@@ -599,7 +604,7 @@ 
         ui.debug('restore wc to old parent %s\n' % node.short(state.topmost))
         # check whether we should update away
         parentnodes = [c.node() for c in repo[None].parents()]
-        for n in leafs | set([state.parentctx.node()]):
+        for n in leafs | set([state.parentctxnode]):
             if n in parentnodes:
                 hg.clean(repo, state.topmost)
                 break
@@ -655,9 +660,9 @@ 
                  if l and not l.startswith('#')]
         rules = verifyrules(rules, repo, ctxs)
 
-        parentctx = repo[root].parents()[0]
+        parentctxnode = repo[root].parents()[0].node()
 
-        state.parentctx = parentctx
+        state.parentctxnode = parentctxnode
         state.rules = rules
         state.keep = keep
         state.topmost = topmost
@@ -668,10 +673,11 @@ 
         action, ha = state.rules.pop(0)
         ui.debug('histedit: processing %s %s\n' % (action, ha[:12]))
         actfunc = actiontable[action]
-        state.parentctx, replacement_ = actfunc(ui, state, ha, opts)
+        parentctx, replacement_ = actfunc(ui, state, ha, opts)
+        state.parentctxnode = parentctx.node()
         state.replacements.extend(replacement_)
 
-    hg.update(repo, state.parentctx.node())
+    hg.update(repo, state.parentctxnode)
 
     mapping, tmpnodes, created, ntm = processreplacement(state)
     if mapping:
@@ -724,7 +730,8 @@ 
     return newchildren
 
 def bootstrapcontinue(ui, state, opts):
-    repo, parentctx = state.repo, state.parentctx
+    repo, parentctxnode = state.repo, state.parentctxnode
+    parentctx = repo[parentctxnode]
     action, currentnode = state.rules.pop(0)
     ctx = repo[currentnode]
 
@@ -780,7 +787,7 @@ 
         # otherwise update "parentctx" before proceeding to further operation
         parentctx = repo[newchildren[-1]]
 
-    state.parentctx = parentctx
+    state.parentctxnode = parentctx.node()
     state.replacements.extend(replacements)
 
     return state