mercurial/obsolete.py
changeset 26587 56b2bcea2529
parent 26310 61efe9ef6ad4
child 26684 74ff350c208c
equal deleted inserted replaced
26586:d51c658d3f04 26587:56b2bcea2529
    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