summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBarney Gale <barney.gale@gmail.com>2021-04-07 00:25:37 (GMT)
committerGitHub <noreply@github.com>2021-04-07 00:25:37 (GMT)
commit986da8effcd2e9e9334ae016928ef795fb93c373 (patch)
tree97a43cbd32af9f3b09586d66c4b1df955cc812b2
parent04732ca993fa077a8b9640cc77fb2f152339585a (diff)
downloadcpython-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.py42
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):
"""