mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
GH-125413: Add private metadata methods to pathlib.Path.info
(#129897)
Add the following private methods to `pathlib.Path.info`: - `_posix_permissions()`: the POSIX file permissions (`S_IMODE(st_mode)`) - `_file_id()`: the file ID (`(st_dev, st_ino)`) - `_access_time_ns()`: the access time in nanoseconds (`st_atime_ns`) - `_mod_time_ns()`: the modify time in nanoseconds (`st_mtime_ns`) - `_bsd_flags()`: the BSD file flags (`st_flags`) - `_xattrs()`: the file extended attributes as a list of key, value pairs, or an empty list if `listxattr()` or `getxattr()` fail in an ignorable way. These methods replace `LocalCopyReader.read_metadata()`, and so we can delete the `CopyReader` and `LocalCopyReader` classes. Rather than reading metadata via `source._copy_reader.read_metadata()`, we instead call `source.info._posix_permissions()`, `_access_time_ns()`, etc. Preserving metadata is only supported for local-to-local copies at the moment. To support copying metadata between arbitrary `ReadablePath` and `WritablePath` objects, we'd need to make the new methods public and documented. Co-authored-by: Petr Viktorin <encukou@gmail.com>
This commit is contained in:
parent
bd1642c6e5
commit
7fcace99bb
4 changed files with 205 additions and 207 deletions
|
@ -19,7 +19,7 @@ try:
|
|||
except ImportError:
|
||||
grp = None
|
||||
|
||||
from pathlib._os import LocalCopyReader, LocalCopyWriter, PathInfo, DirEntryInfo
|
||||
from pathlib._os import LocalCopyWriter, PathInfo, DirEntryInfo, ensure_different_files
|
||||
|
||||
|
||||
__all__ = [
|
||||
|
@ -1079,7 +1079,6 @@ class Path(PurePath):
|
|||
os.replace(self, target)
|
||||
return self.with_segments(target)
|
||||
|
||||
_copy_reader = property(LocalCopyReader)
|
||||
_copy_writer = property(LocalCopyWriter)
|
||||
|
||||
def copy(self, target, follow_symlinks=True, dirs_exist_ok=False,
|
||||
|
@ -1125,7 +1124,7 @@ class Path(PurePath):
|
|||
else:
|
||||
if not hasattr(target, '_copy_writer'):
|
||||
target = self.with_segments(target_str)
|
||||
target._copy_writer._ensure_different_file(self)
|
||||
ensure_different_files(self, target)
|
||||
try:
|
||||
os.replace(self, target_str)
|
||||
return target
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue