Patchwork D1503: rewriteutil: add a precheck function to check if revs can be rewritten

login
register
mail settings
Submitter phabricator
Date Nov. 23, 2017, 10:39 p.m.
Message ID <differential-rev-PHID-DREV-434aeweg2dsdvqkur3nr-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/25734/
State Superseded
Headers show

Comments

phabricator - Nov. 23, 2017, 10:39 p.m.
pulkit created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  The precheck function is intended to be used before we start rewritting
  changesets.

REPOSITORY
  rHG Mercurial

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

AFFECTED FILES
  mercurial/rewriteutil.py

CHANGE DETAILS




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

Patch

diff --git a/mercurial/rewriteutil.py b/mercurial/rewriteutil.py
--- a/mercurial/rewriteutil.py
+++ b/mercurial/rewriteutil.py
@@ -6,12 +6,38 @@ 
 # GNU General Public License version 2 or any later version.
 
 from mercurial import (
+    node,
     obsolete,
     revset,
 )
 
 from mercurial.i18n import _
 
+def precheck(repo, revs, action='rewrite'):
+    """check if revs can be rewritten
+    action is used to control the error message.
+
+    Make sure this function is called after taking the lock.
+    """
+    if node.nullrev in revs:
+        msg = _("cannot %s null changeset") % (action)
+        hint = _("no changeset checked out")
+        raise error.Abort(msg, hint=hint)
+
+    publicrevs = repo.revs('%ld and public()', revs)
+    if len(repo[None].parents()) > 1:
+        raise error.Abort(_("cannot %s while merging") % action)
+
+    if publicrevs:
+        summary = _formatrevs(repo, publicrevs)
+        msg = _("cannot %s public changesets") % (action)
+        hint = _("see 'hg help phases' for details")
+        raise error.Abort(msg, hint=hint)
+
+    newunstable = disallowednewunstable(repo, revs)
+    if newunstable:
+        raise error.Abort(_("cannot %s changeset with children"))
+
 def disallowednewunstable(repo, revs):
     """Checks whether editing the revs will create new unstable changesets and
     are we allowed to create them.