mercurial/obsolete.py
changeset 40042 208303a8172c
parent 40029 e2697acd9381
child 40081 a4d62ff9a86d
equal deleted inserted replaced
40041:ca9d0c93acea 40042:208303a8172c
    68 
    68 
    69 """
    69 """
    70 from __future__ import absolute_import
    70 from __future__ import absolute_import
    71 
    71 
    72 import errno
    72 import errno
       
    73 import hashlib
    73 import struct
    74 import struct
    74 
    75 
    75 from .i18n import _
    76 from .i18n import _
    76 from . import (
    77 from . import (
    77     encoding,
    78     encoding,
   952                 divergent.add(rev)
   953                 divergent.add(rev)
   953                 break
   954                 break
   954             toprocess.update(obsstore.predecessors.get(prec, ()))
   955             toprocess.update(obsstore.predecessors.get(prec, ()))
   955     return divergent
   956     return divergent
   956 
   957 
       
   958 def makefoldid(relation, user):
       
   959 
       
   960     folddigest = hashlib.sha1(user)
       
   961     for p in relation[0] + relation[1]:
       
   962         folddigest.update('%d' % p.rev())
       
   963         folddigest.update(p.node())
       
   964     # Since fold only has to compete against fold for the same successors, it
       
   965     # seems fine to use a small ID. Smaller ID save space.
       
   966     return node.hex(folddigest.digest())[:8]
   957 
   967 
   958 def createmarkers(repo, relations, flag=0, date=None, metadata=None,
   968 def createmarkers(repo, relations, flag=0, date=None, metadata=None,
   959                   operation=None):
   969                   operation=None):
   960     """Add obsolete markers between changesets in a repo
   970     """Add obsolete markers between changesets in a repo
   961 
   971 
   998                 # preserve compat with old API until all caller are migrated
  1008                 # preserve compat with old API until all caller are migrated
   999                 predecessors = (predecessors,)
  1009                 predecessors = (predecessors,)
  1000             if len(predecessors) > 1 and len(rel[1]) != 1:
  1010             if len(predecessors) > 1 and len(rel[1]) != 1:
  1001                 msg = 'Fold markers can only have 1 successors, not %d'
  1011                 msg = 'Fold markers can only have 1 successors, not %d'
  1002                 raise error.ProgrammingError(msg % len(rel[1]))
  1012                 raise error.ProgrammingError(msg % len(rel[1]))
  1003             for prec in predecessors:
  1013             foldid = None
       
  1014             foldsize = len(predecessors)
       
  1015             if 1 < foldsize:
       
  1016                 foldid = makefoldid(rel, metadata['user'])
       
  1017             for foldidx, prec in enumerate(predecessors, 1):
  1004                 sucs = rel[1]
  1018                 sucs = rel[1]
  1005                 localmetadata = metadata.copy()
  1019                 localmetadata = metadata.copy()
  1006                 if len(rel) > 2:
  1020                 if len(rel) > 2:
  1007                     localmetadata.update(rel[2])
  1021                     localmetadata.update(rel[2])
       
  1022                 if foldid is not None:
       
  1023                     localmetadata['fold-id'] = foldid
       
  1024                     localmetadata['fold-idx'] = '%d' % foldidx
       
  1025                     localmetadata['fold-size'] = '%d' % foldsize
  1008 
  1026 
  1009                 if not prec.mutable():
  1027                 if not prec.mutable():
  1010                     raise error.Abort(_("cannot obsolete public changeset: %s")
  1028                     raise error.Abort(_("cannot obsolete public changeset: %s")
  1011                                      % prec,
  1029                                      % prec,
  1012                                      hint="see 'hg help phases' for details")
  1030                                      hint="see 'hg help phases' for details")