hgext3rd/evolve/rewriteutil.py
changeset 5230 39d282fd04e0
parent 5038 f583d9eedbce
child 5231 9d05eb69cd05
--- a/hgext3rd/evolve/rewriteutil.py	Fri Dec 20 14:08:37 2019 +0700
+++ b/hgext3rd/evolve/rewriteutil.py	Mon Nov 04 01:30:50 2019 +0530
@@ -77,6 +77,15 @@
         msg %= (action, len(newunstable))
         hint = _(b"see 'hg help evolution.instability'")
         raise error.Abort(msg, hint=hint)
+    divrisk = revs_hascontentdivrisk(repo, revs)
+    allowdivergence = repo.ui.configbool(b'experimental',
+                                         b'evolution.allowdivergence')
+    if divrisk and not allowdivergence:
+        msg = _(b"revision being rewritten or one of its precursor was "
+                b"rewritten as %s, performing '%s' will create "
+                b"content-divergence") % (repo[divrisk[0]], action)
+        hint = _(b"For more, see 'hg help evolution.instability'")
+        raise error.Abort(msg, hint=hint)
 
 def bookmarksupdater(repo, oldid, tr):
     """Return a callable update(newid) updating the current bookmark
@@ -89,6 +98,14 @@
             repo._bookmarks.applychanges(repo, tr, bmchanges)
     return updatebookmarks
 
+def revs_hascontentdivrisk(repo, revs):
+    obsrevs = repo.revs(b'%ld and obsolete()', revs)
+    for r in obsrevs:
+        div = contentdivrisk(repo, repo[r])
+        if div:
+            return div
+    return []
+
 def disallowednewunstable(repo, revs):
     """Check that editing <revs> will not create disallowed unstable
 
@@ -257,10 +274,12 @@
         lockmod.release(tr, lock, wlock)
 
 def contentdivrisk(repo, ctx):
-    """logic to check if rewriting an obsolete cset will create divergence"""
+    """return divergent revision if rewriting an obsolete cset (ctx) will
+    create divergence"""
     # We need to check two cases that can cause divergence:
     # case 1: the rev being rewritten has a non-obsolete successor (easily
     #     detected by successorssets)
+    divergent = []
     sset = obsutil.successorssets(repo, ctx.node())
     nodivergencerisk = (len(sset) == 0
                         or (len(sset) == 1
@@ -271,6 +290,10 @@
         # case 2: one of the precursors of the rev being revived has a
         #     non-obsolete successor (we need divergentsets for this)
         from . import evolvecmd
-        if evolvecmd.divergentsets(repo, ctx):
-            nodivergencerisk = False
-    return not nodivergencerisk
+        divsets = evolvecmd.divergentsets(repo, ctx)
+        if divsets:
+            nsuccset = divsets[0][b'divergentnodes']
+            divergent.append(nsuccset[0][0])
+    else:
+        divergent.append(sset[0][0])
+    return divergent