Skip to content

gh-160322: document shutil.rmtree("link/") symlink following behavior - #160372

Merged
gpshead merged 1 commit into
python:mainfrom
gpshead:rmtree-trailing-sep-docs
Oct 22, 2026
Merged

gpshead merged 1 commit into
python:mainfrom
gpshead:rmtree-trailing-sep-docs

Conversation

@gpshead

@gpshead gpshead commented Oct 22, 2026 •

Copy link
Copy Markdown
Member

The alternative to #160323...

there's irony in the docs saying "it removes everything and then errors at the end"... but it is true.

Fixes #160322

@gpshead
gpshead force-pushed the rmtree-trailing-sep-docs branch from 5d8f1c7 to 942a6ec Compare October 22, 2026 22:21
@gpshead gpshead added needs backport to 3.14 bugs and security fixes needs backport to 3.15 bugs and security fixes labels Oct 22, 2026
@gpshead
gpshead enabled auto-merge (squash) October 22, 2026 22:22
Comment thread Doc/library/shutil.rst
separator, such as ``'link/'``, the operating system resolves the link, so
:func:`!rmtree` deletes the contents of the directory it points to and then
fails to remove *path* itself. :class:`pathlib.Path` strips trailing
separators, so ``rmtree(Path('link/'))`` refuses the link as usual.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

It seems awkward* to refer to info from the previous paragraph as “as usual”. Maybe something like this?

Suggested change
separators, so ``rmtree(Path('link/'))`` refuses the link as usual.
fails to remove *path* itself. :class:`pathlib.Path` strips trailing
separators; use ``rmtree(Path('link/'))`` if you need to avoid deleting
the link target.

* or, even more awkward...

@gpshead
gpshead merged commit 2c24bc1 into python:main Oct 22, 2026
33 of 34 checks passed
@github-project-automation github-project-automation Bot moved this from Todo to Done in Docs PRs Oct 22, 2026
@miss-islington-app

Copy link
Copy Markdown

Thanks @gpshead for the PR 🌮🎉.. I'm working now to backport this PR to: 3.14, 3.15.
🐍🍒⛏🤖

@bedevere-app

bedevere-app Bot commented Oct 22, 2026

Copy link
Copy Markdown

GH-160393 is a backport of this pull request to the 3.15 branch.

@bedevere-app bedevere-app Bot removed the needs backport to 3.15 bugs and security fixes label Oct 22, 2026
@bedevere-app

bedevere-app Bot commented Oct 22, 2026

Copy link
Copy Markdown

GH-160394 is a backport of this pull request to the 3.14 branch.

@bedevere-app bedevere-app Bot removed the needs backport to 3.14 bugs and security fixes label Oct 22, 2026
StanFromIreland pushed a commit that referenced this pull request Oct 23, 2026
…ehavior (GH-160372) (#160393)

(cherry picked from commit 2c24bc1)

Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com>
StanFromIreland pushed a commit that referenced this pull request Oct 23, 2026
…ehavior (GH-160372) (#160394)

(cherry picked from commit 2c24bc1)

Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com>
@gpshead gpshead added the sprint label Oct 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Documentation in the Doc dir skip news sprint

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

shutil.rmtree() on a symlink with a trailing slash empties its target

2 participants