Kaydet (Commit) 8f35f44a authored tarafından Neal Norwitz's avatar Neal Norwitz

SF #1685563, MSVCCompiler creates redundant and long PATH strings

If MSVCCompiler.initialize() was called multiple times, the path
would get duplicated.  On Windows, this is a problem because the
path is limited to 4k.  There's no benefit in adding a path multiple
times, so prevent that from occuring.  We also normalize the path
before checking for duplicates so things like /a and /a/ won't both
be stored.

Will backport.
üst 1520fe4e
...@@ -187,6 +187,19 @@ def get_build_architecture(): ...@@ -187,6 +187,19 @@ def get_build_architecture():
j = string.find(sys.version, ")", i) j = string.find(sys.version, ")", i)
return sys.version[i+len(prefix):j] return sys.version[i+len(prefix):j]
def normalize_and_reduce_paths(paths):
"""Return a list of normalized paths with duplicates removed.
The current order of paths is maintained.
"""
# Paths are normalized so things like: /a and /a/ aren't both preserved.
reduced_paths = []
for p in paths:
np = os.path.normpath(p)
# XXX(nnorwitz): O(n**2), if reduced_paths gets long perhaps use a set.
if np not in reduced_paths:
reduced_paths.append(np)
return reduced_paths
class MSVCCompiler (CCompiler) : class MSVCCompiler (CCompiler) :
...@@ -270,6 +283,7 @@ class MSVCCompiler (CCompiler) : ...@@ -270,6 +283,7 @@ class MSVCCompiler (CCompiler) :
self.__paths.append(p) self.__paths.append(p)
except KeyError: except KeyError:
pass pass
self.__paths = normalize_and_reduce_paths(self.__paths)
os.environ['path'] = string.join(self.__paths, ';') os.environ['path'] = string.join(self.__paths, ';')
self.preprocess_options = None self.preprocess_options = None
......
__init+++++++++++ +++++++++++
Python News Python News
+++++++++++ +++++++++++
...@@ -200,6 +200,8 @@ Core and builtins ...@@ -200,6 +200,8 @@ Core and builtins
Library Library
------- -------
- Patch #1685563: remove (don't add) duplicate paths in distutils.MSVCCompiler.
- Added a timeout parameter to the constructor of other protocols - Added a timeout parameter to the constructor of other protocols
(telnetlib, ftplib, smtplib and poplib). This is second part of the (telnetlib, ftplib, smtplib and poplib). This is second part of the
work started with create_connection() and timeout in httplib, and work started with create_connection() and timeout in httplib, and
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment