I fixed the error message according to Jelmer's comment. I am not able to use `breezy.global_state` to store this value because that object is not initialized when `config_dir()` is called for the first four times. The advantage of storing an attribute on the `config_dir` function within `config.py` is that it is guaranteed to be available when the function is called. Here's the experiment I tried: --- old/breezy/config.py 2017-06-15 01:07:35 +0000 +++ new/breezy/config.py 2017-07-03 18:35:48 +0000 @@ -1405,10 +1405,16 @@ By default this is %APPDATA%/breezy on Windows, $XDG_CONFIG_HOME/breezy on Mac OS X and Linux. If the breezy config directory doesn't exist but - the bazaar one (see bazaar_config_dir()) does, use that instead. + the bazaar one (see bazaar_config_dir()) does, use that instead, with a + warning. TODO: Global option --config-dir to override this. """ + # return memo-ized result if we have already been here + existing_dir = getattr(breezy.global_state, 'config_dir', None) + if existing_dir is not None: + return existing_dir + base = osutils.path_from_environ('BRZ_HOME') if sys.platform == 'win32': if base is None: @@ -1423,12 +1429,21 @@ base = osutils.pathjoin(osutils._get_home_dir(), ".config") breezy_dir = osutils.pathjoin(base, 'breezy') if osutils.isdir(breezy_dir): + print "setting global_state.config_dir", breezy_dir + breezy.global_state.config_dir = breezy_dir return breezy_dir # If the breezy directory doesn't exist, but the bazaar one does, use that: bazaar_dir = bazaar_config_dir() if osutils.isdir(bazaar_dir): - trace.mutter( - "Using Bazaar configuration directory (%s)", bazaar_dir) + sys.stderr.write("Using fallback Bazaar configuration directory (%s) " + "rather than (%s).\n" % (bazaar_dir, breezy_dir)) + try: + print "setting global_state.config_dir", bazaar_dir + breezy.global_state.config_dir = bazaar_dir + except AttributeError: + print "failed to set global_state.config_dir" + import traceback; traceback.print_stack() + pass return bazaar_dir return breezy_dir Gives the following output where it tries to set global_state.config_dir four times unsuccessfully: $ ./brz --help Using fallback Bazaar configuration directory (/Users/neil/.bazaar) rather than (/Users/neil/.config/breezy). setting global_state.config_dir /Users/neil/.bazaar failed to set global_state.config_dir File "./brz", line 111, in library_state = breezy.initialize() File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/__init__.py", line 228, in initialize ui_factory = breezy.ui.make_ui_for_terminal(stdin, stdout, stderr) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/ui/__init__.py", line 528, in make_ui_for_terminal stdin = _wrap_in_stream(stdin) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/ui/text.py", line 651, in _wrap_in_stream encoding = _get_stream_encoding(stream) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/ui/text.py", line 634, in _get_stream_encoding encoding = config.GlobalStack().get('output_encoding') File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/config.py", line 3913, in __init__ gstore = self.get_shared_store(GlobalStore()) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/config.py", line 3378, in __init__ config_dir(), possible_transports=possible_transports) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/config.py", line 1445, in config_dir import traceback; traceback.print_stack() Using fallback Bazaar configuration directory (/Users/neil/.bazaar) rather than (/Users/neil/.config/breezy). setting global_state.config_dir /Users/neil/.bazaar failed to set global_state.config_dir File "./brz", line 111, in library_state = breezy.initialize() File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/__init__.py", line 228, in initialize ui_factory = breezy.ui.make_ui_for_terminal(stdin, stdout, stderr) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/ui/__init__.py", line 529, in make_ui_for_terminal stdout = _wrap_out_stream(stdout) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/ui/text.py", line 659, in _wrap_out_stream encoding = _get_stream_encoding(stream) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/ui/text.py", line 634, in _get_stream_encoding encoding = config.GlobalStack().get('output_encoding') File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/config.py", line 3913, in __init__ gstore = self.get_shared_store(GlobalStore()) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/config.py", line 3378, in __init__ config_dir(), possible_transports=possible_transports) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/config.py", line 1445, in config_dir import traceback; traceback.print_stack() Using fallback Bazaar configuration directory (/Users/neil/.bazaar) rather than (/Users/neil/.config/breezy). setting global_state.config_dir /Users/neil/.bazaar failed to set global_state.config_dir File "./brz", line 111, in library_state = breezy.initialize() File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/__init__.py", line 228, in initialize ui_factory = breezy.ui.make_ui_for_terminal(stdin, stdout, stderr) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/ui/__init__.py", line 530, in make_ui_for_terminal stderr = _wrap_out_stream(stderr) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/ui/text.py", line 659, in _wrap_out_stream encoding = _get_stream_encoding(stream) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/ui/text.py", line 634, in _get_stream_encoding encoding = config.GlobalStack().get('output_encoding') File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/config.py", line 3913, in __init__ gstore = self.get_shared_store(GlobalStore()) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/config.py", line 3378, in __init__ config_dir(), possible_transports=possible_transports) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/config.py", line 1445, in config_dir import traceback; traceback.print_stack() Using fallback Bazaar configuration directory (/Users/neil/.bazaar) rather than (/Users/neil/.config/breezy). setting global_state.config_dir /Users/neil/.bazaar failed to set global_state.config_dir File "./brz", line 111, in library_state = breezy.initialize() File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/__init__.py", line 228, in initialize ui_factory = breezy.ui.make_ui_for_terminal(stdin, stdout, stderr) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/ui/__init__.py", line 531, in make_ui_for_terminal return TextUIFactory(stdin, stdout, stderr) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/ui/text.py", line 177, in __init__ self._progress_view = self.make_progress_view() File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/ui/text.py", line 287, in make_progress_view pb_type = config.GlobalStack().get('progress_bar') File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/config.py", line 3913, in __init__ gstore = self.get_shared_store(GlobalStore()) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/config.py", line 3378, in __init__ config_dir(), possible_transports=possible_transports) File "/Users/neil/proj/brz/warn-bazaar-directory/breezy/config.py", line 1445, in config_dir import traceback; traceback.print_stack() Using fallback Bazaar configuration directory (/Users/neil/.bazaar) rather than (/Users/neil/.config/breezy). setting global_state.config_dir /Users/neil/.bazaar Breezy 3.0.0dev1 -- a free distributed version-control tool [...] Martin, can you advise on how to proceed with improving the function to do less work and also only print a single warning?