Mercurial > hg
changeset 17673:d686c6876ef6
clfilter: handle non contiguous iteration in `revlov.headrevs`
This prepares changelog level filtering. We can't assume that any revision can
be heads because filtered revisions need to be excluded.
New algorithm:
- All revisions now start as "non heads",
- every revision we iterate over is made candidate head,
- parents of iterated revisions are definitely not head.
Filtered revisions are never iterated over and never considered as candidate
head.
author | Pierre-Yves David <pierre-yves.david@logilab.fr> |
---|---|
date | Mon, 03 Sep 2012 14:12:45 +0200 |
parents | 474047947b8f |
children | e69274f8d444 |
files | mercurial/revlog.py |
diffstat | 1 files changed, 5 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/revlog.py Thu Sep 20 19:00:59 2012 +0200 +++ b/mercurial/revlog.py Mon Sep 03 14:12:45 2012 +0200 @@ -611,12 +611,14 @@ count = len(self) if not count: return [nullrev] - ishead = [1] * (count + 1) + # we won't iter over filtered rev so nobody is a head at start + ishead = [0] * (count + 1) index = self.index for r in self: + ishead[r] = 1 # I may be an head e = index[r] - ishead[e[5]] = ishead[e[6]] = 0 - return [r for r in xrange(count) if ishead[r]] + ishead[e[5]] = ishead[e[6]] = 0 # my parent are not + return [r for r, val in enumerate(ishead) if val] def heads(self, start=None, stop=None): """return the list of all nodes that have no children