]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #25584: Fixed recursive glob() with patterns starting with '**'.
authorSerhiy Storchaka <storchaka@gmail.com>
Mon, 9 Nov 2015 21:12:07 +0000 (23:12 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Mon, 9 Nov 2015 21:12:07 +0000 (23:12 +0200)
Lib/glob.py
Lib/test/test_glob.py
Misc/NEWS

index 56d670419a682719672cd619c6382d0e6c4ea244..d6742893187b78720e6f8f8bbd74167598b5d465 100644 (file)
@@ -30,6 +30,13 @@ def iglob(pathname, *, recursive=False):
     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 @@ def iglob(pathname, *, recursive=False):
     # 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 glob0(dirname, basename):
 
 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):
index 926588e08bda11149df161a391b8733c7ac982a8..dce64f9fcb1a28e573b83dca74cb693d9b75fec0 100644 (file)
@@ -31,6 +31,7 @@ class GlobTests(unittest.TestCase):
         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 @@ class GlobTests(unittest.TestCase):
 
     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 @@ class GlobTests(unittest.TestCase):
                      ('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 @@ class GlobTests(unittest.TestCase):
             ('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 @@ class GlobTests(unittest.TestCase):
             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)
index 029a55fe6fcf30dba732c9b305fb2c474a235622..00b952f656f639c09abebc6a43fce433fa6b90f5 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -61,6 +61,8 @@ Core and Builtins
 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