mercurial/localrepo.py
changeset 7656 6a24fb994701
parent 7655 cce37dab7ad6
child 7670 e5f445c94226
--- a/mercurial/localrepo.py	Wed Jan 14 21:47:38 2009 -0500
+++ b/mercurial/localrepo.py	Wed Jan 14 21:47:38 2009 -0500
@@ -398,8 +398,21 @@
 
     def branchtags(self):
         '''return a dict where branch names map to the tipmost head of
-        the branch'''
-        return dict([(k, v[-1]) for (k, v) in self._branchheads().iteritems()])
+        the branch, open heads come before closed'''
+        bt = {}
+        for bn, heads in self._branchheads().iteritems():
+            head = None
+            for i in range(len(heads)-1, -1, -1):
+                h = heads[i]
+                if 'close' not in self.changelog.read(h)[5]:
+                    head = h
+                    break
+            # no open heads were found
+            if head is None:
+                head = heads[-1]
+            bt[bn] = head
+        return bt
+
 
     def _readbranchcache(self):
         partial = {}
@@ -1180,13 +1193,18 @@
         finally:
             del wlock
 
-    def heads(self, start=None):
+    def heads(self, start=None, closed=True):
         heads = self.changelog.heads(start)
+        def display(head):
+            if closed:
+                return True
+            extras = self.changelog.read(head)[5]
+            return ('close' not in extras)
         # sort the output in rev descending order
-        heads = [(-self.changelog.rev(h), h) for h in heads]
+        heads = [(-self.changelog.rev(h), h) for h in heads if display(h)]
         return [n for (r, n) in util.sort(heads)]
 
-    def branchheads(self, branch=None, start=None):
+    def branchheads(self, branch=None, start=None, closed=True):
         if branch is None:
             branch = self[None].branch()
         branches = self._branchheads()
@@ -1198,6 +1216,9 @@
         if start is not None:
             # filter out the heads that cannot be reached from startrev
             bheads = self.changelog.nodesbetween([start], bheads)[2]
+        if not closed:
+            bheads = [h for h in bheads if 
+                      ('close' not in self.changelog.read(h)[5])]
         return bheads
 
     def branches(self, nodes):