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.
--- a/mercurial/revset.py Thu Oct 11 22:58:34 2012 -0500
+++ b/mercurial/revset.py Mon Aug 13 21:50:45 2012 +0200
@@ -918,6 +918,25 @@
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 @@
"bisected": bisected,
"bookmark": bookmark,
"branch": branch,
+ "branchpoint": branchpoint,
"children": children,
"closed": closed,
"contains": contains,
--- a/tests/test-revset.t Thu Oct 11 22:58:34 2012 -0500
+++ b/tests/test-revset.t Mon Aug 13 21:50:45 2012 +0200
@@ -332,6 +332,9 @@
0
$ log 'merge()'
6
+ $ log 'branchpoint()'
+ 1
+ 4
$ log 'modifies(b)'
4
$ log 'modifies("path:b")'
@@ -362,6 +365,13 @@
$ log 'parents(merge())'
4
5
+ $ log 'p1(branchpoint())'
+ 0
+ 2
+ $ log 'p2(branchpoint())'
+ $ log 'parents(branchpoint())'
+ 0
+ 2
$ log 'removes(a)'
2
6