hgext3rd/evolve/evolvecmd.py
changeset 5341 13376ca93fa3
parent 5333 299d86c15b55
child 5343 ebfd0d875600
--- a/hgext3rd/evolve/evolvecmd.py	Tue May 05 16:29:52 2020 +0800
+++ b/hgext3rd/evolve/evolvecmd.py	Thu Apr 30 10:05:14 2020 -0700
@@ -676,23 +676,26 @@
         else:
             date = max(divergent.date(), other.date())
 
-    # new node if any formed as the replacement
-    newnode = repo.commit(text=desc, user=user, date=date)
-    if newnode == divergent.node() or newnode is None:
-        # no changes
-        new = divergent
-        storemarker = True
-        repo.ui.status(_(b"nothing changed\n"))
-        hg.updaterepo(repo, divergent.rev(), False)
+    # We really want a new commit in order to avoid obsmarker cycles (otherwise
+    # divergence resolutions done in separate repos may create markers in the
+    # opposite directions). For that reason, we set ui.allowemptycommit and
+    # also add also add some salt to the commit extras to make sure we don't
+    # reuse an existing nodeid.
+    with repo.ui.configoverride(
+        {(b'ui', b'allowemptycommit'): b'true'}, b'evolve'
+    ):
+        extra = {
+            b'evolve_source_local': divergent.hex(),
+            b'evolve_source_other': other.hex()
+        }
+        newnode = repo.commit(text=desc, user=user, date=date, extra=extra)
+    new = repo[newnode]
+    hg.updaterepo(repo, new.rev(), False)
+    if haspubdiv and publicdiv == divergent:
+        bypassphase(repo, (divergent, new), operation=b'evolve')
     else:
-        new = repo[newnode]
-        newnode = new.node()
-        hg.updaterepo(repo, new.rev(), False)
-        if haspubdiv and publicdiv == divergent:
-            bypassphase(repo, (divergent, new), operation=b'evolve')
-        else:
-            obsolete.createmarkers(repo, [(divergent, (new,))],
-                                   operation=b'evolve')
+        obsolete.createmarkers(repo, [(divergent, (new,))],
+                               operation=b'evolve')
 
     # creating markers and moving phases post-resolution
     if haspubdiv and publicdiv == other: