summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2016-09-02 03:27:45 (GMT)
committerJason R. Coombs <jaraco@jaraco.com>2016-09-02 03:27:45 (GMT)
commit79ae9671ff3db55da376af8ce2e56e6bf2b95c2b (patch)
treed4eb062ef602bcd182b016e7f41f952728fed623
parent6f5d3fd4d1c8cc575951ace5894428d0c2901eb6 (diff)
downloadcpython-79ae9671ff3db55da376af8ce2e56e6bf2b95c2b.zip
cpython-79ae9671ff3db55da376af8ce2e56e6bf2b95c2b.tar.gz
cpython-79ae9671ff3db55da376af8ce2e56e6bf2b95c2b.tar.bz2
Issue #12885: Revert commits in 3.4 branch which is security-only fixes.
-rw-r--r--Lib/distutils/filelist.py48
-rw-r--r--Lib/distutils/tests/test_filelist.py48
-rw-r--r--Misc/NEWS2
3 files changed, 29 insertions, 69 deletions
diff --git a/Lib/distutils/filelist.py b/Lib/distutils/filelist.py
index 6522e69..db3f7a9 100644
--- a/Lib/distutils/filelist.py
+++ b/Lib/distutils/filelist.py
@@ -6,7 +6,6 @@ and building lists of files.
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 @@ class FileList:
# ----------------------------------------------------------------------
# Utility functions
-def _find_all_simple(path):
- """
- 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)
-
-
def findall(dir=os.curdir):
+ """Find all files under 'dir' and return the list of full filenames
+ (relative to 'dir').
"""
- 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)
+ from stat import ST_MODE, S_ISREG, S_ISDIR, S_ISLNK
+
+ list = []
+ stack = [dir]
+ pop = stack.pop
+ push = stack.append
+
+ 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
index 391af3c..278809c 100644
--- a/Lib/distutils/tests/test_filelist.py
+++ b/Lib/distutils/tests/test_filelist.py
@@ -6,10 +6,8 @@ from distutils import debug
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 @@ class FileListTestCase(support.LoggingSilencer,
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
index 0624c9a..aad29d9 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,8 +13,6 @@ Core and Builtins
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.