equal
deleted
inserted
replaced
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 ): |