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""" |