diff rhodecode/lib/vcs/backends/git/changeset.py @ 3496:58905069da21 beta

Speed up of last_changeset extraction in VCS, in edge cases for git we can get 10x speed improvement by limiting the history extraction if we only need last changeset
author Marcin Kuzminski <marcin@python-works.com>
date Thu, 07 Mar 2013 13:46:24 +0100
parents 0065f7fe60f6
children c04d1d9b6193
line wrap: on
line diff
--- a/rhodecode/lib/vcs/backends/git/changeset.py	Thu Mar 07 12:20:03 2013 +0100
+++ b/rhodecode/lib/vcs/backends/git/changeset.py	Thu Mar 07 13:46:24 2013 +0100
@@ -17,6 +17,7 @@
 from rhodecode.lib.vcs.utils import safe_unicode
 from rhodecode.lib.vcs.utils import date_fromtimestamp
 from rhodecode.lib.vcs.utils.lazy import LazyProperty
+from rhodecode.lib.utils2 import safe_int
 
 
 class GitChangeset(BaseChangeset):
@@ -275,10 +276,9 @@
         """
         Returns last commit of the file at the given ``path``.
         """
-        node = self.get_node(path)
-        return node.history[0]
+        return self.get_file_history(path, limit=1)[0]
 
-    def get_file_history(self, path):
+    def get_file_history(self, path, limit=None):
         """
         Returns history of file as reversed list of ``Changeset`` objects for
         which file at given ``path`` has been modified.
@@ -287,11 +287,16 @@
         which is generally not good. Should be replaced with algorithm
         iterating commits.
         """
+
         self._get_filectx(path)
-
-        cmd = 'log --pretty="format: %%H" -s -p %s -- "%s"' % (
-                  self.id, path
-               )
+        if limit:
+            cmd = 'log -n %s --pretty="format: %%H" -s -p %s -- "%s"' % (
+                      safe_int(limit, 0), self.id, path
+                   )
+        else:
+            cmd = 'log --pretty="format: %%H" -s -p %s -- "%s"' % (
+                      self.id, path
+                   )
         so, se = self.repository.run_git_command(cmd)
         ids = re.findall(r'[0-9a-fA-F]{40}', so)
         return [self.repository.get_changeset(id) for id in ids]