Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GH-73991: Add follow_symlinks argument to pathlib.Path.copy() #120519

Merged
merged 4 commits into from
Jun 19, 2024

Conversation

barneygale
Copy link
Contributor

@barneygale barneygale commented Jun 14, 2024

Add support for not following symlinks in pathlib.Path.copy().

On Windows we add the COPY_FILE_COPY_SYMLINK flag is following symlinks is disabled. If the source is symlink to a directory, this call will fail with ERROR_ACCESS_DENIED. In this case we add COPY_FILE_DIRECTORY to the flags and retry. This can fail on old Windowses, which we note in the docs.

No news as copy() was only just added.


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

Add support for not following symlinks in `pathlib.Path.copy()`.

On Windows we add the `COPY_FILE_COPY_SYMLINK` flag is following symlinks
is disabled. If the source is symlink to a directory, this call will fail
with `ERROR_ACCESS_DENIED`. In this case we add `COPY_FILE_DIRECTORY` to
the flags and retry.
@barneygale barneygale requested a review from eryksun June 14, 2024 19:55
@barneygale barneygale changed the title GH-73991: Add *follow_symlinks* argument to pathlib.Path.copy() GH-73991: Add follow_symlinks argument to pathlib.Path.copy() Jun 14, 2024
@barneygale barneygale requested a review from zooba June 18, 2024 17:42
Copy link
Member

@zooba zooba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, left some thoughts, but nothing blocking.

Doc/library/pathlib.rst Show resolved Hide resolved
Lib/pathlib/_os.py Outdated Show resolved Hide resolved
Lib/test/test_pathlib/test_pathlib_abc.py Show resolved Hide resolved
@barneygale barneygale enabled auto-merge (squash) June 19, 2024 00:38
@barneygale barneygale merged commit 20d5b84 into python:main Jun 19, 2024
36 checks passed
Comment on lines +1450 to +1453
.. warning::
On old builds of Windows (before Windows 10 build 19041), this method
raises :exc:`OSError` when a symlink to a directory is encountered and
*follow_symlinks* is false.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Failing to copy a symlink that targets a directory is disappointing. A symlink is never reported as a directory in Python, so code that copies a tree that contains directory symlinks is going to fail on Windows Server 2016 and Windows Server 2019 systems, with no obvious reason that a Python programmer would reasonably expect. A fallback path is needed to copy the link via os.symlink().

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I should have waited for your feedback Eryk, my bad. I'll fix this in a follow-up PR.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As always, I defer to what you and Steve think is best.

I'm of a mixed mind regarding Python's PEP 11 support policy that requires new versions of Python to support Server releases that still have extended support from Microsoft, which sets the bar for all versions of Windows. The Server editions are released in the LTSC channel and get 10 years of support. Server 2016 (build 14393) is supported until January 2027, and Server 2019 (build 17763) is supported until January 2029. Part of me wishes we just grouped the Server releases with corresponding releases in the general availability channel (e.g. Windows 10 1607 and Windows 10 1809) because it's more work to provide and maintain fallback paths for older versions of Windows. However, it's also great for users that they can use the latest version of Python on older systems.

mrahtz pushed a commit to mrahtz/cpython that referenced this pull request Jun 30, 2024
…python#120519)

Add support for not following symlinks in `pathlib.Path.copy()`.

On Windows we add the `COPY_FILE_COPY_SYMLINK` flag is following symlinks is disabled. If the source is symlink to a directory, this call will fail with `ERROR_ACCESS_DENIED`. In this case we add `COPY_FILE_DIRECTORY` to the flags and retry. This can fail on old Windowses, which we note in the docs.

No news as `copy()` was only just added.
noahbkim pushed a commit to hudson-trading/cpython that referenced this pull request Jul 11, 2024
…python#120519)

Add support for not following symlinks in `pathlib.Path.copy()`.

On Windows we add the `COPY_FILE_COPY_SYMLINK` flag is following symlinks is disabled. If the source is symlink to a directory, this call will fail with `ERROR_ACCESS_DENIED`. In this case we add `COPY_FILE_DIRECTORY` to the flags and retry. This can fail on old Windowses, which we note in the docs.

No news as `copy()` was only just added.
estyxx pushed a commit to estyxx/cpython that referenced this pull request Jul 17, 2024
…python#120519)

Add support for not following symlinks in `pathlib.Path.copy()`.

On Windows we add the `COPY_FILE_COPY_SYMLINK` flag is following symlinks is disabled. If the source is symlink to a directory, this call will fail with `ERROR_ACCESS_DENIED`. In this case we add `COPY_FILE_DIRECTORY` to the flags and retry. This can fail on old Windowses, which we note in the docs.

No news as `copy()` was only just added.
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.

3 participants