From 0048c98fef96fa5df30db535bc124ee9aac341b0 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Mon, 16 Dec 2013 20:22:37 +0100 Subject: Issue #19921: When Path.mkdir() is called with parents=True, any missing parent is created with the default permissions, ignoring the mode argument (mimicking the POSIX "mkdir -p" command). Patch by Serhiy. --- Doc/library/pathlib.rst | 5 ++++- Lib/pathlib.py | 2 +- Lib/test/test_pathlib.py | 13 +++++++++++-- Misc/NEWS | 4 ++++ 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index a8c1dc9..7148667 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -768,7 +768,10 @@ call fails (for example because the path doesn't exist): and access flags. If the path already exists, :exc:`OSError` is raised. If *parents* is true, any missing parents of this path are created - as needed. If *parents* is false (the default), a missing parent raises + as needed; they are created with the default permissions without taking + *mode* into account (mimicking the POSIX ``mkdir -p`` command). + + If *parents* is false (the default), a missing parent raises :exc:`OSError`. diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 9b4fde1..18facd9 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -1101,7 +1101,7 @@ class Path(PurePath): except OSError as e: if e.errno != ENOENT: raise - self.parent.mkdir(mode, True) + self.parent.mkdir(parents=True) self._accessor.mkdir(self, mode) def chmod(self, mode): diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 0ad77e0..bdcba9f 100755 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1478,7 +1478,6 @@ class _BasePathTest(object): with self.assertRaises(OSError) as cm: p.mkdir() self.assertEqual(cm.exception.errno, errno.EEXIST) - # XXX test `mode` arg def test_mkdir_parents(self): # Creating a chain of directories @@ -1493,7 +1492,17 @@ class _BasePathTest(object): with self.assertRaises(OSError) as cm: p.mkdir(parents=True) self.assertEqual(cm.exception.errno, errno.EEXIST) - # XXX test `mode` arg + # test `mode` arg + mode = stat.S_IMODE(p.stat().st_mode) # default mode + p = self.cls(BASE, 'newdirD', 'newdirE') + p.mkdir(0o555, parents=True) + self.assertTrue(p.exists()) + self.assertTrue(p.is_dir()) + if os.name != 'nt': + # the directory's permissions follow the mode argument + self.assertEqual(stat.S_IMODE(p.stat().st_mode), 0o555 & mode) + # the parent's permissions follow the default process settings + self.assertEqual(stat.S_IMODE(p.parent.stat().st_mode), mode) @with_symlinks def test_symlink_to(self): diff --git a/Misc/NEWS b/Misc/NEWS index 52b0a3d..3525edf 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -44,6 +44,10 @@ Core and Builtins Library ------- +- Issue #19921: When Path.mkdir() is called with parents=True, any missing + parent is created with the default permissions, ignoring the mode argument + (mimicking the POSIX "mkdir -p" command). + - Issue #19887: Improve the Path.resolve() algorithm to support certain symlink chains. -- cgit v0.12