summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-03-24 11:27:42 (GMT)
committerGitHub <noreply@github.com>2017-03-24 11:27:42 (GMT)
commite304e33c16e060932d1e2cc8a030d42b02b429b5 (patch)
treed6c763564bfa27d2e4069a980296e90c8f71f31f
parent5619ab2db3a6c62ffaa55e8826cf67b7459fc484 (diff)
downloadcpython-e304e33c16e060932d1e2cc8a030d42b02b429b5.zip
cpython-e304e33c16e060932d1e2cc8a030d42b02b429b5.tar.gz
cpython-e304e33c16e060932d1e2cc8a030d42b02b429b5.tar.bz2
bpo-19930: The mode argument of os.makedirs() no longer affects the file (#799)
permission bits of newly-created intermediate-level directories.
-rw-r--r--Doc/library/os.rst11
-rw-r--r--Doc/whatsnew/3.7.rst7
-rw-r--r--Lib/os.py2
-rw-r--r--Lib/test/test_os.py12
-rw-r--r--Misc/NEWS3
5 files changed, 32 insertions, 3 deletions
diff --git a/Doc/library/os.rst b/Doc/library/os.rst
index 7d2ec60..69dd5c4 100644
--- a/Doc/library/os.rst
+++ b/Doc/library/os.rst
@@ -1741,8 +1741,11 @@ features:
Recursive directory creation function. Like :func:`mkdir`, but makes all
intermediate-level directories needed to contain the leaf directory.
- The *mode* parameter is passed to :func:`mkdir`; see :ref:`the mkdir()
- description <mkdir_modebits>` for how it is interpreted.
+ The *mode* parameter is passed to :func:`mkdir` for creating the leaf
+ directory; see :ref:`the mkdir() description <mkdir_modebits>` for how it
+ is interpreted. To set the file permission bits of any newly-created parent
+ directories you can set the umask before invoking :func:`makedirs`. The
+ file permission bits of existing parent directories are not changed.
If *exist_ok* is ``False`` (the default), an :exc:`OSError` is raised if the
target directory already exists.
@@ -1767,6 +1770,10 @@ features:
.. versionchanged:: 3.6
Accepts a :term:`path-like object`.
+ .. versionchanged:: 3.7
+ The *mode* argument no longer affects the file permission bits of
+ newly-created intermediate-level directories.
+
.. function:: mkfifo(path, mode=0o666, *, dir_fd=None)
diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst
index 882d6a2..b69f452 100644
--- a/Doc/whatsnew/3.7.rst
+++ b/Doc/whatsnew/3.7.rst
@@ -247,6 +247,13 @@ Changes in the Python API
and module are affected by this change.
(Contributed by INADA Naoki and Eugene Toder in :issue:`29463`.)
+* The *mode* argument of :func:`os.makedirs` no longer affects the file
+ permission bits of newly-created intermediate-level directories.
+ To set their file permission bits you can set the umask before invoking
+ ``makedirs()``.
+ (Contributed by Serhiy Storchaka in :issue:`19930`.)
+
+
CPython bytecode changes
------------------------
diff --git a/Lib/os.py b/Lib/os.py
index 18ec124..70857c7 100644
--- a/Lib/os.py
+++ b/Lib/os.py
@@ -207,7 +207,7 @@ def makedirs(name, mode=0o777, exist_ok=False):
head, tail = path.split(head)
if head and tail and not path.exists(head):
try:
- makedirs(head, mode, exist_ok)
+ makedirs(head, exist_ok=exist_ok)
except FileExistsError:
# Defeats race condition when another thread created the path
pass
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
index 5f302f6..83932e6 100644
--- a/Lib/test/test_os.py
+++ b/Lib/test/test_os.py
@@ -1118,6 +1118,18 @@ class MakedirTests(unittest.TestCase):
'dir5', 'dir6')
os.makedirs(path)
+ def test_mode(self):
+ with support.temp_umask(0o002):
+ base = support.TESTFN
+ parent = os.path.join(base, 'dir1')
+ path = os.path.join(parent, 'dir2')
+ os.makedirs(path, 0o555)
+ self.assertTrue(os.path.exists(path))
+ self.assertTrue(os.path.isdir(path))
+ if os.name != 'nt':
+ self.assertEqual(stat.S_IMODE(os.stat(path).st_mode), 0o555)
+ self.assertEqual(stat.S_IMODE(os.stat(parent).st_mode), 0o775)
+
def test_exist_ok_existing_directory(self):
path = os.path.join(support.TESTFN, 'dir1')
mode = 0o777
diff --git a/Misc/NEWS b/Misc/NEWS
index 8cc8b9f..8003fac 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -287,6 +287,9 @@ Extension Modules
Library
-------
+- bpo-19930: The mode argument of os.makedirs() no longer affects the file
+ permission bits of newly-created intermediate-level directories.
+
- bpo-29884: faulthandler: Restore the old sigaltstack during teardown.
Patch by Christophe Zeitouny.