Fix the test for issue #6972.

Remove trailing dots on Windows.
This commit is contained in:
Serhiy Storchaka 2013-02-02 19:50:59 +02:00
parent f458a03617
commit e5e6444497
2 changed files with 21 additions and 6 deletions

View File

@ -456,8 +456,6 @@ class TestsWithSourceFile(unittest.TestCase):
('/foo/bar', 'foo/bar'), ('/foo/bar', 'foo/bar'),
('/foo/../bar', 'foo/bar'), ('/foo/../bar', 'foo/bar'),
('/foo/../../bar', 'foo/bar'), ('/foo/../../bar', 'foo/bar'),
('//foo/bar', 'foo/bar'),
('../../foo../../ba..r', 'foo../ba..r'),
] ]
if os.path.sep == '\\': # Windows. if os.path.sep == '\\': # Windows.
hacknames.extend([ hacknames.extend([
@ -479,19 +477,32 @@ class TestsWithSourceFile(unittest.TestCase):
(r'\\?\C:\foo\bar', 'foo/bar'), (r'\\?\C:\foo\bar', 'foo/bar'),
(r'C:/../C:/foo/bar', 'C_/foo/bar'), (r'C:/../C:/foo/bar', 'C_/foo/bar'),
(r'a:b\c<d>e|f"g?h*i', 'b/c_d_e_f_g_h_i'), (r'a:b\c<d>e|f"g?h*i', 'b/c_d_e_f_g_h_i'),
('../../foo../../ba..r', 'foo/ba..r'),
])
else: # Unix
hacknames.extend([
('//foo/bar', 'foo/bar'),
('../../foo../../ba..r', 'foo../ba..r'),
(r'foo/..\bar', r'foo/..\bar'),
]) ])
for arcname, fixedname in hacknames: for arcname, fixedname in hacknames:
content = b'foobar' + arcname.encode() content = b'foobar' + arcname.encode()
with zipfile.ZipFile(TESTFN2, 'w', zipfile.ZIP_STORED) as zipfp: with zipfile.ZipFile(TESTFN2, 'w', zipfile.ZIP_STORED) as zipfp:
zipfp.writestr(arcname, content) zinfo = zipfile.ZipInfo()
# preserve backslashes
zinfo.filename = arcname
zinfo.external_attr = 0o600 << 16
zipfp.writestr(zinfo, content)
arcname = arcname.replace(os.sep, "/")
targetpath = os.path.join('target', 'subdir', 'subsub') targetpath = os.path.join('target', 'subdir', 'subsub')
correctfile = os.path.join(targetpath, *fixedname.split('/')) correctfile = os.path.join(targetpath, *fixedname.split('/'))
with zipfile.ZipFile(TESTFN2, 'r') as zipfp: with zipfile.ZipFile(TESTFN2, 'r') as zipfp:
writtenfile = zipfp.extract(arcname, targetpath) writtenfile = zipfp.extract(arcname, targetpath)
self.assertEqual(writtenfile, correctfile) self.assertEqual(writtenfile, correctfile,
msg="extract %r" % arcname)
self.check_file(correctfile, content) self.check_file(correctfile, content)
shutil.rmtree('target') shutil.rmtree('target')
@ -504,7 +515,8 @@ class TestsWithSourceFile(unittest.TestCase):
with zipfile.ZipFile(TESTFN2, 'r') as zipfp: with zipfile.ZipFile(TESTFN2, 'r') as zipfp:
writtenfile = zipfp.extract(arcname) writtenfile = zipfp.extract(arcname)
self.assertEqual(writtenfile, correctfile) self.assertEqual(writtenfile, correctfile,
msg="extract %r" % arcname)
self.check_file(correctfile, content) self.check_file(correctfile, content)
shutil.rmtree(fixedname.split('/')[0]) shutil.rmtree(fixedname.split('/')[0])

View File

@ -1071,11 +1071,14 @@ class ZipFile:
arcname = os.path.splitdrive(arcname)[1] arcname = os.path.splitdrive(arcname)[1]
arcname = os.path.sep.join(x for x in arcname.split(os.path.sep) arcname = os.path.sep.join(x for x in arcname.split(os.path.sep)
if x not in ('', os.path.curdir, os.path.pardir)) if x not in ('', os.path.curdir, os.path.pardir))
# filter illegal characters on Windows
if os.path.sep == '\\': if os.path.sep == '\\':
# filter illegal characters on Windows
illegal = ':<>|"?*' illegal = ':<>|"?*'
table = str.maketrans(illegal, '_' * len(illegal)) table = str.maketrans(illegal, '_' * len(illegal))
arcname = arcname.translate(table) arcname = arcname.translate(table)
# remove trailing dots
arcname = (x.rstrip('.') for x in arcname.split(os.path.sep))
arcname = os.path.sep.join(x for x in arcname if x)
targetpath = os.path.join(targetpath, arcname) targetpath = os.path.join(targetpath, arcname)
targetpath = os.path.normpath(targetpath) targetpath = os.path.normpath(targetpath)