GH-73991: Support preserving metadata in `pathlib.Path.copy()` by barneygale · Pull Request #120806 · python/cpython · GitHub
Skip to content

GH-73991: Support preserving metadata in pathlib.Path.copy() - #120806

Merged
barneygale merged 15 commits into
python:mainfrom
barneygale:copy-metadata
Jul 6, 2024
Merged

barneygale merged 15 commits into
python:mainfrom
barneygale:copy-metadata

Conversation

@barneygale

@barneygale barneygale commented Jun 20, 2024

Copy link
Copy Markdown
Contributor

Add preserve_metadata keyword-only argument to pathlib.Path.copy(), defaulting to false. When set to true, we copy timestamps, permissions, extended attributes and flags where available, like shutil.copystat(). The argument has no effect on Windows, where metadata is always copied.

Internally (in the pathlib ABCs), path types gain _readable_metadata and _writable_metadata attributes. These sets of strings describe what kinds of metadata can be retrieved and stored. We take an intersection of source._readable_metadata and target._writable_metadata to minimise reads/writes. A new _read_metadata() method accepts a set of metadata keys and returns a dict with those keys, and a new _write_metadata() method accepts a dict of metadata. We might make these public in future, but it's hard to justify while the ABCs are still private.


📚 Documentation preview 📚: https://cpython-previews--120806.org.readthedocs.build/

Add *preserve_metadata* keyword-only argument to `pathlib.Path.copy()`,
defaulting to false. When set to true, we copy timestamps, permissions,
extended attributes and flags where available, like `shutil.copystat()`.
The argument has no effect on Windows, where metadata is always copied.

In the pathlib ABCs we copy the file permissions with `PathBase.chmod()`
where supported. In the future we might want to support a more generic
public interface for copying metadata between different types of `PathBase`
object, but it would be premature here.
@barneygale
barneygale merged commit 88fc065 into python:main Jul 6, 2024
@bedevere-bot

Copy link
Copy Markdown

barneygale added a commit to barneygale/cpython that referenced this pull request Jul 6, 2024
Follow-up to python#120806. Use `os_helper.skip_unless_xattr` to skip testing
xattr preservation when unsupported.
barneygale added a commit that referenced this pull request Jul 7, 2024
Follow-up to #120806. Use `os_helper.skip_unless_xattr` to skip testing
xattr preservation when unsupported.
noahbkim pushed a commit to hudson-trading/cpython that referenced this pull request Jul 11, 2024
…ython#120806)

Add *preserve_metadata* keyword-only argument to `pathlib.Path.copy()`, defaulting to false. When set to true, we copy timestamps, permissions, extended attributes and flags where available, like `shutil.copystat()`. The argument has no effect on Windows, where metadata is always copied.

Internally (in the pathlib ABCs), path types gain `_readable_metadata` and `_writable_metadata` attributes. These sets of strings describe what kinds of metadata can be retrieved and stored. We take an intersection of `source._readable_metadata` and `target._writable_metadata` to minimise reads/writes. A new `_read_metadata()` method accepts a set of metadata keys and returns a dict with those keys, and a new `_write_metadata()` method accepts a dict of metadata. We *might* make these public in future, but it's hard to justify while the ABCs are still private.
noahbkim pushed a commit to hudson-trading/cpython that referenced this pull request Jul 11, 2024
…thon#121444)

Follow-up to python#120806. Use `os_helper.skip_unless_xattr` to skip testing
xattr preservation when unsupported.
estyxx pushed a commit to estyxx/cpython that referenced this pull request Jul 17, 2024
…ython#120806)

Add *preserve_metadata* keyword-only argument to `pathlib.Path.copy()`, defaulting to false. When set to true, we copy timestamps, permissions, extended attributes and flags where available, like `shutil.copystat()`. The argument has no effect on Windows, where metadata is always copied.

Internally (in the pathlib ABCs), path types gain `_readable_metadata` and `_writable_metadata` attributes. These sets of strings describe what kinds of metadata can be retrieved and stored. We take an intersection of `source._readable_metadata` and `target._writable_metadata` to minimise reads/writes. A new `_read_metadata()` method accepts a set of metadata keys and returns a dict with those keys, and a new `_write_metadata()` method accepts a dict of metadata. We *might* make these public in future, but it's hard to justify while the ABCs are still private.
estyxx pushed a commit to estyxx/cpython that referenced this pull request Jul 17, 2024
…thon#121444)

Follow-up to python#120806. Use `os_helper.skip_unless_xattr` to skip testing
xattr preservation when unsupported.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants