[Python-checkins] cpython (merge 3.5 -> default): Issue #25584: Fixed recursive glob() with patterns starting with '**'.

serhiy.storchaka python-checkins at python.org
Mon Nov 9 16:19:31 EST 2015


https://hg.python.org/cpython/rev/175cd763de57
changeset: 99026:175cd763de57
parent: 99024:c87738735107
parent: 99025:4532c4f37429
user: Serhiy Storchaka <storchaka at gmail.com>
date: Mon Nov 09 23:12:28 2015 +0200
summary:
 Issue #25584: Fixed recursive glob() with patterns starting with '**'.
files:
 Lib/glob.py | 13 +++++++++----
 Lib/test/test_glob.py | 21 +++++++++++++++------
 Misc/NEWS | 2 ++
 3 files changed, 26 insertions(+), 10 deletions(-)
diff --git a/Lib/glob.py b/Lib/glob.py
--- a/Lib/glob.py
+++ b/Lib/glob.py
@@ -30,6 +30,13 @@
 If recursive is true, the pattern '**' will match any files and
 zero or more directories and subdirectories.
 """
+ it = _iglob(pathname, recursive)
+ if recursive and _isrecursive(pathname):
+ s = next(it) # skip empty string
+ assert not s
+ return it
+
+def _iglob(pathname, recursive):
 dirname, basename = os.path.split(pathname)
 if not has_magic(pathname):
 if basename:
@@ -50,7 +57,7 @@
 # drive or UNC path. Prevent an infinite recursion if a drive or UNC path
 # contains magic characters (i.e. r'\\?\C:').
 if dirname != pathname and has_magic(dirname):
- dirs = iglob(dirname, recursive=recursive)
+ dirs = _iglob(dirname, recursive)
 else:
 dirs = [dirname]
 if has_magic(basename):
@@ -98,12 +105,10 @@
 
 def glob2(dirname, pattern):
 assert _isrecursive(pattern)
- if dirname:
- yield pattern[:0]
+ yield pattern[:0]
 yield from _rlistdir(dirname)
 
 # Recursively yields relative pathnames inside a literal directory.
-
 def _rlistdir(dirname):
 if not dirname:
 if isinstance(dirname, bytes):
diff --git a/Lib/test/test_glob.py b/Lib/test/test_glob.py
--- a/Lib/test/test_glob.py
+++ b/Lib/test/test_glob.py
@@ -31,6 +31,7 @@
 self.mktemp('.bb', 'H')
 self.mktemp('aaa', 'zzzF')
 self.mktemp('ZZZ')
+ self.mktemp('EF')
 self.mktemp('a', 'bcd', 'EF')
 self.mktemp('a', 'bcd', 'efg', 'ha')
 if can_symlink():
@@ -200,7 +201,7 @@
 
 def test_recursive_glob(self):
 eq = self.assertSequencesEqual_noorder
- full = [('ZZZ',),
+ full = [('EF',), ('ZZZ',),
 ('a',), ('a', 'D'),
 ('a', 'bcd'),
 ('a', 'bcd', 'EF'),
@@ -217,8 +218,8 @@
 ('sym3', 'efg', 'ha'),
 ]
 eq(self.rglob('**'), self.joins(('',), *full))
- eq(self.rglob('.', '**'), self.joins(('.',''),
- *(('.',) + i for i in full)))
+ eq(self.rglob(os.curdir, '**'),
+ self.joins((os.curdir, ''), *((os.curdir,) + i for i in full)))
 dirs = [('a', ''), ('a', 'bcd', ''), ('a', 'bcd', 'efg', ''),
 ('aaa', ''), ('aab', '')]
 if can_symlink():
@@ -229,11 +230,11 @@
 ('a', ''), ('a', 'D'), ('a', 'bcd'), ('a', 'bcd', 'EF'),
 ('a', 'bcd', 'efg'), ('a', 'bcd', 'efg', 'ha')))
 eq(self.rglob('a**'), self.joins(('a',), ('aaa',), ('aab',)))
- expect = [('a', 'bcd', 'EF')]
+ expect = [('a', 'bcd', 'EF'), ('EF',)]
 if can_symlink():
 expect += [('sym3', 'EF')]
 eq(self.rglob('**', 'EF'), self.joins(*expect))
- expect = [('a', 'bcd', 'EF'), ('aaa', 'zzzF'), ('aab', 'F')]
+ expect = [('a', 'bcd', 'EF'), ('aaa', 'zzzF'), ('aab', 'F'), ('EF',)]
 if can_symlink():
 expect += [('sym3', 'EF')]
 eq(self.rglob('**', '*F'), self.joins(*expect))
@@ -247,10 +248,18 @@
 eq(glob.glob('**', recursive=True), [join(*i) for i in full])
 eq(glob.glob(join('**', ''), recursive=True),
 [join(*i) for i in dirs])
+ eq(glob.glob(join('**', '*'), recursive=True),
+ [join(*i) for i in full])
+ eq(glob.glob(join(os.curdir, '**'), recursive=True),
+ [join(os.curdir, '')] + [join(os.curdir, *i) for i in full])
+ eq(glob.glob(join(os.curdir, '**', ''), recursive=True),
+ [join(os.curdir, '')] + [join(os.curdir, *i) for i in dirs])
+ eq(glob.glob(join(os.curdir, '**', '*'), recursive=True),
+ [join(os.curdir, *i) for i in full])
 eq(glob.glob(join('**','zz*F'), recursive=True),
 [join('aaa', 'zzzF')])
 eq(glob.glob('**zz*F', recursive=True), [])
- expect = [join('a', 'bcd', 'EF')]
+ expect = [join('a', 'bcd', 'EF'), 'EF']
 if can_symlink():
 expect += [join('sym3', 'EF')]
 eq(glob.glob(join('**', 'EF'), recursive=True), expect)
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -79,6 +79,8 @@
 Library
 -------
 
+- Issue #25584: Fixed recursive glob() with patterns starting with '\*\*'.
+
 - Issue #25446: Fix regression in smtplib's AUTH LOGIN support.
 
 - Issue #18010: Fix the pydoc web server's module search function to handle
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /