equal
deleted
inserted
replaced
66 The header is followed by the markers. Marker format depend of the version. See |
66 The header is followed by the markers. Marker format depend of the version. See |
67 comment associated with each format for details. |
67 comment associated with each format for details. |
68 |
68 |
69 """ |
69 """ |
70 import errno, struct |
70 import errno, struct |
71 import util, base85, node, parsers |
71 import util, base85, node, parsers, error |
72 import phases |
72 import phases |
73 from i18n import _ |
73 from i18n import _ |
74 |
74 |
75 _pack = struct.pack |
75 _pack = struct.pack |
76 _unpack = struct.unpack |
76 _unpack = struct.unpack |
162 off += s |
162 off += s |
163 # read metadata |
163 # read metadata |
164 # (metadata will be decoded on demand) |
164 # (metadata will be decoded on demand) |
165 metadata = data[off:off + mdsize] |
165 metadata = data[off:off + mdsize] |
166 if len(metadata) != mdsize: |
166 if len(metadata) != mdsize: |
167 raise util.Abort(_('parsing obsolete marker: metadata is too ' |
167 raise error.Abort(_('parsing obsolete marker: metadata is too ' |
168 'short, %d bytes expected, got %d') |
168 'short, %d bytes expected, got %d') |
169 % (mdsize, len(metadata))) |
169 % (mdsize, len(metadata))) |
170 off += mdsize |
170 off += mdsize |
171 metadata = _fm0decodemeta(metadata) |
171 metadata = _fm0decodemeta(metadata) |
172 try: |
172 try: |
198 yield (pre, sucs, flags, metadata, date, parents) |
198 yield (pre, sucs, flags, metadata, date, parents) |
199 |
199 |
200 def _fm0encodeonemarker(marker): |
200 def _fm0encodeonemarker(marker): |
201 pre, sucs, flags, metadata, date, parents = marker |
201 pre, sucs, flags, metadata, date, parents = marker |
202 if flags & usingsha256: |
202 if flags & usingsha256: |
203 raise util.Abort(_('cannot handle sha256 with old obsstore format')) |
203 raise error.Abort(_('cannot handle sha256 with old obsstore format')) |
204 metadata = dict(metadata) |
204 metadata = dict(metadata) |
205 time, tz = date |
205 time, tz = date |
206 metadata['date'] = '%r %i' % (time, tz) |
206 metadata['date'] = '%r %i' % (time, tz) |
207 if parents is not None: |
207 if parents is not None: |
208 if not parents: |
208 if not parents: |
412 """Read and enumerate markers from raw data""" |
412 """Read and enumerate markers from raw data""" |
413 off = 0 |
413 off = 0 |
414 diskversion = _unpack('>B', data[off:off + 1])[0] |
414 diskversion = _unpack('>B', data[off:off + 1])[0] |
415 off += 1 |
415 off += 1 |
416 if diskversion not in formats: |
416 if diskversion not in formats: |
417 raise util.Abort(_('parsing obsolete marker: unknown version %r') |
417 raise error.Abort(_('parsing obsolete marker: unknown version %r') |
418 % diskversion) |
418 % diskversion) |
419 return diskversion, formats[diskversion][0](data, off) |
419 return diskversion, formats[diskversion][0](data, off) |
420 |
420 |
421 def encodemarkers(markers, addheader=False, version=_fm0version): |
421 def encodemarkers(markers, addheader=False, version=_fm0version): |
422 # Kept separate from flushmarkers(), it will be reused for |
422 # Kept separate from flushmarkers(), it will be reused for |
494 Exist as a separated function to allow the evolve extension for a more |
494 Exist as a separated function to allow the evolve extension for a more |
495 subtle handling. |
495 subtle handling. |
496 """ |
496 """ |
497 for mark in markers: |
497 for mark in markers: |
498 if node.nullid in mark[1]: |
498 if node.nullid in mark[1]: |
499 raise util.Abort(_('bad obsolescence marker detected: ' |
499 raise error.Abort(_('bad obsolescence marker detected: ' |
500 'invalid successors nullid')) |
500 'invalid successors nullid')) |
501 |
501 |
502 class obsstore(object): |
502 class obsstore(object): |
503 """Store obsolete markers |
503 """Store obsolete markers |
504 |
504 |
581 """Add new markers to the store |
581 """Add new markers to the store |
582 |
582 |
583 Take care of filtering duplicate. |
583 Take care of filtering duplicate. |
584 Return the number of new marker.""" |
584 Return the number of new marker.""" |
585 if self._readonly: |
585 if self._readonly: |
586 raise util.Abort('creating obsolete markers is not enabled on this ' |
586 raise error.Abort('creating obsolete markers is not enabled on ' |
587 'repo') |
587 'this repo') |
588 known = set(self._all) |
588 known = set(self._all) |
589 new = [] |
589 new = [] |
590 for m in markers: |
590 for m in markers: |
591 if m not in known: |
591 if m not in known: |
592 known.add(m) |
592 known.add(m) |
1215 localmetadata = metadata.copy() |
1215 localmetadata = metadata.copy() |
1216 if 2 < len(rel): |
1216 if 2 < len(rel): |
1217 localmetadata.update(rel[2]) |
1217 localmetadata.update(rel[2]) |
1218 |
1218 |
1219 if not prec.mutable(): |
1219 if not prec.mutable(): |
1220 raise util.Abort("cannot obsolete public changeset: %s" |
1220 raise error.Abort("cannot obsolete public changeset: %s" |
1221 % prec, |
1221 % prec, |
1222 hint='see "hg help phases" for details') |
1222 hint='see "hg help phases" for details') |
1223 nprec = prec.node() |
1223 nprec = prec.node() |
1224 nsucs = tuple(s.node() for s in sucs) |
1224 nsucs = tuple(s.node() for s in sucs) |
1225 npare = None |
1225 npare = None |
1226 if not nsucs: |
1226 if not nsucs: |
1227 npare = tuple(p.node() for p in prec.parents()) |
1227 npare = tuple(p.node() for p in prec.parents()) |
1228 if nprec in nsucs: |
1228 if nprec in nsucs: |
1229 raise util.Abort("changeset %s cannot obsolete itself" % prec) |
1229 raise error.Abort("changeset %s cannot obsolete itself" % prec) |
1230 repo.obsstore.create(tr, nprec, nsucs, flag, parents=npare, |
1230 repo.obsstore.create(tr, nprec, nsucs, flag, parents=npare, |
1231 date=date, metadata=localmetadata) |
1231 date=date, metadata=localmetadata) |
1232 repo.filteredrevcache.clear() |
1232 repo.filteredrevcache.clear() |
1233 tr.close() |
1233 tr.close() |
1234 finally: |
1234 finally: |
1248 return True |
1248 return True |
1249 |
1249 |
1250 # createmarkers must be enabled if other options are enabled |
1250 # createmarkers must be enabled if other options are enabled |
1251 if ((allowunstableopt in result or exchangeopt in result) and |
1251 if ((allowunstableopt in result or exchangeopt in result) and |
1252 not createmarkersopt in result): |
1252 not createmarkersopt in result): |
1253 raise util.Abort(_("'createmarkers' obsolete option must be enabled " |
1253 raise error.Abort(_("'createmarkers' obsolete option must be enabled " |
1254 "if other obsolete options are enabled")) |
1254 "if other obsolete options are enabled")) |
1255 |
1255 |
1256 return option in result |
1256 return option in result |