diff hgext/evolve.py @ 1467:5c385b812500 stable

evolve: dedupe divergents when running evolve --all --any or evolve --rev Before this patch, when running evolve --all --any or evolve --rev with the --divergent flag, we were selecting all of the divergents. After solving the first one, its counterparts would get pruned and potentially hidden which would crash when trying to resolve them. This patch introduces logic to dedupe the divergents to be resolved by keeping only one per group of divergent with the lower revision number.
author Laurent Charignon <lcharignon@fb.com>
date Wed, 24 Jun 2015 16:54:23 -0700
parents a433948ca8d2
children bc6cf6cc06fd
line wrap: on
line diff
--- a/hgext/evolve.py	Wed Jun 24 16:38:24 2015 -0700
+++ b/hgext/evolve.py	Wed Jun 24 16:54:23 2015 -0700
@@ -1415,6 +1415,24 @@
                 rdependencies[succ].add(r)
     return dependencies, rdependencies
 
+def _dedupedivergents(repo, revs):
+    """Dedupe the divergents revs in revs to get one from each group with the
+    lowest revision numbers
+    """
+    repo = repo.unfiltered()
+    res = set()
+    # To not reevaluate divergents of the same group once one is encountered
+    discarded = set()
+    for rev in revs:
+        if rev in discarded:
+            continue
+        divergent = repo[rev]
+        base, others = divergentdata(divergent)
+        othersrevs = [o.rev() for o in others]
+        res.add(min([divergent.rev()] + othersrevs))
+        discarded.update(othersrevs)
+    return res
+
 def _selectrevs(repo, allopt, revopt, anyopt, targetcat):
     """select troubles in repo matching according to given options"""
     revs = set()
@@ -1424,6 +1442,9 @@
             revs = scmutil.revrange(repo, revopt) & revs
         elif not anyopt and targetcat == 'unstable':
             revs = set(_aspiringdescendant(repo, repo.revs('(.::) - obsolete()::')))
+        if targetcat == 'divergent':
+            # Pick one divergent per group of divergents
+            revs = _dedupedivergents(repo, revs)
     elif anyopt:
         revs = repo.revs('first(%s())' % (targetcat))
     elif targetcat == 'unstable':