Rev 3645: Split out delta generation from revision content reading, and structure it after message evaluation, increasing performance of log -v -m. in http://people.ubuntu.com/~robertc/baz2.0/log

Robert Collins robertc at robertcollins.net
Thu Aug 21 03:32:30 BST 2008


At http://people.ubuntu.com/~robertc/baz2.0/log

------------------------------------------------------------
revno: 3645
revision-id: robertc at robertcollins.net-20080821023225-4vhy9yq7884myw3c
parent: robertc at robertcollins.net-20080821020100-hnqht1b4wt0ixqqp
committer: Robert Collins <robertc at robertcollins.net>
branch nick: log
timestamp: Thu 2008-08-21 12:32:25 +1000
message:
  Split out delta generation from revision content reading, and structure it after message evaluation, increasing performance of log -v -m.
modified:
  bzrlib/log.py                  log.py-20050505065812-c40ce11702fe5fb1
=== modified file 'bzrlib/log.py'
--- a/bzrlib/log.py	2008-08-21 02:01:00 +0000
+++ b/bzrlib/log.py	2008-08-21 02:32:25 +0000
@@ -304,6 +304,9 @@
     # filter on log messages
     log_rev_iterator = make_search_filter(branch, view_revisions, generate_delta,
         search, log_rev_iterator)
+    # generate deltas for things we will show
+    log_rev_iterator = make_delta_filter(branch, view_revisions, generate_delta,
+        search, log_rev_iterator)
     return log_rev_iterator
 
 
@@ -329,9 +332,37 @@
 
 def _filter_message_re(searchRE, log_rev_iterator):
     for revs in log_rev_iterator:
+        new_revs = []
         for (rev_id, revno, merge_depth), rev, delta in revs:
             if searchRE.search(rev.message):
-                yield (rev_id, revno, merge_depth), rev, delta
+                new_revs.append(((rev_id, revno, merge_depth), rev, delta))
+        yield new_revs
+
+
+def make_delta_filter(branch, view_revisions, generate_delta, search,
+    log_rev_iterator):
+    """Add revision deltas to a log iterator if needed.
+
+    :param branch: The branch being logged.
+    :param view_revisions: The revisions being viewed.
+    :param generate_delta: Whether to generate a delta for each revision.
+    :param search: A user text search string.
+    :param log_rev_iterator: An input iterator containing all revisions that
+        could be displayed, in lists.
+    :return: An iterator over lists of ((rev_id, revno, merge_depth), rev,
+        delta).
+    """
+    if not generate_delta:
+        return log_rev_iterator
+    return _generate_deltas(branch.repository, log_rev_iterator)
+
+
+def _generate_deltas(repository, log_rev_iterator):
+    for revs in log_rev_iterator:
+        revisions = [rev[1] for rev in revs]
+        deltas = repository.get_deltas_for_revisions(revisions)
+        revs = [(rev[0], rev[1], delta) for rev, delta in izip(revs, deltas)]
+        yield revs
 
 
 def _iter_revisions(branch, view_revisions, generate_delta, search):
@@ -350,15 +381,10 @@
         cur_view_revisions = [d for x, d in zip(range(num), view_revisions)]
         if len(cur_view_revisions) == 0:
             break
-        cur_deltas = {}
         # r = revision, n = revno, d = merge depth
         revision_ids = [r for (r, n, d) in cur_view_revisions]
         revisions = repository.get_revisions(revision_ids)
-        if generate_delta:
-            deltas = repository.get_deltas_for_revisions(revisions)
-        else:
-            deltas = [None] * num
-        yield zip(cur_view_revisions, revisions, deltas)
+        yield zip(cur_view_revisions, revisions, [None] * num)
         num = min(int(num * 1.5), 200)
 
 




More information about the bazaar-commits mailing list