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.
This commit is contained in:
Neal Norwitz 2007-04-01 18:24:22 +00:00
parent 1520fe4e58
commit 8f35f44af3
2 changed files with 17 additions and 1 deletions

View File

@ -187,6 +187,19 @@ def get_build_architecture():
j = string.find(sys.version, ")", i)
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) :
@ -270,6 +283,7 @@ class MSVCCompiler (CCompiler) :
self.__paths.append(p)
except KeyError:
pass
self.__paths = normalize_and_reduce_paths(self.__paths)
os.environ['path'] = string.join(self.__paths, ';')
self.preprocess_options = None

View File

@ -1,4 +1,4 @@
__init+++++++++++
+++++++++++
Python News
+++++++++++
@ -200,6 +200,8 @@ Core and builtins
Library
-------
- Patch #1685563: remove (don't add) duplicate paths in distutils.MSVCCompiler.
- Added a timeout parameter to the constructor of other protocols
(telnetlib, ftplib, smtplib and poplib). This is second part of the
work started with create_connection() and timeout in httplib, and