mercurial/obsolete.py
changeset 22327 f737631a9f0a
parent 22326 370b71622670
child 22328 fba8c1a4ce21
equal deleted inserted replaced
22326:370b71622670 22327:f737631a9f0a
    97 # the obsolete feature is not mature enough to be enabled by default.
    97 # the obsolete feature is not mature enough to be enabled by default.
    98 # you have to rely on third party extension extension to enable this.
    98 # you have to rely on third party extension extension to enable this.
    99 _enabled = False
    99 _enabled = False
   100 
   100 
   101 # data used for parsing and writing
   101 # data used for parsing and writing
   102 _fmversion = 0
   102 _fm0version = 0
   103 _fmfixed   = '>BIB20s'
   103 _fm0fixed   = '>BIB20s'
   104 _fmnode = '20s'
   104 _fm0node = '20s'
   105 _fmfsize = struct.calcsize(_fmfixed)
   105 _fm0fsize = struct.calcsize(_fm0fixed)
   106 _fmfnodesize = struct.calcsize(_fmnode)
   106 _fm0fnodesize = struct.calcsize(_fm0node)
   107 
   107 
   108 ### obsolescence marker flag
   108 ### obsolescence marker flag
   109 
   109 
   110 ## bumpedfix flag
   110 ## bumpedfix flag
   111 #
   111 #
   140 def _readmarkers(data):
   140 def _readmarkers(data):
   141     """Read and enumerate markers from raw data"""
   141     """Read and enumerate markers from raw data"""
   142     off = 0
   142     off = 0
   143     diskversion = _unpack('>B', data[off:off + 1])[0]
   143     diskversion = _unpack('>B', data[off:off + 1])[0]
   144     off += 1
   144     off += 1
   145     if diskversion != _fmversion:
   145     if diskversion != _fm0version:
   146         raise util.Abort(_('parsing obsolete marker: unknown version %r')
   146         raise util.Abort(_('parsing obsolete marker: unknown version %r')
   147                          % diskversion)
   147                          % diskversion)
   148 
   148 
   149     # Loop on markers
   149     # Loop on markers
   150     l = len(data)
   150     l = len(data)
   151     while off + _fmfsize <= l:
   151     while off + _fm0fsize <= l:
   152         # read fixed part
   152         # read fixed part
   153         cur = data[off:off + _fmfsize]
   153         cur = data[off:off + _fm0fsize]
   154         off += _fmfsize
   154         off += _fm0fsize
   155         nbsuc, mdsize, flags, pre = _unpack(_fmfixed, cur)
   155         nbsuc, mdsize, flags, pre = _unpack(_fm0fixed, cur)
   156         # read replacement
   156         # read replacement
   157         sucs = ()
   157         sucs = ()
   158         if nbsuc:
   158         if nbsuc:
   159             s = _fmfnodesize * nbsuc
   159             s = (_fm0fnodesize * nbsuc)
   160             cur = data[off:off + s]
   160             cur = data[off:off + s]
   161             sucs = _unpack(_fmnode * nbsuc, cur)
   161             sucs = _unpack(_fm0node * nbsuc, cur)
   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:
   420 
   420 
   421 def _encodemarkers(markers, addheader=False):
   421 def _encodemarkers(markers, addheader=False):
   422     # Kept separate from flushmarkers(), it will be reused for
   422     # Kept separate from flushmarkers(), it will be reused for
   423     # markers exchange.
   423     # markers exchange.
   424     if addheader:
   424     if addheader:
   425         yield _pack('>B', _fmversion)
   425         yield _pack('>B', _fm0version)
   426     for marker in markers:
   426     for marker in markers:
   427         yield _encodeonemarker(marker)
   427         yield _encodeonemarker(marker)
   428 
   428 
   429 
   429 
   430 def _encodeonemarker(marker):
   430 def _encodeonemarker(marker):
   437             metadata['p0'] = ''
   437             metadata['p0'] = ''
   438         for i, p in enumerate(parents):
   438         for i, p in enumerate(parents):
   439             metadata['p%i' % (i + 1)] = node.hex(p)
   439             metadata['p%i' % (i + 1)] = node.hex(p)
   440     metadata = encodemeta(metadata)
   440     metadata = encodemeta(metadata)
   441     nbsuc = len(sucs)
   441     nbsuc = len(sucs)
   442     format = _fmfixed + (_fmnode * nbsuc)
   442     format = _fm0fixed + (_fm0node * nbsuc)
   443     data = [nbsuc, len(metadata), flags, pre]
   443     data = [nbsuc, len(metadata), flags, pre]
   444     data.extend(sucs)
   444     data.extend(sucs)
   445     return _pack(format, *data) + metadata
   445     return _pack(format, *data) + metadata
   446 
   446 
   447 # arbitrary picked to fit into 8K limit from HTTP server
   447 # arbitrary picked to fit into 8K limit from HTTP server
   465             currentlen = 0
   465             currentlen = 0
   466             parts.append(currentpart)
   466             parts.append(currentpart)
   467         currentpart.append(nextdata)
   467         currentpart.append(nextdata)
   468         currentlen += len(nextdata)
   468         currentlen += len(nextdata)
   469     for idx, part in enumerate(reversed(parts)):
   469     for idx, part in enumerate(reversed(parts)):
   470         data = ''.join([_pack('>B', _fmversion)] + part)
   470         data = ''.join([_pack('>B', _fm0version)] + part)
   471         keys['dump%i' % idx] = base85.b85encode(data)
   471         keys['dump%i' % idx] = base85.b85encode(data)
   472     return keys
   472     return keys
   473 
   473 
   474 def listmarkers(repo):
   474 def listmarkers(repo):
   475     """List markers over pushkey"""
   475     """List markers over pushkey"""