Skip to content

Commit 1b1f839

Browse files
authored
GH-106747: Make pathlib ABC globbing more consistent with glob.glob() (#115056)
When expanding `**` wildcards, ensure we add a trailing slash to the topmost directory path. This matches `glob.glob()` behaviour: >>> glob.glob('dirA/**', recursive=True) ['dirA/', 'dirA/dirB', 'dirA/dirB/dirC'] This does not affect `pathlib.Path.glob()`, because trailing slashes aren't supported in pathlib proper.
1 parent 299e16c commit 1b1f839

File tree

2 files changed

+18
-18
lines changed

2 files changed

+18
-18
lines changed

Lib/pathlib/_abc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def _select_recursive(parent_paths, dir_only, follow_symlinks):
9595
if follow_symlinks is None:
9696
follow_symlinks = False
9797
for parent_path in parent_paths:
98-
paths = [parent_path]
98+
paths = [parent_path._make_child_relpath('')]
9999
while paths:
100100
path = paths.pop()
101101
yield path

Lib/test/test_pathlib/test_pathlib_abc.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1791,25 +1791,25 @@ def _check(path, glob, expected):
17911791
_check(p, "*/", ["dirA/", "dirB/", "dirC/", "dirE/", "linkB/"])
17921792
_check(p, "dir*/*/..", ["dirC/dirD/..", "dirA/linkC/..", "dirB/linkD/.."])
17931793
_check(p, "dir*/**", [
1794-
"dirA", "dirA/linkC", "dirA/linkC/fileB", "dirA/linkC/linkD", "dirA/linkC/linkD/fileB",
1795-
"dirB", "dirB/fileB", "dirB/linkD", "dirB/linkD/fileB",
1796-
"dirC", "dirC/fileC", "dirC/dirD", "dirC/dirD/fileD", "dirC/novel.txt",
1797-
"dirE"])
1794+
"dirA/", "dirA/linkC", "dirA/linkC/fileB", "dirA/linkC/linkD", "dirA/linkC/linkD/fileB",
1795+
"dirB/", "dirB/fileB", "dirB/linkD", "dirB/linkD/fileB",
1796+
"dirC/", "dirC/fileC", "dirC/dirD", "dirC/dirD/fileD", "dirC/novel.txt",
1797+
"dirE/"])
17981798
_check(p, "dir*/**/", ["dirA/", "dirA/linkC/", "dirA/linkC/linkD/", "dirB/", "dirB/linkD/",
17991799
"dirC/", "dirC/dirD/", "dirE/"])
18001800
_check(p, "dir*/**/..", ["dirA/..", "dirA/linkC/..", "dirB/..",
18011801
"dirB/linkD/..", "dirA/linkC/linkD/..",
18021802
"dirC/..", "dirC/dirD/..", "dirE/.."])
18031803
_check(p, "dir*/*/**", [
1804-
"dirA/linkC", "dirA/linkC/linkD", "dirA/linkC/fileB", "dirA/linkC/linkD/fileB",
1805-
"dirB/linkD", "dirB/linkD/fileB",
1806-
"dirC/dirD", "dirC/dirD/fileD"])
1804+
"dirA/linkC/", "dirA/linkC/linkD", "dirA/linkC/fileB", "dirA/linkC/linkD/fileB",
1805+
"dirB/linkD/", "dirB/linkD/fileB",
1806+
"dirC/dirD/", "dirC/dirD/fileD"])
18071807
_check(p, "dir*/*/**/", ["dirA/linkC/", "dirA/linkC/linkD/", "dirB/linkD/", "dirC/dirD/"])
18081808
_check(p, "dir*/*/**/..", ["dirA/linkC/..", "dirA/linkC/linkD/..",
18091809
"dirB/linkD/..", "dirC/dirD/.."])
18101810
_check(p, "dir*/**/fileC", ["dirC/fileC"])
18111811
_check(p, "dir*/*/../dirD/**/", ["dirC/dirD/../dirD/"])
1812-
_check(p, "*/dirD/**", ["dirC/dirD", "dirC/dirD/fileD"])
1812+
_check(p, "*/dirD/**", ["dirC/dirD/", "dirC/dirD/fileD"])
18131813
_check(p, "*/dirD/**/", ["dirC/dirD/"])
18141814

18151815
@needs_symlinks
@@ -1827,19 +1827,19 @@ def _check(path, glob, expected):
18271827
_check(p, "*/", ["dirA/", "dirB/", "dirC/", "dirE/"])
18281828
_check(p, "dir*/*/..", ["dirC/dirD/.."])
18291829
_check(p, "dir*/**", [
1830-
"dirA", "dirA/linkC",
1831-
"dirB", "dirB/fileB", "dirB/linkD",
1832-
"dirC", "dirC/fileC", "dirC/dirD", "dirC/dirD/fileD", "dirC/novel.txt",
1833-
"dirE"])
1830+
"dirA/", "dirA/linkC",
1831+
"dirB/", "dirB/fileB", "dirB/linkD",
1832+
"dirC/", "dirC/fileC", "dirC/dirD", "dirC/dirD/fileD", "dirC/novel.txt",
1833+
"dirE/"])
18341834
_check(p, "dir*/**/", ["dirA/", "dirB/", "dirC/", "dirC/dirD/", "dirE/"])
18351835
_check(p, "dir*/**/..", ["dirA/..", "dirB/..", "dirC/..", "dirC/dirD/..", "dirE/.."])
1836-
_check(p, "dir*/*/**", ["dirC/dirD", "dirC/dirD/fileD"])
1836+
_check(p, "dir*/*/**", ["dirC/dirD/", "dirC/dirD/fileD"])
18371837
_check(p, "dir*/*/**/", ["dirC/dirD/"])
18381838
_check(p, "dir*/*/**/..", ["dirC/dirD/.."])
18391839
_check(p, "dir*/**/fileC", ["dirC/fileC"])
1840-
_check(p, "dir*/*/../dirD/**", ["dirC/dirD/../dirD", "dirC/dirD/../dirD/fileD"])
1840+
_check(p, "dir*/*/../dirD/**", ["dirC/dirD/../dirD/", "dirC/dirD/../dirD/fileD"])
18411841
_check(p, "dir*/*/../dirD/**/", ["dirC/dirD/../dirD/"])
1842-
_check(p, "*/dirD/**", ["dirC/dirD", "dirC/dirD/fileD"])
1842+
_check(p, "*/dirD/**", ["dirC/dirD/", "dirC/dirD/fileD"])
18431843
_check(p, "*/dirD/**/", ["dirC/dirD/"])
18441844

18451845
def test_rglob_common(self):
@@ -1876,13 +1876,13 @@ def _check(glob, expected):
18761876
"dirC/dirD", "dirC/dirD/fileD"])
18771877
_check(p.rglob("file*"), ["dirC/fileC", "dirC/dirD/fileD"])
18781878
_check(p.rglob("**/file*"), ["dirC/fileC", "dirC/dirD/fileD"])
1879-
_check(p.rglob("dir*/**"), ["dirC/dirD", "dirC/dirD/fileD"])
1879+
_check(p.rglob("dir*/**"), ["dirC/dirD/", "dirC/dirD/fileD"])
18801880
_check(p.rglob("dir*/**/"), ["dirC/dirD/"])
18811881
_check(p.rglob("*/*"), ["dirC/dirD/fileD"])
18821882
_check(p.rglob("*/"), ["dirC/dirD/"])
18831883
_check(p.rglob(""), ["dirC/", "dirC/dirD/"])
18841884
_check(p.rglob("**"), [
1885-
"dirC", "dirC/fileC", "dirC/dirD", "dirC/dirD/fileD", "dirC/novel.txt"])
1885+
"dirC/", "dirC/fileC", "dirC/dirD", "dirC/dirD/fileD", "dirC/novel.txt"])
18861886
_check(p.rglob("**/"), ["dirC/", "dirC/dirD/"])
18871887
# gh-91616, a re module regression
18881888
_check(p.rglob("*.txt"), ["dirC/novel.txt"])

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy