From 17e3af25e57f7caa69b70e36daf3f915e15efcfa Mon Sep 17 00:00:00 2001 From: barneygale Date: Sun, 8 Mar 2020 03:56:55 +0000 Subject: [PATCH] bpo-39895: Move `pathlib.Path.touch()` implementation into the path accessor. --- Lib/pathlib.py | 42 ++++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 531a699a40df49..6f9aad2512c13a 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -444,7 +444,23 @@ def symlink(a, b, target_is_directory): def symlink(a, b, target_is_directory): return os.symlink(a, b) - 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) # Helper for resolve() def readlink(self, path): @@ -1111,13 +1127,6 @@ def _opener(self, name, flags, mode=0o666): # 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 @@ -1290,22 +1299,7 @@ def touch(self, mode=0o666, exist_ok=True): """ 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): """