Skip to content

Commit 66382e5

Browse files
barneygalefsc-eriker
authored andcommitted
pythonGH-106747: Make pathlib ABC globbing more consistent with glob.glob() (python#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 51ab7b1 commit 66382e5

File tree

2 files changed

+18
-18
lines changed

2 files changed

+18
-18
lines changed

Lib/pathlib/_abc.py

+1-1
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

+17-17
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)