diff options
author | Barney Gale <barney.gale@gmail.com> | 2021-04-07 00:25:37 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-07 00:25:37 (GMT) |
commit | 986da8effcd2e9e9334ae016928ef795fb93c373 (patch) | |
tree | 97a43cbd32af9f3b09586d66c4b1df955cc812b2 | |
parent | 04732ca993fa077a8b9640cc77fb2f152339585a (diff) | |
download | cpython-986da8effcd2e9e9334ae016928ef795fb93c373.zip cpython-986da8effcd2e9e9334ae016928ef795fb93c373.tar.gz cpython-986da8effcd2e9e9334ae016928ef795fb93c373.tar.bz2 |
bpo-39895: Move `pathlib.Path.touch()` implementation into the path accessor. (GH-18838)
-rw-r--r-- | Lib/pathlib.py | 42 |
1 files changed, 18 insertions, 24 deletions
diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 64f5f18..cd5884d 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -431,7 +431,23 @@ class _NormalAccessor(_Accessor): def symlink(self, src, dst, target_is_directory=False): raise NotImplementedError("os.symlink() not available on this system") - utime = os.utime + def touch(self, path, mode=0o666, exist_ok=True): + if exist_ok: + # First try to bump modification time + # Implementation note: GNU touch uses the UTIME_NOW option of + # the utimensat() / futimens() functions. + try: + os.utime(path, None) + except OSError: + # Avoid exception chaining + pass + else: + return + flags = os.O_CREAT | os.O_WRONLY + if not exist_ok: + flags |= os.O_EXCL + fd = os.open(path, flags, mode) + os.close(fd) if hasattr(os, "readlink"): readlink = os.readlink @@ -1100,13 +1116,6 @@ class Path(PurePath): # A stub for the opener argument to built-in open() return self._accessor.open(self, flags, mode) - def _raw_open(self, flags, mode=0o777): - """ - Open the file pointed by this path and return a file descriptor, - as os.open() does. - """ - return self._accessor.open(self, flags, mode) - # Public API @classmethod @@ -1283,22 +1292,7 @@ class Path(PurePath): """ Create this file with the given access mode, if it doesn't exist. """ - if exist_ok: - # First try to bump modification time - # Implementation note: GNU touch uses the UTIME_NOW option of - # the utimensat() / futimens() functions. - try: - self._accessor.utime(self, None) - except OSError: - # Avoid exception chaining - pass - else: - return - flags = os.O_CREAT | os.O_WRONLY - if not exist_ok: - flags |= os.O_EXCL - fd = self._raw_open(flags, mode) - os.close(fd) + self._accessor.touch(self, mode, exist_ok) def mkdir(self, mode=0o777, parents=False, exist_ok=False): """ |