diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 369cb4feb16..88b2aa22177 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -13,7 +13,9 @@ from random import randint, random from unittest import skipUnless -from test.support import TESTFN, run_unittest, findfile, unlink, requires_zlib, requires_bz2, requires_lzma +from test.support import (TESTFN, run_unittest, findfile, unlink, + requires_zlib, requires_bz2, requires_lzma, + captured_stdout) TESTFN2 = TESTFN + "2" TESTFNDIR = TESTFN + "d" @@ -854,6 +856,28 @@ def test_write_non_pyfile(self): self.assertRaises(RuntimeError, zipfp.writepy, TESTFN) os.remove(TESTFN) + def test_write_pyfile_bad_syntax(self): + os.mkdir(TESTFN2) + try: + with open(os.path.join(TESTFN2, "mod1.py"), "w") as fp: + fp.write("Bad syntax in python file\n") + + with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp: + # syntax errors are printed to stdout + with captured_stdout() as s: + zipfp.writepy(os.path.join(TESTFN2, "mod1.py")) + + self.assertIn("SyntaxError", s.getvalue()) + + # as it will not have compiled the python file, it will + # include the .py file not .pyc or .pyo + names = zipfp.namelist() + self.assertIn('mod1.py', names) + self.assertNotIn('mod1.pyc', names) + self.assertNotIn('mod1.pyo', names) + + finally: + shutil.rmtree(TESTFN2) class OtherTests(unittest.TestCase): zips_with_bad_crc = { diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 2fa7a8c15a4..64f9092d124 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -1604,7 +1604,7 @@ def _compile(file, optimize=-1): print("Compiling", file) try: py_compile.compile(file, doraise=True, optimize=optimize) - except py_compile.PyCompileError as error: + except py_compile.PyCompileError as err: print(err.msg) return False return True diff --git a/Misc/ACKS b/Misc/ACKS index 0888c3d2f9a..7e121b1db55 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -825,6 +825,7 @@ Skip Montanaro Peter Moody Paul Moore Ross Moore +Ben Morgan Derek Morr James A Morrison Derek McTavish Mounce diff --git a/Misc/NEWS b/Misc/NEWS index ef5c6bd9403..beee1c39f73 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -236,6 +236,9 @@ Core and Builtins Library ------- +- Issue #12004: Fix an internal error in PyZipFile when writing an invalid + Python file. Patch by Ben Morgan. + Have py_compile use importlib as much as possible to avoid code duplication. - Issue #180022: Have site.addpackage() consider already known paths even when