mercurial/obsolete.py
changeset 46113 59fa3890d40a
parent 45942 89a2afe31e82
child 46780 6266d19556ad
equal deleted inserted replaced
46112:d6afa9c149c3 46113:59fa3890d40a
    72 import errno
    72 import errno
    73 import struct
    73 import struct
    74 
    74 
    75 from .i18n import _
    75 from .i18n import _
    76 from .pycompat import getattr
    76 from .pycompat import getattr
       
    77 from .node import (
       
    78     bin,
       
    79     hex,
       
    80     nullid,
       
    81 )
    77 from . import (
    82 from . import (
    78     encoding,
    83     encoding,
    79     error,
    84     error,
    80     node,
       
    81     obsutil,
    85     obsutil,
    82     phases,
    86     phases,
    83     policy,
    87     policy,
    84     pycompat,
    88     pycompat,
    85     util,
    89     util,
   233             parents = (metadata.pop(b'p1', None),)
   237             parents = (metadata.pop(b'p1', None),)
   234         elif b'p0' in metadata:
   238         elif b'p0' in metadata:
   235             parents = ()
   239             parents = ()
   236         if parents is not None:
   240         if parents is not None:
   237             try:
   241             try:
   238                 parents = tuple(node.bin(p) for p in parents)
   242                 parents = tuple(bin(p) for p in parents)
   239                 # if parent content is not a nodeid, drop the data
   243                 # if parent content is not a nodeid, drop the data
   240                 for p in parents:
   244                 for p in parents:
   241                     if len(p) != 20:
   245                     if len(p) != 20:
   242                         parents = None
   246                         parents = None
   243                         break
   247                         break
   260     if parents is not None:
   264     if parents is not None:
   261         if not parents:
   265         if not parents:
   262             # mark that we explicitly recorded no parents
   266             # mark that we explicitly recorded no parents
   263             metadata[b'p0'] = b''
   267             metadata[b'p0'] = b''
   264         for i, p in enumerate(parents, 1):
   268         for i, p in enumerate(parents, 1):
   265             metadata[b'p%i' % i] = node.hex(p)
   269             metadata[b'p%i' % i] = hex(p)
   266     metadata = _fm0encodemeta(metadata)
   270     metadata = _fm0encodemeta(metadata)
   267     numsuc = len(sucs)
   271     numsuc = len(sucs)
   268     format = _fm0fixed + (_fm0node * numsuc)
   272     format = _fm0fixed + (_fm0node * numsuc)
   269     data = [numsuc, len(metadata), flags, pre]
   273     data = [numsuc, len(metadata), flags, pre]
   270     data.extend(sucs)
   274     data.extend(sucs)
   527 
   531 
   528     Exist as a separated function to allow the evolve extension for a more
   532     Exist as a separated function to allow the evolve extension for a more
   529     subtle handling.
   533     subtle handling.
   530     """
   534     """
   531     for mark in markers:
   535     for mark in markers:
   532         if node.nullid in mark[1]:
   536         if nullid in mark[1]:
   533             raise error.Abort(
   537             raise error.Abort(
   534                 _(
   538                 _(
   535                     b'bad obsolescence marker detected: '
   539                     b'bad obsolescence marker detected: '
   536                     b'invalid successors nullid'
   540                     b'invalid successors nullid'
   537                 )
   541                 )
   637             for succ in succs:
   641             for succ in succs:
   638                 if len(succ) != 20:
   642                 if len(succ) != 20:
   639                     raise ValueError(succ)
   643                     raise ValueError(succ)
   640         if prec in succs:
   644         if prec in succs:
   641             raise ValueError(
   645             raise ValueError(
   642                 'in-marker cycle with %s' % pycompat.sysstr(node.hex(prec))
   646                 'in-marker cycle with %s' % pycompat.sysstr(hex(prec))
   643             )
   647             )
   644 
   648 
   645         metadata = tuple(sorted(pycompat.iteritems(metadata)))
   649         metadata = tuple(sorted(pycompat.iteritems(metadata)))
   646         for k, v in metadata:
   650         for k, v in metadata:
   647             try:
   651             try:
  1029     for p in relation[0] + relation[1]:
  1033     for p in relation[0] + relation[1]:
  1030         folddigest.update(b'%d' % p.rev())
  1034         folddigest.update(b'%d' % p.rev())
  1031         folddigest.update(p.node())
  1035         folddigest.update(p.node())
  1032     # Since fold only has to compete against fold for the same successors, it
  1036     # Since fold only has to compete against fold for the same successors, it
  1033     # seems fine to use a small ID. Smaller ID save space.
  1037     # seems fine to use a small ID. Smaller ID save space.
  1034     return node.hex(folddigest.digest())[:8]
  1038     return hex(folddigest.digest())[:8]
  1035 
  1039 
  1036 
  1040 
  1037 def createmarkers(
  1041 def createmarkers(
  1038     repo, relations, flag=0, date=None, metadata=None, operation=None
  1042     repo, relations, flag=0, date=None, metadata=None, operation=None
  1039 ):
  1043 ):