--- 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