diff --git a/Lib/cgitb.py b/Lib/cgitb.py index e3ce2cb9d6d..6eb52e764ee 100644 --- a/Lib/cgitb.py +++ b/Lib/cgitb.py @@ -292,14 +292,19 @@ class Hook: if self.logdir is not None: suffix = ['.txt', '.html'][self.format=="html"] (fd, path) = tempfile.mkstemp(suffix=suffix, dir=self.logdir) + try: file = os.fdopen(fd, 'w') file.write(doc) file.close() - msg = '
%s contains the description of this error.' % path + msg = '%s contains the description of this error.' % path except: - msg = '
Tried to save traceback to %s, but failed.' % path - self.file.write(msg + '\n') + msg = 'Tried to save traceback to %s, but failed.' % path + + if self.format == 'html': + self.file.write('
%s
\n' % msg) + else: + self.file.write(msg + '\n') try: self.file.flush() except: pass diff --git a/Lib/test/test_cgitb.py b/Lib/test/test_cgitb.py index 16a4b1a0347..4017772d033 100644 --- a/Lib/test/test_cgitb.py +++ b/Lib/test/test_cgitb.py @@ -1,7 +1,9 @@ from test.support import run_unittest +from test.script_helper import assert_python_failure, temp_dir import unittest import sys import subprocess +import tempfile import cgitb class TestCgitb(unittest.TestCase): @@ -36,16 +38,31 @@ class TestCgitb(unittest.TestCase): self.assertIn("ValueError", text) self.assertIn("Hello World", text) - def test_hook(self): - proc = subprocess.Popen([sys.executable, '-c', - ('import cgitb;' - 'cgitb.enable();' - 'raise ValueError("Hello World")')], - stdout=subprocess.PIPE) - out = proc.stdout.read().decode(sys.getfilesystemencoding()) - self.addCleanup(proc.stdout.close) + def test_syshook_no_logdir_default_format(self): + with temp_dir() as tracedir: + rc, out, err = assert_python_failure( + '-c', + ('import cgitb; cgitb.enable(logdir="%s"); ' + 'raise ValueError("Hello World")') % tracedir) + out = out.decode(sys.getfilesystemencoding()) self.assertIn("ValueError", out) self.assertIn("Hello World", out) + # By default we emit HTML markup. + self.assertIn('', out) + self.assertIn('
', out) + + def test_syshook_no_logdir_text_format(self): + # Issue 12890: we were emitting thetag in text mode. + with temp_dir() as tracedir: + rc, out, err = assert_python_failure( + '-c', + ('import cgitb; cgitb.enable(format="text", logdir="%s"); ' + 'raise ValueError("Hello World")') % tracedir) + out = out.decode(sys.getfilesystemencoding()) + self.assertIn("ValueError", out) + self.assertIn("Hello World", out) + self.assertNotIn('
', out) + self.assertNotIn('
', out) def test_main(): diff --git a/Misc/ACKS b/Misc/ACKS index ac44ae81263..3966ba67cc1 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -769,6 +769,7 @@ Mark Mc Mahon Gordon McMillan Andrew McNamara Caolan McNamara +Jeff McNeil Craig McPheeters Lambert Meertens Bill van Melle diff --git a/Misc/NEWS b/Misc/NEWS index 9766633f7cd..ba555bb5ff9 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,9 @@ Core and Builtins Library ------- +- Issue #12890: cgitb no longer prints spurioustags in text + mode when the logdir option is specified. + - Issue #16307: Fix multiprocessing.Pool.map_async not calling its callbacks. Patch by Janne Karila.