Description: Lazily load more parts of the plugin
Author: Jelmer Vernooij <jelmer@debian.org>

=== modified file '__init__.py'
--- old/__init__.py	2011-12-04 01:37:31 +0000
+++ new/__init__.py	2012-01-04 22:21:32 +0000
@@ -34,7 +34,6 @@
 from bzrlib.branch import Branch
 from bzrlib import log
 from bzrlib.commands import plugin_cmds
-import index
 from bzrlib.smart.request import request_handlers as smart_request_handlers
 
 
@@ -51,7 +50,7 @@
 
 def auto_index_branch(result):
     """Handled for the post_change_branch_tip hook to update a search index."""
-    from bzrlib.plugins.search import errors
+    from bzrlib.plugins.search import errors, index
     try:
         search_index = index.open_index_branch(result.branch)
     except errors.NoSearchIndex:
@@ -65,18 +64,36 @@
         auto_index_branch, "index")
 
 
+def make_log_search_filter(branch, generate_delta, search, log_rev_iterator):
+    # Simple wrapper to avoid index.py being loaded until necessary.
+    from bzrlib.plugins.search.index import make_log_search_filter
+    return make_log_search_filter(branch, generate_delta, search,
+        log_rev_iterator)
+
+
+def make_disable_search_filter(branch, generate_delta, search, log_rev_iterator):
+    # Simple wrapper to avoid index.py being loaded until necessary.
+    from bzrlib.plugins.search.index import make_disable_search_filter
+    return make_disable_search_filter(branch, generate_delta, search,
+        log_rev_iterator)
+
+
 _install_hooks()
 
-if getattr(log, 'log_adapters', None):
-    # disable the regex search when bzr-search is active
-    index._original_make_search_filter = log._make_search_filter
-    log.log_adapters.insert(log.log_adapters.index(log._make_search_filter),
-        index.make_disable_search_filter)
-    log.log_adapters.remove(index._original_make_search_filter)
-    log._make_search_filter = index.make_disable_search_filter
-    # provide bzr-search based searches
-    log.log_adapters.insert(log.log_adapters.index(log._make_revision_objects),
-        index.make_log_search_filter)
+log_adapters = getattr(log, 'log_adapters', None)
+if log_adapters:
+    def restore_original_make_search_filter():
+        log_adapters[log_adapters.index(make_disable_search_filter)] = (
+            log._make_search_filter)
+        log_adapters.remove(make_log_search_filter)
+    def override_make_search_filter():
+        # disable the regex search when bzr-search is active
+        log_adapters[log_adapters.index(log._make_search_filter)] = (
+            make_disable_search_filter)
+        # add the log search filter
+        log_adapters.insert(log.log_adapters.index(log._make_revision_objects),
+            make_log_search_filter)
+    override_make_search_filter()
 
 
 smart_request_handlers.register_lazy(

=== modified file 'index.py'
--- old/index.py	2012-01-04 22:12:23 +0000
+++ new/index.py	2012-01-04 22:21:43 +0000
@@ -22,8 +22,12 @@
 import math
 import re
 
-from bzrlib import branch as _mod_branch
-from bzrlib import (ui, trace)
+from bzrlib import (
+    branch as _mod_branch,
+    log,
+    trace,
+    ui,
+    )
 from bzrlib.btree_index import BTreeGraphIndex, BTreeBuilder
 from bzrlib.bzrdir import BzrDirMeta1
 import bzrlib.config
@@ -1481,9 +1485,6 @@
                         yield (self, node_key, value)
 
 
-_original_make_search_filter = None
-
-
 def query_from_match(match):
     """Create a query from a 'bzr log' match dictionary or string.
 
@@ -1521,7 +1522,7 @@
             return log_rev_iterator
     except errors.NoSearchIndex:
         pass
-    return _original_make_search_filter(branch, generate_delta, match,
+    return log._make_search_filter(branch, generate_delta, match,
         log_rev_iterator)
 
 

=== modified file 'tests/test_index.py'
--- old/tests/test_index.py	2011-09-29 12:23:17 +0000
+++ new/tests/test_index.py	2012-01-04 22:21:32 +0000
@@ -23,7 +23,12 @@
 from bzrlib.index import InMemoryGraphIndex, GraphIndex
 from bzrlib import log
 from bzrlib.plugins import search
-from bzrlib.plugins.search import errors, index
+from bzrlib.plugins.search import (
+    errors,
+    index,
+    make_disable_search_filter,
+    make_log_search_filter,
+    )
 from bzrlib.tests import (
     condition_isinstance,
     multiply_tests,
@@ -731,9 +736,9 @@
 class TestLogFilter(TestCaseWithTransport):
 
     def test_registered(self):
-        self.assertTrue(index.make_disable_search_filter in log.log_adapters)
-        self.assertTrue(index.make_log_search_filter in log.log_adapters)
-        self.assertFalse(index._original_make_search_filter in log.log_adapters)
+        self.assertTrue(make_disable_search_filter in log.log_adapters)
+        self.assertTrue(make_log_search_filter in log.log_adapters)
+        self.assertFalse(log._make_search_filter in log.log_adapters)
 
     def test_get_filter_no_index(self):
         tree = self.make_branch_and_tree('foo')
@@ -771,11 +776,11 @@
         """A parsable regex becomes a index search."""
         # We test this by searching for something that a index search would
         # miss hit, and crippling the baseline search reference.
-        self.saved_orig = index._original_make_search_filter
+        self.saved_orig = log._make_search_filter
         def restore():
-            index._original_make_search_filter = self.saved_orig
+            log._make_search_filter = self.saved_orig
         self.addCleanup(restore)
-        index._original_make_search_filter = None
+        log._make_search_filter = None
         tree = self.make_branch_and_tree('foo')
         revid = tree.commit('first post')
         revid2 = tree.commit('second post')

