[PATCH] fix bugs in localrepo.branchheads, take 2
Sune Foldager
cryo at cyanite.org
Wed Sep 23 06:20:28 CDT 2009
# HG changeset patch
# User Sune Foldager <cryo at cyanite.org>
# Date 1253704726 -7200
# Node ID 3cd38e388caaf8168c42b37076c634f784de68d6
# Parent a15813fae0a8f414228f9da768c235f9d017ebfa
localrepo: fix bugs in branchheads and add docstring
1. The call to reverse() reversed the list in place in the global branchmap.
2. The nodesbetween function doesn't preserve ordering.
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -1159,17 +1159,24 @@
return [n for (r, n) in sorted(heads)]
def branchheads(self, branch=None, start=None, closed=False):
+ '''return a (possibly filtered) list of heads for the given branch
+
+ Heads are returned in topological order, from newest to oldest.
+ If branch is None, use the dirstate branch.
+ If start is not None, return only heads reachable from start.
+ If closed is True, return heads that are marked as closed as well.
+ '''
if branch is None:
branch = self[None].branch()
branches = self.branchmap()
if branch not in branches:
return []
- bheads = branches[branch]
# the cache returns heads ordered lowest to highest
- bheads.reverse()
+ bheads = list(reversed(branches[branch]))
if start is not None:
# filter out the heads that cannot be reached from startrev
- bheads = self.changelog.nodesbetween([start], bheads)[2]
+ fbheads = set(self.changelog.nodesbetween([start], bheads)[2])
+ bheads = [h for h in bheads if h in fbheads]
if not closed:
bheads = [h for h in bheads if
('close' not in self.changelog.read(h)[5])]
More information about the Mercurial-devel
mailing list