diff options
author | Lorry <lorry@roadtrain.codethink.co.uk> | 2012-08-22 15:47:16 +0100 |
---|---|---|
committer | Lorry <lorry@roadtrain.codethink.co.uk> | 2012-08-22 15:47:16 +0100 |
commit | 25335618bf8755ce6b116ee14f47f5a1f2c821e9 (patch) | |
tree | d889d7ab3f9f985d0c54c534cb8052bd2e6d7163 /bzrlib/library_state.py | |
download | bzr-tarball-25335618bf8755ce6b116ee14f47f5a1f2c821e9.tar.gz |
Tarball conversion
Diffstat (limited to 'bzrlib/library_state.py')
-rw-r--r-- | bzrlib/library_state.py | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/bzrlib/library_state.py b/bzrlib/library_state.py new file mode 100644 index 0000000..0dab5d3 --- /dev/null +++ b/bzrlib/library_state.py @@ -0,0 +1,117 @@ +# Copyright (C) 2010 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +"""The core state needed to make use of bzr is managed here.""" + +from __future__ import absolute_import + +__all__ = [ + 'BzrLibraryState', + ] + + +import bzrlib +from bzrlib.lazy_import import lazy_import +lazy_import(globals(), """ +from bzrlib import ( + cleanup, + config, + osutils, + symbol_versioning, + trace, + ui, + ) +""") + + +class BzrLibraryState(object): + """The state about how bzrlib has been configured. + + This is the core state needed to make use of bzr. The current instance is + currently always exposed as bzrlib.global_state, but we desired to move + to a point where no global state is needed at all. + + :ivar saved_state: The bzrlib.global_state at the time __enter__ was + called. + :ivar cleanups: An ObjectWithCleanups which can be used for cleanups that + should occur when the use of bzrlib is completed. This is initialised + in __enter__ and executed in __exit__. + """ + + def __init__(self, ui, trace): + """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. 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. + + BzrLibraryState implements the Python 2.5 Context Manager protocol + PEP343, and can be used with the with statement. Upon __enter__ the + global variables in use by bzr are set, and they are cleared on + __exit__. + + :param ui: A bzrlib.ui.ui_factory to use. + :param trace: A bzrlib.trace.Config context manager to use, perhaps + bzrlib.trace.DefaultConfig. + """ + self._ui = ui + self._trace = trace + # There is no overrides by default, they are set later when the command + # arguments are parsed. + self.cmdline_overrides = config.CommandLineStore() + self.started = False + + def __enter__(self): + if not self.started: + self._start() + return self # This is bound to the 'as' clause in a with statement. + + def _start(self): + """Do all initialization.""" + # NB: This function tweaks so much global state it's hard to test it in + # isolation within the same interpreter. It's not reached on normal + # in-process run_bzr calls. If it's broken, we expect that + # TestRunBzrSubprocess may fail. + self.cleanups = cleanup.ObjectWithCleanups() + + if bzrlib.version_info[3] == 'final': + self.cleanups.add_cleanup( + symbol_versioning.suppress_deprecation_warnings(override=True)) + + self._trace.__enter__() + + 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 + self.started = True + + def __exit__(self, exc_type, exc_val, exc_tb): + self.cleanups.cleanup_now() + trace._flush_stdout_stderr() + trace._flush_trace() + osutils.report_extension_load_failures() + self._ui.__exit__(None, None, None) + self._trace.__exit__(None, None, None) + ui.ui_factory = self._orig_ui + bzrlib.global_state = self.saved_state + return False # propogate exceptions. |