Description: lazy load bzr-search plugin
Author: Jelmer Vernooij <jelmer@samba.org>

=== modified file '__init__.py'
--- old/__init__.py	2008-08-28 02:13:47 +0000
+++ new/__init__.py	2011-09-08 13:39:01 +0000
@@ -30,21 +30,17 @@
 See `bzr help search` or `bzr help plugins/search`.
 """
 
-import bzrlib.commands
-
-# Relative because at __init__ time the module does not exist.
+from bzrlib import log
 from bzrlib.branch import Branch
-from bzrlib import log
-import commands
-import errors
-import index
+from bzrlib.commands import plugin_cmds
 
 
 for command in [
     'index',
     'search',
     ]:
-    bzrlib.commands.register_command(getattr(commands, 'cmd_' + command))
+    plugin_cmds.register_lazy(
+        'cmd_%s' % command, [], 'bzrlib.plugins.search.commands')
 
 
 version_info = (1, 7, 0, 'dev', 0)
@@ -52,6 +48,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, index
     try:
         search_index = index.open_index_branch(result.branch)
     except errors.NoSearchIndex:
@@ -65,18 +62,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()
 
 
 def test_suite():

=== modified file 'index.py'
--- old/index.py	2011-09-19 23:34:37 +0000
+++ new/index.py	2011-09-29 12:19:47 +0000
@@ -22,7 +22,10 @@
 import math
 import re
 
-from bzrlib import branch as _mod_branch
+from bzrlib import (
+    branch as _mod_branch,
+    log,
+    )
 from bzrlib import ui
 from bzrlib.btree_index import BTreeGraphIndex, BTreeBuilder
 from bzrlib.bzrdir import BzrDirMeta1
@@ -1460,9 +1463,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.
 
@@ -1500,7 +1500,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-08 13:55:35 +0000
+++ new/tests/test_index.py	2011-09-29 12:18:47 +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')

