summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/pathlib.rst5
-rw-r--r--Lib/pathlib.py2
-rwxr-xr-xLib/test/test_pathlib.py13
-rw-r--r--Misc/NEWS4
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.