diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2017-03-24 11:27:42 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-24 11:27:42 (GMT) |
commit | e304e33c16e060932d1e2cc8a030d42b02b429b5 (patch) | |
tree | d6c763564bfa27d2e4069a980296e90c8f71f31f | |
parent | 5619ab2db3a6c62ffaa55e8826cf67b7459fc484 (diff) | |
download | cpython-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.rst | 11 | ||||
-rw-r--r-- | Doc/whatsnew/3.7.rst | 7 | ||||
-rw-r--r-- | Lib/os.py | 2 | ||||
-rw-r--r-- | Lib/test/test_os.py | 12 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
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 ------------------------ @@ -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 @@ -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. |