Skip to content

bpo-33695 shutil.copytree() + os.scandir() cache #7874

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

Merged
merged 19 commits into from
Nov 12, 2018
Merged

bpo-33695 shutil.copytree() + os.scandir() cache #7874

merged 19 commits into from
Nov 12, 2018

Conversation

giampaolo
Copy link
Contributor

@giampaolo giampaolo commented Jun 23, 2018

@giampaolo
Copy link
Contributor Author

Note: I explicitly avoided using a context manager around os.scandir() for now so that patch it's easier to review (will add it before pushing).

@giampaolo giampaolo changed the title bpo-33695 shutil os.scandir() cache bpo-33695 shutil.copytree() + os.scandir() cache Jun 23, 2018
@giampaolo giampaolo requested a review from vstinner June 26, 2018 13:59
Lib/shutil.py Outdated
@@ -53,6 +53,10 @@
COPY_BUFSIZE = 1024 * 1024 if _WINDOWS else 16 * 1024
_HAS_SENDFILE = posix and hasattr(os, "sendfile")
_HAS_FCOPYFILE = posix and hasattr(posix, "_fcopyfile") # macOS
_HAS_SAMESTAT = hasattr(os.path, 'samestat')
_HAS_SAMEFILE = hasattr(os.path, 'samefile')
Copy link
Member

Choose a reason for hiding this comment

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

Is not it always true?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Not sure. This was inherited by existing code. Doc says Availability: Unix, Windows. which suggests there may be cases where it's not available?

Lib/shutil.py Outdated
if hasattr(os.path, 'samefile'):
if isinstance(src, os.DirEntry) and _HAS_SAMESTAT:
try:
return os.path.samestat(src.stat(), os.stat(dst))
Copy link
Member

Choose a reason for hiding this comment

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

See https://bugs.python.org/issue30480 .

Not always samefile() can be replaced by samestat() on Windows.

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 see, I wasn't aware of that. I'm confused though as it appears the problem should be fixed in samestat() (assuming it's possible), not in here. Also, as per https://bugs.python.org/issue30480 the problem already affects shutil regardless of this PR.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Code updated. I think this is better left as-is as it just reflects the previous problematic behavior which IMO should be fixed separately.

Copy link
Contributor Author

@giampaolo giampaolo left a comment

Choose a reason for hiding this comment

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

@serhiy-storchaka , @vstinner,
thanks for joining the code review; replies to your comments are inline.

Lib/shutil.py Outdated
@@ -53,6 +53,10 @@
COPY_BUFSIZE = 1024 * 1024 if _WINDOWS else 16 * 1024
_HAS_SENDFILE = posix and hasattr(os, "sendfile")
_HAS_FCOPYFILE = posix and hasattr(posix, "_fcopyfile") # macOS
_HAS_SAMESTAT = hasattr(os.path, 'samestat')
_HAS_SAMEFILE = hasattr(os.path, 'samefile')
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Not sure. This was inherited by existing code. Doc says Availability: Unix, Windows. which suggests there may be cases where it's not available?

Lib/shutil.py Outdated
if hasattr(os.path, 'samefile'):
if isinstance(src, os.DirEntry) and _HAS_SAMESTAT:
try:
return os.path.samestat(src.stat(), os.stat(dst))
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 see, I wasn't aware of that. I'm confused though as it appears the problem should be fixed in samestat() (assuming it's possible), not in here. Also, as per https://bugs.python.org/issue30480 the problem already affects shutil regardless of this PR.

@giampaolo
Copy link
Contributor Author

Is there anything else I can do regarding this PR? Are we happy?

@giampaolo giampaolo merged commit 19c46a4 into python:master Nov 12, 2018
@bedevere-bot
Copy link

@giampaolo: Please replace # with GH- in the commit message next time. Thanks!

@giampaolo giampaolo deleted the 33695-shutil-scandir-cache branch November 12, 2018 14:18
@ghost
Copy link

ghost commented Feb 23, 2019

@giampaolo Maybe you can also look after my PR #11425 (bpo-35652) because it fixes the behaviour of this PR that the use_srcentry is only set if the original copy function is used. The problem is that a custom edited copy function can't use the srcentry directly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants