From: Martin v. Löwis Date: Sun, 24 May 2009 19:53:33 +0000 (+0000) Subject: Merged revisions 72895 via svnmerge from X-Git-Tag: 3.0~56 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=878b9ae5550e14f957ed92448a42d6860c214e0e;p=thirdparty%2FPython%2Fcpython.git Merged revisions 72895 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ................ r72895 | martin.v.loewis | 2009-05-24 21:47:22 +0200 (So, 24 Mai 2009) | 10 lines Merged revisions 72893 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r72893 | martin.v.loewis | 2009-05-24 21:30:52 +0200 (So, 24 Mai 2009) | 3 lines Issue #6050: Don't fail extracting a directory from a zipfile if the directory already exists. ........ ................ --- diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index c85d21d0074d..6865fabfa1e8 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -983,6 +983,11 @@ class TestWithDirectory(unittest.TestCase): self.assertTrue(os.path.isdir(os.path.join(TESTFN2, "a", "b"))) self.assertTrue(os.path.exists(os.path.join(TESTFN2, "a", "b", "c"))) + def test_bug_6050(self): + # Extraction should succeed if directories already exist + os.mkdir(os.path.join(TESTFN2, "a")) + self.testExtractDir() + def testStoreDir(self): os.mkdir(os.path.join(TESTFN2, "x")) zipf = zipfile.ZipFile(TESTFN, "w") diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 661128ee15ca..d2911e1184e4 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -964,7 +964,8 @@ class ZipFile: os.makedirs(upperdirs) if member.filename[-1] == '/': - os.mkdir(targetpath) + if not os.path.isdir(targetpath): + os.mkdir(targetpath) return targetpath source = self.open(member, pwd=pwd) diff --git a/Misc/NEWS b/Misc/NEWS index bc5b3e9b11d6..9dad57fc6273 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -65,6 +65,9 @@ Core and Builtins Library ------- +- Issue #6050: Don't fail extracting a directory from a zipfile if + the directory already exists. + - Issue #5259: smtplib plain auth login no longer gives a traceback. Fix by Musashi Tamura, tests by Marcin Bachry.