Rev 5323: Restore the original ui_factory when existing BzrLibraryState. in http://bazaar.launchpad.net/~lifeless/bzr/globalzapping

Robert Collins robertc at robertcollins.net
Fri Jun 25 07:23:09 BST 2010


At http://bazaar.launchpad.net/~lifeless/bzr/globalzapping

------------------------------------------------------------
revno: 5323
revision-id: robertc at robertcollins.net-20100625062308-qx287gzfrehs1d21
parent: robertc at robertcollins.net-20100625061256-x2mbkcmcz5xb81wx
committer: Robert Collins <robertc at robertcollins.net>
branch nick: globalzapping
timestamp: Fri 2010-06-25 16:23:08 +1000
message:
  Restore the original ui_factory when existing BzrLibraryState.
=== modified file 'bzrlib/__init__.py'
--- a/bzrlib/__init__.py	2010-06-25 06:12:56 +0000
+++ b/bzrlib/__init__.py	2010-06-25 06:23:08 +0000
@@ -164,8 +164,15 @@
         BzrLibraryState directly.
     """
     import bzrlib.library_state
-    return bzrlib.library_state.BzrLibraryState(setup_ui=setup_ui, stdin=stdin,
-        stdout=stdout, stderr=stderr)
+    if setup_ui:
+        import bzrlib.ui
+        stdin = stdin or sys.stdin
+        stdout = stdout or sys.stdout
+        stderr = stderr or sys.stderr
+        ui_factory = bzrlib.ui.make_ui_for_terminal(stdin, stdout, stderr)
+    else:
+        ui_factory = None
+    return bzrlib.library_state.BzrLibraryState(ui=ui_factory)
 
 
 def test_suite():

=== modified file 'bzrlib/library_state.py'
--- a/bzrlib/library_state.py	2010-06-25 06:12:56 +0000
+++ b/bzrlib/library_state.py	2010-06-25 06:23:08 +0000
@@ -39,12 +39,13 @@
         in __enter__ and executed in __exit__.
     """
 
-    def __init__(self, setup_ui=True, stdin=None, stdout=None, stderr=None):
+    def __init__(self, ui=None):
         """Create library start for normal use of bzrlib.
 
         Most applications that embed bzrlib, including bzr itself, should just
         call bzrlib.initialize(), but it is possible to use the state class
-        directly.
+        directly. The initialize() function provides sensible defaults for a
+        CLI program, such as a text UI factory.
 
         More options may be added in future so callers should use named
         arguments.
@@ -54,16 +55,9 @@
         global variables in use by bzr are set, and they are cleared on
         __exit__.
 
-        :param setup_ui: If true (default) use a terminal UI; otherwise 
-            some other ui_factory must be assigned to `bzrlib.ui.ui_factory` by
-            the caller.
-        :param stdin, stdout, stderr: If provided, use these for terminal IO;
-            otherwise use the files in `sys`.
+        :param ui: A bzrlib.ui.ui_factory to use.
         """
-        self.setup_ui = setup_ui
-        self.stdin = stdin
-        self.stdout = stdout
-        self.stderr = stderr
+        self._ui = ui
 
     def __enter__(self):
         # NB: This function tweaks so much global state it's hard to test it in
@@ -84,13 +78,10 @@
             self.cleanups.add_cleanup(warning_cleanup)
         bzrlib.trace.enable_default_logging()
 
-        if self.setup_ui:
-            import bzrlib.ui
-            stdin = self.stdin or sys.stdin
-            stdout = self.stdout or sys.stdout
-            stderr = self.stderr or sys.stderr
-            bzrlib.ui.ui_factory = bzrlib.ui.make_ui_for_terminal(
-                stdin, stdout, stderr)
+        self._orig_ui = bzrlib.ui.ui_factory
+        bzrlib.ui.ui_factory = self._ui
+        self._ui.__enter__()
+
         self.saved_state = bzrlib.global_state
         bzrlib.global_state = self
         return self # This is bound to the 'as' clause in a with statement.
@@ -102,8 +93,8 @@
         bzrlib.trace._flush_trace()
         import bzrlib.osutils
         bzrlib.osutils.report_extension_load_failures()
-        bzrlib.ui.ui_factory.__exit__(None, None, None)
-        bzrlib.ui.ui_factory = None
+        self._ui.__exit__(None, None, None)
+        bzrlib.ui.ui_factory = self._orig_ui
         global global_state
         global_state = self.saved_state
         return False # propogate exceptions.

=== modified file 'bzrlib/tests/test_library_state.py'
--- a/bzrlib/tests/test_library_state.py	2010-06-25 06:12:56 +0000
+++ b/bzrlib/tests/test_library_state.py	2010-06-25 06:23:08 +0000
@@ -20,9 +20,20 @@
 from bzrlib import (
     library_state,
     tests,
+    ui as _mod_ui
     )
 
 
-class TestLibraryState(tests.TestCase):
+# TODO: once sufficiently cleaned up this should be able to be TestCase.
+class TestLibraryState(tests.TestCaseWithTransport):
 
-    pass
+    def test_ui_is_used(self):
+        ui = _mod_ui.SilentUIFactory()
+        state = library_state.BzrLibraryState(ui=ui)
+        orig_ui = _mod_ui.ui_factory
+        state.__enter__()
+        try:
+            self.assertEqual(ui, _mod_ui.ui_factory)
+        finally:
+            state.__exit__(None, None, None)
+            self.assertEqual(orig_ui, _mod_ui.ui_factory)




More information about the bazaar-commits mailing list