[Python-checkins] cpython (3.4): Issue #12885: Revert commits in 3.4 branch which is security-only fixes.

jason.coombs python-checkins at python.org
Thu Sep 1 23:29:41 EDT 2016


https://hg.python.org/cpython/rev/e82b995d1a5c
changeset:   103005:e82b995d1a5c
branch:      3.4
parent:      103002:590d0de4ff48
user:        Jason R. Coombs <jaraco at jaraco.com>
date:        Thu Sep 01 23:27:45 2016 -0400
summary:
  Issue #12885: Revert commits in 3.4 branch which is security-only fixes.

files:
  Lib/distutils/filelist.py            |  46 ++++++++------
  Lib/distutils/tests/test_filelist.py |  48 +---------------
  Misc/NEWS                            |   2 -
  3 files changed, 28 insertions(+), 68 deletions(-)


diff --git a/Lib/distutils/filelist.py b/Lib/distutils/filelist.py
--- a/Lib/distutils/filelist.py
+++ b/Lib/distutils/filelist.py
@@ -6,7 +6,6 @@
 
 import os, re
 import fnmatch
-import functools
 from distutils.util import convert_path
 from distutils.errors import DistutilsTemplateError, DistutilsInternalError
 from distutils import log
@@ -243,28 +242,35 @@
 # ----------------------------------------------------------------------
 # Utility functions
 
-def _find_all_simple(path):
+def findall(dir=os.curdir):
+    """Find all files under 'dir' and return the list of full filenames
+    (relative to 'dir').
     """
-    Find all files under 'path'
-    """
-    results = (
-        os.path.join(base, file)
-        for base, dirs, files in os.walk(path, followlinks=True)
-        for file in files
-    )
-    return filter(os.path.isfile, results)
+    from stat import ST_MODE, S_ISREG, S_ISDIR, S_ISLNK
 
+    list = []
+    stack = [dir]
+    pop = stack.pop
+    push = stack.append
 
-def findall(dir=os.curdir):
-    """
-    Find all files under 'dir' and return the list of full filenames.
-    Unless dir is '.', return full filenames with dir prepended.
-    """
-    files = _find_all_simple(dir)
-    if dir == os.curdir:
-        make_rel = functools.partial(os.path.relpath, start=dir)
-        files = map(make_rel, files)
-    return list(files)
+    while stack:
+        dir = pop()
+        names = os.listdir(dir)
+
+        for name in names:
+            if dir != os.curdir:        # avoid the dreaded "./" syndrome
+                fullname = os.path.join(dir, name)
+            else:
+                fullname = name
+
+            # Avoid excess stat calls -- just one will do, thank you!
+            stat = os.stat(fullname)
+            mode = stat[ST_MODE]
+            if S_ISREG(mode):
+                list.append(fullname)
+            elif S_ISDIR(mode) and not S_ISLNK(mode):
+                push(fullname)
+    return list
 
 
 def glob_to_re(pattern):
diff --git a/Lib/distutils/tests/test_filelist.py b/Lib/distutils/tests/test_filelist.py
--- a/Lib/distutils/tests/test_filelist.py
+++ b/Lib/distutils/tests/test_filelist.py
@@ -6,10 +6,8 @@
 from distutils.log import WARN
 from distutils.errors import DistutilsTemplateError
 from distutils.filelist import glob_to_re, translate_pattern, FileList
-from distutils import filelist
 
-import test.support
-from test.support import captured_stdout, run_unittest
+from test.support import captured_stdout
 from distutils.tests import support
 
 MANIFEST_IN = """\
@@ -294,47 +292,5 @@
         self.assertWarnings()
 
 
-class FindAllTestCase(unittest.TestCase):
-    @test.support.skip_unless_symlink
-    def test_missing_symlink(self):
-        with test.support.temp_cwd():
-            os.symlink('foo', 'bar')
-            self.assertEqual(filelist.findall(), [])
-
-    def test_basic_discovery(self):
-        """
-        When findall is called with no parameters or with
-        '.' as the parameter, the dot should be omitted from
-        the results.
-        """
-        with test.support.temp_cwd():
-            os.mkdir('foo')
-            file1 = os.path.join('foo', 'file1.txt')
-            test.support.create_empty_file(file1)
-            os.mkdir('bar')
-            file2 = os.path.join('bar', 'file2.txt')
-            test.support.create_empty_file(file2)
-            expected = [file2, file1]
-            self.assertEqual(sorted(filelist.findall()), expected)
-
-    def test_non_local_discovery(self):
-        """
-        When findall is called with another path, the full
-        path name should be returned.
-        """
-        with test.support.temp_dir() as temp_dir:
-            file1 = os.path.join(temp_dir, 'file1.txt')
-            test.support.create_empty_file(file1)
-            expected = [file1]
-            self.assertEqual(filelist.findall(temp_dir), expected)
-
-
-def test_suite():
-    return unittest.TestSuite([
-        unittest.makeSuite(FileListTestCase),
-        unittest.makeSuite(FindAllTestCase),
-    ])
-
-
 if __name__ == "__main__":
-    run_unittest(test_suite())
+    unittest.main()
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,8 +13,6 @@
 Library
 -------
 
-- Issue #12885: Fix error when distutils encounters symlink.
-
 - In the curses module, raise an error if window.getstr() or window.instr() is
   passed a negative value.
 

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list