Rev 3643: Refactoring in log towards more pluggable revision selection. in http://people.ubuntu.com/~robertc/baz2.0/log

Robert Collins robertc at robertcollins.net
Thu Aug 21 02:41:50 BST 2008


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

------------------------------------------------------------
revno: 3643
revision-id: robertc at robertcollins.net-20080821014143-0gabznzvn10vv3sl
parent: pqm at pqm.ubuntu.com-20080820164550-e4vt9gdxv8hlic7n
committer: Robert Collins <robertc at robertcollins.net>
branch nick: log
timestamp: Thu 2008-08-21 11:41:43 +1000
message:
  Refactoring in log towards more pluggable revision selection.
modified:
  bzrlib/log.py                  log.py-20050505065812-c40ce11702fe5fb1
=== modified file 'bzrlib/log.py'
--- a/bzrlib/log.py	2008-07-18 03:07:07 +0000
+++ b/bzrlib/log.py	2008-08-21 01:41:43 +0000
@@ -210,11 +210,6 @@
                                               specific_fileid,
                                               generate_merge_revisions,
                                               allow_single_merge_revision)
-    if search is not None:
-        searchRE = re.compile(search, re.IGNORECASE)
-    else:
-        searchRE = None
-
     rev_tag_dict = {}
     generate_tags = getattr(lf, 'supports_tags', False)
     if generate_tags:
@@ -225,12 +220,9 @@
 
     # now we just print all the revisions
     log_count = 0
-    for (rev_id, revno, merge_depth), rev, delta in _iter_revisions(
-        branch.repository, view_revisions, generate_delta):
-        if searchRE:
-            if not searchRE.search(rev.message):
-                continue
-
+    revision_iterator = make_log_rev_iterator(branch,
+        view_revisions, generate_delta, search)
+    for (rev_id, revno, merge_depth), rev, delta in revision_iterator:
         lr = LogRevision(rev, revno, merge_depth, delta,
                          rev_tag_dict.get(rev_id))
         lf.log_revision(lr)
@@ -295,6 +287,48 @@
         yield revision_id, str(start_revno - num), 0
 
 
+def make_log_rev_iterator(branch, view_revisions, generate_delta, search):
+    """Create a revision iterator for log.
+
+    :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.
+    :return: An iterator over ((rev_id, revno, merge_depth), rev, delta).
+    """
+    # core log logic
+    log_rev_iterator = _iter_revisions(branch.repository, view_revisions, generate_delta)
+    # filter on log messages
+    log_rev_iterator = make_search_filter(branch, view_revisions, generate_delta,
+        search, log_rev_iterator)
+    return log_rev_iterator
+
+
+def make_search_filter(branch, view_revisions, generate_delta, search,
+    log_rev_iterator):
+    """Create a filtered iterator of log_rev_iterator matching on a regex.
+
+    :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.
+    :return: An iterator over ((rev_id, revno, merge_depth), rev, delta).
+    """
+    if search is None:
+        return log_rev_iterator
+    # Compile the search now to get early errors.
+    searchRE = re.compile(search, re.IGNORECASE)
+    return _filter_message_re(searchRE, log_rev_iterator)
+
+
+def _filter_message_re(searchRE, log_rev_iterator):
+    for (rev_id, revno, merge_depth), rev, delta in log_rev_iterator:
+        if searchRE.search(rev.message):
+            yield (rev_id, revno, merge_depth), rev, delta
+
+
 def _iter_revisions(repository, view_revisions, generate_delta):
     num = 9
     view_revisions = iter(view_revisions)




More information about the bazaar-commits mailing list