GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — GH-73991: Add follow_symlinks argument to `pathlib.Path.copy()` by barneygale · Pull Request #120519 · python/cpython

Conversation

@barneygale

@barneygale barneygale commented Jun 14, 2024 •
edited by github-actions Bot
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

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.

  • Issue: Support moving across filesystems in pathlib.Path, as shutil.move() does #73991

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

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@barneygale
pythonGH-73991: Add *follow_symlinks* argument to pathlib.Path.copy()
34a3365
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 added skip news topic-pathlib labels Jun 14, 2024
@bedevere-app bedevere-app Bot mentioned this pull request Jun 14, 2024
Support moving across filesystems in pathlib.Path, as shutil.move() does #73991
Closed
@bedevere-app bedevere-app Bot added the awaiting core review label Jun 14, 2024
@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
zooba
zooba approved these changes Jun 18, 2024
View reviewed changes

@zooba zooba left a comment

Copy link
Copy Markdown
Member

There was a problem hiding this 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.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread Doc/library/pathlib.rst Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/pathlib/_os.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_pathlib/test_pathlib_abc.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

@bedevere-app bedevere-app Bot added awaiting merge and removed awaiting core review labels Jun 18, 2024
barneygale added 3 commits June 19, 2024 01:22
@barneygale
Test copying to existing symlink with follow_symlinks=False
38bf791
@barneygale
Check for os.stat_result.st_file_attributes
0717792
@barneygale
Add underscore prefix
de5a230
@barneygale
barneygale enabled auto-merge (squash) June 19, 2024 00:38
@barneygale
barneygale merged commit 20d5b84 into python:main Jun 19, 2024
@bedevere-app bedevere-app Bot removed the awaiting merge label Jun 19, 2024
eryksun
eryksun reviewed Jun 19, 2024
View reviewed changes
Comment thread Doc/library/pathlib.rst
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.

@eryksun eryksun Jun 19, 2024

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

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().

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@barneygale barneygale Jun 19, 2024

Copy link
Copy Markdown
Contributor Author

There was a problem hiding this comment.

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.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@eryksun eryksun Jun 19, 2024

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

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.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
mrahtz pushed a commit to mrahtz/cpython that referenced this pull request Jun 30, 2024
@barneygale @mrahtz
pythonGH-73991: Add follow_symlinks argument to pathlib.Path.copy() (…
8f3a17a
…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
@barneygale @estyxx
pythonGH-73991: Add follow_symlinks argument to pathlib.Path.copy() (…
0557b1d
…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

Reviewers

@eryksun eryksun eryksun left review comments
@zooba zooba zooba approved these changes

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

skip news topic-pathlib

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

3 participants

@barneygale @eryksun @zooba
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.