Mercurial > hg-stable
diff mercurial/obsolete.py @ 18984:efef056b1ae9
obsolete: extract foreground computation from bookmark.validdest
This foreground logic will be reused by update logic.
author | Pierre-Yves David <pierre-yves.david@logilab.fr> |
---|---|
date | Tue, 16 Apr 2013 15:16:33 +0200 |
parents | e9331e979d7a |
children | f74f2a4e3327 |
line wrap: on
line diff
--- a/mercurial/obsolete.py Mon Apr 15 17:10:58 2013 +0200 +++ b/mercurial/obsolete.py Tue Apr 16 15:16:33 2013 +0200 @@ -405,6 +405,33 @@ seen.add(suc) remaining.add(suc) +def foreground(repo, nodes): + """return all nodes in the "foreground" of other node + + The foreground of a revision is anything reachable using parent -> children + or precursor -> sucessor relation. It is very similars to "descendant" but + augmented with obsolescence information. + + Beware that possible obsolescence cycle may result if complexe situation. + """ + repo = repo.unfiltered() + foreground = set(repo.set('%ln::', nodes)) + if repo.obsstore: + # We only need this complicated logic if there is obsolescence + # XXX will probably deserve an optimised revset. + nm = repo.changelog.nodemap + plen = -1 + # compute the whole set of successors or descendants + while len(foreground) != plen: + plen = len(foreground) + succs = set(c.node() for c in foreground) + mutable = [c.node() for c in foreground if c.mutable()] + succs.update(allsuccessors(repo.obsstore, mutable)) + known = (n for n in succs if n in nm) + foreground = set(repo.set('%ln::', known)) + return set(c.node() for c in foreground) + + def successorssets(repo, initialnode, cache=None): """Return all set of successors of initial nodes