diff --git a/mercurial/obsolete.py b/mercurial/obsolete.py --- a/mercurial/obsolete.py +++ b/mercurial/obsolete.py @@ -70,6 +70,7 @@ comment associated with each format for from __future__ import absolute_import import errno +import hashlib import struct from .i18n import _ @@ -954,6 +955,15 @@ def _computecontentdivergentset(repo): 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 @@ def createmarkers(repo, relations, flag= 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") diff --git a/tests/test-rebase-obsolete.t b/tests/test-rebase-obsolete.t --- a/tests/test-rebase-obsolete.t +++ b/tests/test-rebase-obsolete.t @@ -356,9 +356,9 @@ collapse rebase $ hg id --debug -r tip 4dc2197e807bae9817f09905b50ab288be2dbbcf tip $ hg debugobsolete - 42ccdea3bb16d28e1848c95fe2e44c000f3f21b1 4dc2197e807bae9817f09905b50ab288be2dbbcf 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'operation': 'rebase', 'user': 'test'} - 5fddd98957c8a54a4d436dfe1da9d87f21a1b97b 4dc2197e807bae9817f09905b50ab288be2dbbcf 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'operation': 'rebase', 'user': 'test'} - 32af7686d403cf45b5d95f2d70cebea587ac806a 4dc2197e807bae9817f09905b50ab288be2dbbcf 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'operation': 'rebase', 'user': 'test'} + 42ccdea3bb16d28e1848c95fe2e44c000f3f21b1 4dc2197e807bae9817f09905b50ab288be2dbbcf 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'fold-id': '6fb65cdc', 'fold-idx': '1', 'fold-size': '3', 'operation': 'rebase', 'user': 'test'} + 5fddd98957c8a54a4d436dfe1da9d87f21a1b97b 4dc2197e807bae9817f09905b50ab288be2dbbcf 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'fold-id': '6fb65cdc', 'fold-idx': '2', 'fold-size': '3', 'operation': 'rebase', 'user': 'test'} + 32af7686d403cf45b5d95f2d70cebea587ac806a 4dc2197e807bae9817f09905b50ab288be2dbbcf 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'fold-id': '6fb65cdc', 'fold-idx': '3', 'fold-size': '3', 'operation': 'rebase', 'user': 'test'} $ cd ..