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):