mirror of
https://github.com/python/cpython.git
synced 2025-10-17 12:18:23 +00:00
GH-127381: pathlib ABCs: remove PathBase.samefile()
and rarer is_*()
(#127709)
Remove `PathBase.samefile()`, which is fairly specific to the local FS, and relies on `stat()`, which we're aiming to remove from `PathBase`. Also remove `PathBase.is_mount()`, `is_junction()`, `is_block_device()`, `is_char_device()`, `is_fifo()` and `is_socket()`. These rely on POSIX file type numbers that we're aiming to remove from the `PathBase` API.
This commit is contained in:
parent
51216857ca
commit
12b4f1a5a1
4 changed files with 141 additions and 171 deletions
|
@ -16,7 +16,7 @@ import operator
|
|||
import posixpath
|
||||
from errno import EINVAL
|
||||
from glob import _GlobberBase, _no_recurse_symlinks
|
||||
from stat import S_ISDIR, S_ISLNK, S_ISREG, S_ISSOCK, S_ISBLK, S_ISCHR, S_ISFIFO
|
||||
from stat import S_ISDIR, S_ISLNK, S_ISREG
|
||||
from pathlib._os import copyfileobj
|
||||
|
||||
|
||||
|
@ -408,26 +408,6 @@ class PathBase(PurePathBase):
|
|||
except (OSError, ValueError):
|
||||
return False
|
||||
|
||||
def is_mount(self):
|
||||
"""
|
||||
Check if this path is a mount point
|
||||
"""
|
||||
# Need to exist and be a dir
|
||||
if not self.exists() or not self.is_dir():
|
||||
return False
|
||||
|
||||
try:
|
||||
parent_dev = self.parent.stat().st_dev
|
||||
except OSError:
|
||||
return False
|
||||
|
||||
dev = self.stat().st_dev
|
||||
if dev != parent_dev:
|
||||
return True
|
||||
ino = self.stat().st_ino
|
||||
parent_ino = self.parent.stat().st_ino
|
||||
return ino == parent_ino
|
||||
|
||||
def is_symlink(self):
|
||||
"""
|
||||
Whether this path is a symbolic link.
|
||||
|
@ -437,76 +417,11 @@ class PathBase(PurePathBase):
|
|||
except (OSError, ValueError):
|
||||
return False
|
||||
|
||||
def is_junction(self):
|
||||
"""
|
||||
Whether this path is a junction.
|
||||
"""
|
||||
# Junctions are a Windows-only feature, not present in POSIX nor the
|
||||
# majority of virtual filesystems. There is no cross-platform idiom
|
||||
# to check for junctions (using stat().st_mode).
|
||||
return False
|
||||
|
||||
def is_block_device(self):
|
||||
"""
|
||||
Whether this path is a block device.
|
||||
"""
|
||||
try:
|
||||
return S_ISBLK(self.stat().st_mode)
|
||||
except (OSError, ValueError):
|
||||
return False
|
||||
|
||||
def is_char_device(self):
|
||||
"""
|
||||
Whether this path is a character device.
|
||||
"""
|
||||
try:
|
||||
return S_ISCHR(self.stat().st_mode)
|
||||
except (OSError, ValueError):
|
||||
return False
|
||||
|
||||
def is_fifo(self):
|
||||
"""
|
||||
Whether this path is a FIFO.
|
||||
"""
|
||||
try:
|
||||
return S_ISFIFO(self.stat().st_mode)
|
||||
except (OSError, ValueError):
|
||||
return False
|
||||
|
||||
def is_socket(self):
|
||||
"""
|
||||
Whether this path is a socket.
|
||||
"""
|
||||
try:
|
||||
return S_ISSOCK(self.stat().st_mode)
|
||||
except (OSError, ValueError):
|
||||
return False
|
||||
|
||||
def samefile(self, other_path):
|
||||
"""Return whether other_path is the same or not as this file
|
||||
(as returned by os.path.samefile()).
|
||||
"""
|
||||
st = self.stat()
|
||||
try:
|
||||
other_st = other_path.stat()
|
||||
except AttributeError:
|
||||
other_st = self.with_segments(other_path).stat()
|
||||
return (st.st_ino == other_st.st_ino and
|
||||
st.st_dev == other_st.st_dev)
|
||||
|
||||
def _ensure_different_file(self, other_path):
|
||||
"""
|
||||
Raise OSError(EINVAL) if both paths refer to the same file.
|
||||
"""
|
||||
try:
|
||||
if not self.samefile(other_path):
|
||||
return
|
||||
except (OSError, ValueError):
|
||||
return
|
||||
err = OSError(EINVAL, "Source and target are the same file")
|
||||
err.filename = str(self)
|
||||
err.filename2 = str(other_path)
|
||||
raise err
|
||||
pass
|
||||
|
||||
def _ensure_distinct_path(self, other_path):
|
||||
"""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue