mercurial/obsolete.py
changeset 40042 208303a8172c
parent 40029 e2697acd9381
child 40081 a4d62ff9a86d
--- a/mercurial/obsolete.py	Wed Oct 03 11:59:47 2018 +0200
+++ b/mercurial/obsolete.py	Wed Sep 26 23:50:14 2018 +0200
@@ -70,6 +70,7 @@
 from __future__ import absolute_import
 
 import errno
+import hashlib
 import struct
 
 from .i18n import _
@@ -954,6 +955,15 @@
             toprocess.update(obsstore.predecessors.get(prec, ()))
     return divergent
 
+def makefoldid(relation, user):
+
+    folddigest = hashlib.sha1(user)
+    for p in relation[0] + relation[1]:
+        folddigest.update('%d' % p.rev())
+        folddigest.update(p.node())
+    # Since fold only has to compete against fold for the same successors, it
+    # seems fine to use a small ID. Smaller ID save space.
+    return node.hex(folddigest.digest())[:8]
 
 def createmarkers(repo, relations, flag=0, date=None, metadata=None,
                   operation=None):
@@ -1000,11 +1010,19 @@
             if len(predecessors) > 1 and len(rel[1]) != 1:
                 msg = 'Fold markers can only have 1 successors, not %d'
                 raise error.ProgrammingError(msg % len(rel[1]))
-            for prec in predecessors:
+            foldid = None
+            foldsize = len(predecessors)
+            if 1 < foldsize:
+                foldid = makefoldid(rel, metadata['user'])
+            for foldidx, prec in enumerate(predecessors, 1):
                 sucs = rel[1]
                 localmetadata = metadata.copy()
                 if len(rel) > 2:
                     localmetadata.update(rel[2])
+                if foldid is not None:
+                    localmetadata['fold-id'] = foldid
+                    localmetadata['fold-idx'] = '%d' % foldidx
+                    localmetadata['fold-size'] = '%d' % foldsize
 
                 if not prec.mutable():
                     raise error.Abort(_("cannot obsolete public changeset: %s")