D815: histedit: add basenodes set to histeditaction.verify methods

mbthomas (Mark Thomas) phabricator at mercurial-scm.org
Tue Sep 26 10:14:21 UTC 2017


mbthomas created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  The `move` action (in a future patch) will require the set of base nodes that
  histedit is editing from.  This is the parent of the first revision in the
  stack, plus any revisions specified by `base` actions.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D815

AFFECTED FILES
  hgext/histedit.py

CHANGE DETAILS

diff --git a/hgext/histedit.py b/hgext/histedit.py
--- a/hgext/histedit.py
+++ b/hgext/histedit.py
@@ -408,7 +408,7 @@
             raise error.ParseError("invalid changeset %s" % rulehash)
         return cls(state, rev)
 
-    def verify(self, prev, expected, seen):
+    def verify(self, prev, expected, seen, basenodes):
         """ Verifies semantic correctness of the rule"""
         repo = self.repo
         ha = node.hex(self.node)
@@ -418,9 +418,9 @@
             raise error.ParseError(_('unknown changeset %s listed')
                               % ha[:12])
         if self.node is not None:
-            self._verifynodeconstraints(prev, expected, seen)
+            self._verifynodeconstraints(prev, expected, seen, basenodes)
 
-    def _verifynodeconstraints(self, prev, expected, seen):
+    def _verifynodeconstraints(self, prev, expected, seen, basenodes):
         # by default command need a node in the edited list
         if self.node not in expected:
             raise error.ParseError(_('%s "%s" changeset was not a candidate')
@@ -673,9 +673,9 @@
 @action(['fold', 'f'],
         _('use commit, but combine it with the one above'))
 class fold(histeditaction):
-    def verify(self, prev, expected, seen):
+    def verify(self, prev, expected, seen, basenodes):
         """ Verifies semantic correctness of the fold rule"""
-        super(fold, self).verify(prev, expected, seen)
+        super(fold, self).verify(prev, expected, seen, basenodes)
         repo = self.repo
         if not prev:
             c = repo[self.node].parents()[0]
@@ -808,7 +808,7 @@
         basectx = self.repo['.']
         return basectx, []
 
-    def _verifynodeconstraints(self, prev, expected, seen):
+    def _verifynodeconstraints(self, prev, expected, seen, basenodes):
         # base can only be use with a node not in the edited set
         if self.node in expected:
             msg = _('%s "%s" changeset was an edited list candidate')
@@ -1225,7 +1225,7 @@
     actions = parserules(rules, state)
     ctxs = [repo[act.node] \
             for act in state.actions if act.node]
-    warnverifyactions(ui, repo, actions, state, ctxs)
+    warnverifyactions(ui, repo, actions, state, ctxs, state.parentctxnode)
     state.actions = actions
     state.write()
 
@@ -1264,9 +1264,8 @@
     else:
         rules = _readfile(ui, rules)
     actions = parserules(rules, state)
-    warnverifyactions(ui, repo, actions, state, ctxs)
-
     parentctxnode = repo[root].parents()[0].node()
+    warnverifyactions(ui, repo, actions, state, ctxs, parentctxnode)
 
     state.parentctxnode = parentctxnode
     state.actions = actions
@@ -1398,16 +1397,16 @@
         actions.append(action)
     return actions
 
-def warnverifyactions(ui, repo, actions, state, ctxs):
+def warnverifyactions(ui, repo, actions, state, ctxs, basenode):
     try:
-        verifyactions(actions, state, ctxs)
+        verifyactions(actions, state, ctxs, basenode)
     except error.ParseError:
         if repo.vfs.exists('histedit-last-edit.txt'):
             ui.warn(_('warning: histedit rules saved '
                       'to: .hg/histedit-last-edit.txt\n'))
         raise
 
-def verifyactions(actions, state, ctxs):
+def verifyactions(actions, state, ctxs, basenode):
     """Verify that there exists exactly one action per given changeset and
     other constraints.
 
@@ -1422,8 +1421,11 @@
         raise error.ParseError(_('first changeset cannot use verb "%s"') %
                                actions[0].verb)
 
+    basenodes = set([state.repo[node.hex(action.node)].node()
+                     for action in actions if isinstance(action, base)])
+    basenodes.add(basenode)
     for action in actions:
-        action.verify(prev, expected, seen)
+        action.verify(prev, expected, seen, basenodes)
         prev = action
         if action.node is not None:
             seen.add(action.node)



To: mbthomas, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list