Andrew Godwin avatar Andrew Godwin committed c8483d9

Probable fix for slowness with branch tip finding

Comments (0)

Files changed (1)

heechee/repo/hg.py

 import time
 import tempfile
 import os
+import heapq
 
 try:
     from cStringIO import StringIO
         Given an SVN revision, returns the commit which was most recently done
         but still older or equal to the revision.
         """
-        hg_revision = int(revision) - 1
-        for i in range(hg_revision, -1, -1):
-            changectx = self.hg_repo[i]
-            if changectx.branch() == branch:
-                return changectx
-        
-        # We've not found a match!
-        raise NoBranchError("Cannot find matching changeset for branch '%s'." % branch)
+        changectx = self.hg_repo[branch]
+        queue = []
+        while int(changectx) + 1 > revision:
+            # Add the parents of the current thing onto the queue
+            for new_changectx in changectx.parents():
+                heapq.heappush((int(new_changectx), new_changectx))
+            # Get the next changectx
+            try:
+                revno, changectx = queue.popleft()
+            except:
+                raise NoBranchError("Cannot find matching changeset for branch '%s'." % branch)
+        return changectx
+    
     
     def _tree_for_branch(self, branch, revision, name, parent):
         """
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.