171 try: |
171 try: |
172 date = util.parsedate(decodemeta(metadata).pop('date', '0 0')) |
172 date = util.parsedate(decodemeta(metadata).pop('date', '0 0')) |
173 except util.Abort: |
173 except util.Abort: |
174 date = (0., 0) |
174 date = (0., 0) |
175 |
175 |
176 yield (pre, sucs, flags, metadata, date) |
176 yield (pre, sucs, flags, metadata, date, None) |
177 |
177 |
178 def encodemeta(meta): |
178 def encodemeta(meta): |
179 """Return encoded metadata string to string mapping. |
179 """Return encoded metadata string to string mapping. |
180 |
180 |
181 Assume no ':' in key and no '\0' in both key and value.""" |
181 Assume no ':' in key and no '\0' in both key and value.""" |
240 Markers can be accessed with two mappings: |
240 Markers can be accessed with two mappings: |
241 - precursors[x] -> set(markers on precursors edges of x) |
241 - precursors[x] -> set(markers on precursors edges of x) |
242 - successors[x] -> set(markers on successors edges of x) |
242 - successors[x] -> set(markers on successors edges of x) |
243 """ |
243 """ |
244 |
244 |
245 fields = ('prec', 'succs', 'flag', 'meta', 'date') |
245 fields = ('prec', 'succs', 'flag', 'meta', 'date', 'parents') |
246 # prec: nodeid, precursor changesets |
246 # prec: nodeid, precursor changesets |
247 # succs: tuple of nodeid, successor changesets (0-N length) |
247 # succs: tuple of nodeid, successor changesets (0-N length) |
248 # flag: integer, flag field carrying modifier for the markers (see doc) |
248 # flag: integer, flag field carrying modifier for the markers (see doc) |
249 # meta: binary blob, encoded metadata dictionary |
249 # meta: binary blob, encoded metadata dictionary |
250 # date: (float, int) tuple, date of marker creation |
250 # date: (float, int) tuple, date of marker creation |
|
251 # parents: (tuple of nodeid) or None, parents of precursors |
|
252 # None is used when no data has been recorded |
251 |
253 |
252 def __init__(self, sopener): |
254 def __init__(self, sopener): |
253 # caches for various obsolescence related cache |
255 # caches for various obsolescence related cache |
254 self.caches = {} |
256 self.caches = {} |
255 self._all = [] |
257 self._all = [] |
298 if len(succ) != 20: |
300 if len(succ) != 20: |
299 raise ValueError(succ) |
301 raise ValueError(succ) |
300 if prec in succs: |
302 if prec in succs: |
301 raise ValueError(_('in-marker cycle with %s') % node.hex(prec)) |
303 raise ValueError(_('in-marker cycle with %s') % node.hex(prec)) |
302 marker = (str(prec), tuple(succs), int(flag), encodemeta(metadata), |
304 marker = (str(prec), tuple(succs), int(flag), encodemeta(metadata), |
303 date) |
305 date, None) |
304 return bool(self.add(transaction, [marker])) |
306 return bool(self.add(transaction, [marker])) |
305 |
307 |
306 def add(self, transaction, markers): |
308 def add(self, transaction, markers): |
307 """Add new markers to the store |
309 """Add new markers to the store |
308 |
310 |
362 for marker in markers: |
364 for marker in markers: |
363 yield _encodeonemarker(marker) |
365 yield _encodeonemarker(marker) |
364 |
366 |
365 |
367 |
366 def _encodeonemarker(marker): |
368 def _encodeonemarker(marker): |
367 pre, sucs, flags, metadata, date = marker |
369 pre, sucs, flags, metadata, date, parents = marker |
368 metadata = decodemeta(metadata) |
370 metadata = decodemeta(metadata) |
369 metadata['date'] = '%d %i' % date |
371 metadata['date'] = '%d %i' % date |
370 metadata = encodemeta(metadata) |
372 metadata = encodemeta(metadata) |
371 nbsuc = len(sucs) |
373 nbsuc = len(sucs) |
372 format = _fmfixed + (_fmnode * nbsuc) |
374 format = _fmfixed + (_fmnode * nbsuc) |