From 986da8effcd2e9e9334ae016928ef795fb93c373 Mon Sep 17 00:00:00 2001 From: Barney Gale Date: Wed, 7 Apr 2021 01:25:37 +0100 Subject: bpo-39895: Move `pathlib.Path.touch()` implementation into the path accessor. (GH-18838) --- Lib/pathlib.py | 42 ++++++++++++++++++------------------------ 1 file 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): """ -- cgit v0.12