Mercurial > public > mercurial-scm > hg
comparison mercurial/obsolete.py @ 22270:e5adb6935239
obsstore: keep track of children information
We use the new `parents` field to build a dictionary of markers that touch
children of a node. This will be used to link prune markers to a set of
exchanged nodes.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Tue, 19 Aug 2014 16:53:53 -0700 |
parents | ca2e9cf77033 |
children | 8c69262df82d |
comparison
equal
deleted
inserted
replaced
22269:03cc81a28228 | 22270:e5adb6935239 |
---|---|
263 """Store obsolete markers | 263 """Store obsolete markers |
264 | 264 |
265 Markers can be accessed with two mappings: | 265 Markers can be accessed with two mappings: |
266 - precursors[x] -> set(markers on precursors edges of x) | 266 - precursors[x] -> set(markers on precursors edges of x) |
267 - successors[x] -> set(markers on successors edges of x) | 267 - successors[x] -> set(markers on successors edges of x) |
268 - children[x] -> set(markers on precursors edges of children(x) | |
268 """ | 269 """ |
269 | 270 |
270 fields = ('prec', 'succs', 'flag', 'meta', 'date', 'parents') | 271 fields = ('prec', 'succs', 'flag', 'meta', 'date', 'parents') |
271 # prec: nodeid, precursor changesets | 272 # prec: nodeid, precursor changesets |
272 # succs: tuple of nodeid, successor changesets (0-N length) | 273 # succs: tuple of nodeid, successor changesets (0-N length) |
280 # caches for various obsolescence related cache | 281 # caches for various obsolescence related cache |
281 self.caches = {} | 282 self.caches = {} |
282 self._all = [] | 283 self._all = [] |
283 self.precursors = {} | 284 self.precursors = {} |
284 self.successors = {} | 285 self.successors = {} |
286 self.children = {} | |
285 self.sopener = sopener | 287 self.sopener = sopener |
286 data = sopener.tryread('obsstore') | 288 data = sopener.tryread('obsstore') |
287 if data: | 289 if data: |
288 self._load(_readmarkers(data)) | 290 self._load(_readmarkers(data)) |
289 | 291 |
374 self._all.append(mark) | 376 self._all.append(mark) |
375 pre, sucs = mark[:2] | 377 pre, sucs = mark[:2] |
376 self.successors.setdefault(pre, set()).add(mark) | 378 self.successors.setdefault(pre, set()).add(mark) |
377 for suc in sucs: | 379 for suc in sucs: |
378 self.precursors.setdefault(suc, set()).add(mark) | 380 self.precursors.setdefault(suc, set()).add(mark) |
381 parents = mark[5] | |
382 if parents is not None: | |
383 for p in parents: | |
384 self.children.setdefault(p, set()).add(mark) | |
379 if node.nullid in self.precursors: | 385 if node.nullid in self.precursors: |
380 raise util.Abort(_('bad obsolescence marker detected: ' | 386 raise util.Abort(_('bad obsolescence marker detected: ' |
381 'invalid successors nullid')) | 387 'invalid successors nullid')) |
382 | 388 |
383 def _encodemarkers(markers, addheader=False): | 389 def _encodemarkers(markers, addheader=False): |