- Issue #22966: Fix __pycache__ pyc file name clobber when pyc_compile is
asked to compile a source file containing multiple dots in the source file name.
This commit is contained in:
commit
d32d4ae4ca
|
@ -454,11 +454,11 @@ def cache_from_source(path, debug_override=None):
|
||||||
else:
|
else:
|
||||||
suffixes = OPTIMIZED_BYTECODE_SUFFIXES
|
suffixes = OPTIMIZED_BYTECODE_SUFFIXES
|
||||||
head, tail = _path_split(path)
|
head, tail = _path_split(path)
|
||||||
base_filename, sep, _ = tail.partition('.')
|
base, sep, rest = tail.rpartition('.')
|
||||||
tag = sys.implementation.cache_tag
|
tag = sys.implementation.cache_tag
|
||||||
if tag is None:
|
if tag is None:
|
||||||
raise NotImplementedError('sys.implementation.cache_tag is None')
|
raise NotImplementedError('sys.implementation.cache_tag is None')
|
||||||
filename = ''.join([base_filename, sep, tag, suffixes[0]])
|
filename = ''.join([(base if base else rest), sep, tag, suffixes[0]])
|
||||||
return _path_join(head, _PYCACHE, filename)
|
return _path_join(head, _PYCACHE, filename)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ import os
|
||||||
import py_compile
|
import py_compile
|
||||||
import shutil
|
import shutil
|
||||||
import stat
|
import stat
|
||||||
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
|
@ -99,5 +100,21 @@ class PyCompileTests(unittest.TestCase):
|
||||||
self.assertFalse(os.path.exists(
|
self.assertFalse(os.path.exists(
|
||||||
importlib.util.cache_from_source(bad_coding)))
|
importlib.util.cache_from_source(bad_coding)))
|
||||||
|
|
||||||
|
def test_double_dot_no_clobber(self):
|
||||||
|
# http://bugs.python.org/issue22966
|
||||||
|
# py_compile foo.bar.py -> __pycache__/foo.cpython-34.pyc
|
||||||
|
weird_path = os.path.join(self.directory, 'foo.bar.py')
|
||||||
|
cache_path = importlib.util.cache_from_source(weird_path)
|
||||||
|
pyc_path = weird_path + 'c'
|
||||||
|
self.assertEqual(
|
||||||
|
'/'.join(cache_path.split('/')[-2:]),
|
||||||
|
'__pycache__/foo.bar.{}.pyc'.format(sys.implementation.cache_tag))
|
||||||
|
with open(weird_path, 'w') as file:
|
||||||
|
file.write('x = 123\n')
|
||||||
|
py_compile.compile(weird_path)
|
||||||
|
self.assertTrue(os.path.exists(cache_path))
|
||||||
|
self.assertFalse(os.path.exists(pyc_path))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
@ -191,6 +191,10 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #22966: Fix __pycache__ pyc file name clobber when pyc_compile is
|
||||||
|
asked to compile a source file containing multiple dots in the source file
|
||||||
|
name.
|
||||||
|
|
||||||
- Issue #21971: Update turtledemo doc and add module to the index.
|
- Issue #21971: Update turtledemo doc and add module to the index.
|
||||||
|
|
||||||
- Issue #21032. Fixed socket leak if HTTPConnection.getresponse() fails.
|
- Issue #21032. Fixed socket leak if HTTPConnection.getresponse() fails.
|
||||||
|
|
7009
Python/importlib.h
7009
Python/importlib.h
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue