# HG changeset patch # User Ivan Andrus # Date 2012-08-13 19:50:45 # Node ID 69d5078d760decd9779c91095844b3d44c46475c # Parent 76b73ce0ffaca8b562747564ce89f4798b2275e5 revsets: add branchpoint() function The branchpoint() function returns changesets with more than one child. Eventually I would like to be able to see only branch points and merge points in a graphical log to see the topology of the repository. diff --git a/mercurial/revset.py b/mercurial/revset.py --- a/mercurial/revset.py +++ b/mercurial/revset.py @@ -918,6 +918,25 @@ def merge(repo, subset, x): cl = repo.changelog return [r for r in subset if cl.parentrevs(r)[1] != -1] +def branchpoint(repo, subset, x): + """``branchpoint()`` + Changesets with more than one child. + """ + # i18n: "branchpoint" is a keyword + getargs(x, 0, 0, _("branchpoint takes no arguments")) + cl = repo.changelog + if not subset: + return [] + baserev = min(subset) + parentscount = [0]*(len(repo) - baserev) + for r in xrange(baserev + 1, len(repo)): + for p in cl.parentrevs(r): + if p >= baserev: + parentscount[p - baserev] += 1 + branchpoints = set((baserev + i) for i in xrange(len(parentscount)) + if parentscount[i] > 1) + return [r for r in subset if r in branchpoints] + def minrev(repo, subset, x): """``min(set)`` Changeset with lowest revision number in set. @@ -1474,6 +1493,7 @@ symbols = { "bisected": bisected, "bookmark": bookmark, "branch": branch, + "branchpoint": branchpoint, "children": children, "closed": closed, "contains": contains, diff --git a/tests/test-revset.t b/tests/test-revset.t --- a/tests/test-revset.t +++ b/tests/test-revset.t @@ -332,6 +332,9 @@ quoting needed 0 $ log 'merge()' 6 + $ log 'branchpoint()' + 1 + 4 $ log 'modifies(b)' 4 $ log 'modifies("path:b")' @@ -362,6 +365,13 @@ quoting needed $ log 'parents(merge())' 4 5 + $ log 'p1(branchpoint())' + 0 + 2 + $ log 'p2(branchpoint())' + $ log 'parents(branchpoint())' + 0 + 2 $ log 'removes(a)' 2 6