changeset 35252:490df753894d

rewriteutil: add a precheck function to check if revs can be rewritten The precheck function is intended to be used before we start rewritting changesets. Differential Revision: https://phab.mercurial-scm.org/D1503
author Pulkit Goyal <7895pulkit@gmail.com>
date Fri, 24 Nov 2017 03:44:50 +0530
parents 27d5c2d2db2b
children 98f97eb20597
files mercurial/rewriteutil.py
diffstat 1 files changed, 28 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/rewriteutil.py	Fri Nov 24 03:40:33 2017 +0530
+++ b/mercurial/rewriteutil.py	Fri Nov 24 03:44:50 2017 +0530
@@ -7,11 +7,39 @@
 
 from __future__ import absolute_import
 
+from .i18n import _
+
 from . import (
+    error,
+    node,
     obsolete,
     revset,
 )
 
+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:
+        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") % action)
+
 def disallowednewunstable(repo, revs):
     """Checks whether editing the revs will create new unstable changesets and
     are we allowed to create them.