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