diff options
author | Tarek Ziadé <ziade.tarek@gmail.com> | 2009-04-05 21:44:08 +0000 |
---|---|---|
committer | Tarek Ziadé <ziade.tarek@gmail.com> | 2009-04-05 21:44:08 +0000 |
commit | faa6b121fb34f1c4db36f20b625ece0291396174 (patch) | |
tree | 71488e49d8e7d675f057410361ff876b1db428ba | |
parent | 91a3b9e4f08a5e1325642c68543495c32fc853f9 (diff) | |
download | cpython-git-faa6b121fb34f1c4db36f20b625ece0291396174.tar.gz |
Fixed #1491431: distutils.filelist.glob_to_re was broken for some edge cases (detailed in the test
-rw-r--r-- | Lib/distutils/filelist.py | 5 | ||||
-rw-r--r-- | Lib/distutils/tests/test_filelist.py | 23 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
3 files changed, 29 insertions, 2 deletions
diff --git a/Lib/distutils/filelist.py b/Lib/distutils/filelist.py index 51a1d57e13..3ba5720ca9 100644 --- a/Lib/distutils/filelist.py +++ b/Lib/distutils/filelist.py @@ -302,7 +302,7 @@ def findall (dir = os.curdir): return list -def glob_to_re (pattern): +def glob_to_re(pattern): """Translate a shell-like glob pattern to a regular expression; return a string containing the regex. Differs from 'fnmatch.translate()' in that '*' does not match "special characters" (which are @@ -317,7 +317,8 @@ def glob_to_re (pattern): # character except the special characters. # XXX currently the "special characters" are just slash -- i.e. this is # Unix-only. - pattern_re = re.sub(r'(^|[^\\])\.', r'\1[^/]', pattern_re) + pattern_re = re.sub(r'((?<!\\)(\\\\)*)\.', r'\1[^/]', pattern_re) + return pattern_re # glob_to_re () diff --git a/Lib/distutils/tests/test_filelist.py b/Lib/distutils/tests/test_filelist.py new file mode 100644 index 0000000000..86db557441 --- /dev/null +++ b/Lib/distutils/tests/test_filelist.py @@ -0,0 +1,23 @@ +"""Tests for distutils.filelist.""" +import unittest +from distutils.filelist import glob_to_re + +class FileListTestCase(unittest.TestCase): + + def test_glob_to_re(self): + # simple cases + self.assertEquals(glob_to_re('foo*'), 'foo[^/]*$') + self.assertEquals(glob_to_re('foo?'), 'foo[^/]$') + self.assertEquals(glob_to_re('foo??'), 'foo[^/][^/]$') + + # special cases + self.assertEquals(glob_to_re(r'foo\\*'), r'foo\\\\[^/]*$') + self.assertEquals(glob_to_re(r'foo\\\*'), r'foo\\\\\\[^/]*$') + self.assertEquals(glob_to_re('foo????'), r'foo[^/][^/][^/][^/]$') + self.assertEquals(glob_to_re(r'foo\\??'), r'foo\\\\[^/][^/]$') + +def test_suite(): + return unittest.makeSuite(FileListTestCase) + +if __name__ == "__main__": + unittest.main(defaultTest="test_suite") @@ -213,6 +213,9 @@ Core and Builtins Library ------- +- Issue #1491431: Fixed distutils.filelist.glob_to_re for edge cases. + Initial fix by Wayne Davison. + - Issue #5693: TestSuite.__iter__ can now be consistently overridden in subclasses. - Issue #5694: removed spurious test output in Distutils (test_clean). |