Description: Don't crash when we are unable to create the cache directory.
Origin: commit, revision id: jelmer@jelmer.uk-20190713143512-doe3m0k208yko1oj
Author: Jelmer Vernooĳ <jelmer@jelmer.uk>
Bug: https://launchpad.net/bugs/1836449
Last-Update: 2019-07-13
Applied-Upstream: no
X-Bzr-Revision-Id: jelmer@jelmer.uk-20190713143512-doe3m0k208yko1oj

=== modified file 'breezy/tests/test_trace.py'
--- old/breezy/tests/test_trace.py	2018-11-12 01:41:38 +0000
+++ new/breezy/tests/test_trace.py	2019-07-13 14:35:12 +0000
@@ -332,6 +332,22 @@
             sys.stderr.getvalue(),
             "failed to open trace file: .* '/no-such-dir/brz.log'$")
 
+    def test__open_brz_log_ignores_cache_dir_error(self):
+        # If the cache directory can not be created and _open_brz_log can thus
+        # not open the file, then we should write the warning to stderr. Since
+        # this is normally happening before logging is set up.
+        self.overrideAttr(sys, 'stderr', StringIO())
+        # Set the cache directory to something that cannot exist
+        self.overrideEnv('BRZ_LOG', None)
+        self.overrideEnv('BRZ_HOME', '/no-such-dir')
+        self.overrideEnv('XDG_CACHE_HOME', '/no-such-dir')
+        self.overrideAttr(trace, '_brz_log_filename')
+        logf = trace._open_brz_log()
+        self.assertIs(None, logf)
+        self.assertContainsRe(
+            sys.stderr.getvalue(),
+            "failed to open trace file: .* '/no-such-dir'$")
+
 
 class TestVerbosityLevel(TestCase):
 

=== modified file 'breezy/trace.py'
--- old/breezy/trace.py	2019-06-16 19:53:27 +0000
+++ new/breezy/trace.py	2019-07-13 14:35:12 +0000
@@ -204,6 +204,11 @@
 
 
 def _get_brz_log_filename():
+    """Return the brz log filename.
+
+    :return: A path to the log file
+    :raise EnvironmentError: If the cache directory could not be created
+    """
     brz_log = osutils.path_from_environ('BRZ_LOG')
     if brz_log:
         return brz_log
@@ -246,9 +251,10 @@
                 break
         return os.fdopen(fd, 'ab', 0)  # unbuffered
 
-    _brz_log_filename = _get_brz_log_filename()
-    _rollover_trace_maybe(_brz_log_filename)
     try:
+        _brz_log_filename = _get_brz_log_filename()
+        _rollover_trace_maybe(_brz_log_filename)
+
         brz_log_file = _open_or_create_log_file(_brz_log_filename)
         brz_log_file.write(b'\n')
         if brz_log_file.tell() <= 2:

