[PATCH] histedit: use the unfiltered repository to get rulectx
timeless
timeless at fmr.im
Fri Jun 3 14:54:14 UTC 2016
# HG changeset patch
# User timeless <timeless at mozdev.org>
# Date 1464965033 0
# Fri Jun 03 14:43:53 2016 +0000
# Node ID bdcf6e2abe8ff449de33fb58d2488f7f60564e22
# Parent 9ac309946df9e69bb73ded75f2fc5b84a4e785c2
# Available At https://bitbucket.org/timeless/mercurial-crew
# hg pull https://bitbucket.org/timeless/mercurial-crew -r bdcf6e2abe8f
histedit: use the unfiltered repository to get rulectx
Without this, histedit fails if a node was pruned.
But histedit just wants the commit info, it does not need to care if
a node is dead or alive.
diff -r 9ac309946df9 -r bdcf6e2abe8f hgext/histedit.py
--- a/hgext/histedit.py Fri May 27 05:24:45 2016 +0000
+++ b/hgext/histedit.py Fri Jun 03 14:43:53 2016 +0000
@@ -413,13 +413,17 @@
raise error.ParseError(_('unknown changeset %s listed')
% ha[:12])
+ def rulectx(self):
+ """Get the rulectx -- even if it's obsolete"""
+ return self.repo.unfiltered()[self.node]
+
def torule(self, initial=False):
"""build a histedit rule line for an action
by default lines are in the form:
<hash> <rev> <summary>
"""
- ctx = self.repo[self.node]
+ ctx = self.rulectx()
summary = ''
if ctx.description():
summary = ctx.description().splitlines()[0]
@@ -468,7 +472,7 @@
"""Applies the changes from this action's rulectx onto the current
parentctx, but does not commit them."""
repo = self.repo
- rulectx = repo[self.node]
+ rulectx = self.rulectx()
repo.ui.pushbuffer(error=True, labeled=True)
hg.update(repo, self.state.parentctxnode, quietempty=True)
stats = applychanges(repo.ui, repo, rulectx, {})
@@ -486,7 +490,7 @@
"""Continues the action when changes have been applied to the working
copy. The default behavior is to commit the dirty changes."""
repo = self.repo
- rulectx = repo[self.node]
+ rulectx = self.rulectx()
editor = self.commiteditor()
commit = commitfuncfor(repo, rulectx)
@@ -666,7 +670,7 @@
priority=True)
class pick(histeditaction):
def run(self):
- rulectx = self.repo[self.node]
+ rulectx = self.rulectx()
if rulectx.parents()[0].node() == self.state.parentctxnode:
self.repo.ui.debug('node %s unchanged\n' % node.short(self.node))
return rulectx, []
@@ -679,7 +683,7 @@
class edit(histeditaction):
def run(self):
repo = self.repo
- rulectx = repo[self.node]
+ rulectx = self.rulectx()
hg.update(repo, self.state.parentctxnode, quietempty=True)
applychanges(repo.ui, repo, rulectx, {})
raise error.InterventionRequired(
@@ -698,7 +702,7 @@
super(fold, self).verify(prev)
repo = self.repo
if not prev:
- c = repo[self.node].parents()[0]
+ c = self.rulectx().parents()[0]
elif not prev.verb in ('pick', 'base'):
return
else:
@@ -710,7 +714,7 @@
def continuedirty(self):
repo = self.repo
- rulectx = repo[self.node]
+ rulectx = self.rulectx()
commit = commitfuncfor(repo, rulectx)
commit(text='fold-temp-revision %s' % node.short(self.node),
@@ -720,7 +724,7 @@
def continueclean(self):
repo = self.repo
ctx = repo['.']
- rulectx = repo[self.node]
+ rulectx = self.rulectx()
parentctxnode = self.state.parentctxnode
if ctx.node() == parentctxnode:
repo.ui.warn(_('%s: empty changeset\n') %
@@ -1156,6 +1160,7 @@
movebookmarks(ui, repo, mapping, state.topmost, ntm)
# TODO update mq state
if supportsmarkers:
+ repo = repo.unfiltered()
markers = []
# sort by revision number because it sound "right"
for prec in sorted(mapping, key=repo.changelog.rev):
diff -r 9ac309946df9 -r bdcf6e2abe8f tests/test-histedit-obsolete.t
--- a/tests/test-histedit-obsolete.t Fri May 27 05:24:45 2016 +0000
+++ b/tests/test-histedit-obsolete.t Fri Jun 03 14:43:53 2016 +0000
@@ -88,6 +88,22 @@
2ca853e48edbd6453a0674dc0fe28a0974c51b9c aba7da93703075eec9fb1dbaf143ff2bc1c49d46 0 (*) {'user': 'test'} (glob)
49d44ab2be1b67a79127568a67c9c99430633b48 273c1f3b86267ed3ec684bb13af1fa4d6ba56e02 0 (*) {'user': 'test'} (glob)
46abc7c4d8738e8563e577f7889e1b6db3da4199 aba7da93703075eec9fb1dbaf143ff2bc1c49d46 0 (*) {'user': 'test'} (glob)
+
+Test that a pruned leaf does not break histedit
+
+ $ echo pick `hg log -r 8 -T '{node}'` 8 a > plan
+ $ echo edit `hg log -r 9 -T '{node}'` 9 b >> plan
+ $ hg histedit --commands plan 8
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ adding b
+ adding d
+ Editing (273c1f3b8626), you may commit or record as needed now.
+ (hg histedit --continue to resume)
+ [1]
+ $ hg debugobsolete `hg log -r 9 -T '{node}'`
+ $ hg mv c e
+ $ hg histedit --cont
+
$ cd ..
Base setup for the rest of the testing
More information about the Mercurial-devel
mailing list