Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1fb5ce0

Browse files
committed
Avoid using os.path.normcase() on sys.path elements; doing so causes paths
to be presented in an unfamiliar case on case-preserving filesystems. This closes SF patch #436173.
1 parent b0f05bd commit 1fb5ce0

1 file changed

Lines changed: 22 additions & 19 deletions

File tree

Lib/site.py

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -66,22 +66,23 @@
6666

6767

6868
def makepath(*paths):
69-
dir = os.path.join(*paths)
70-
return os.path.normcase(os.path.abspath(dir))
69+
dir = os.path.abspath(os.path.join(*paths))
70+
return dir, os.path.normcase(dir)
7171

72-
L = sys.modules.values()
73-
for m in L:
72+
for m in sys.modules.values():
7473
if hasattr(m, "__file__") and m.__file__:
75-
m.__file__ = makepath(m.__file__)
76-
del m, L
74+
m.__file__ = os.path.abspath(m.__file__)
75+
del m
7776

7877
# This ensures that the initial path provided by the interpreter contains
7978
# only absolute pathnames, even if we're running from the build directory.
8079
L = []
80+
dirs_in_sys_path = {}
8181
for dir in sys.path:
82-
dir = makepath(dir)
83-
if dir not in L:
82+
dir, dircase = makepath(dir)
83+
if not dirs_in_sys_path.has_key(dircase):
8484
L.append(dir)
85+
dirs_in_sys_path[dircase] = 1
8586
sys.path[:] = L
8687
del dir, L
8788

@@ -95,14 +96,13 @@ def makepath(*paths):
9596
del get_platform, s
9697

9798
def addsitedir(sitedir):
98-
sitedir = makepath(sitedir)
99-
if sitedir not in sys.path:
99+
sitedir, sitedircase = makepath(sitedir)
100+
if not dirs_in_sys_path.has_key(sitedircase):
100101
sys.path.append(sitedir) # Add path component
101102
try:
102103
names = os.listdir(sitedir)
103104
except os.error:
104105
return
105-
names = map(os.path.normcase, names)
106106
names.sort()
107107
for name in names:
108108
if name[-4:] == endsep + "pth":
@@ -125,29 +125,32 @@ def addpackage(sitedir, name):
125125
continue
126126
if dir[-1] == '\n':
127127
dir = dir[:-1]
128-
dir = makepath(sitedir, dir)
129-
if dir not in sys.path and os.path.exists(dir):
128+
dir, dircase = makepath(sitedir, dir)
129+
if not dirs_in_sys_path.has_key(dircase) and os.path.exists(dir):
130130
sys.path.append(dir)
131+
dirs_in_sys_path[dircase] = 1
131132

132133
prefixes = [sys.prefix]
133134
if sys.exec_prefix != sys.prefix:
134135
prefixes.append(sys.exec_prefix)
135136
for prefix in prefixes:
136137
if prefix:
137138
if os.sep == '/':
138-
sitedirs = [makepath(prefix,
139-
"lib",
140-
"python" + sys.version[:3],
141-
"site-packages"),
142-
makepath(prefix, "lib", "site-python")]
139+
sitedirs = [os.path.join(prefix,
140+
"lib",
141+
"python" + sys.version[:3],
142+
"site-packages"),
143+
os.path.join(prefix, "lib", "site-python")]
143144
elif os.sep == ':':
144-
sitedirs = [makepath(prefix, "lib", "site-packages")]
145+
sitedirs = [os.path.join(prefix, "lib", "site-packages")]
145146
else:
146147
sitedirs = [prefix]
147148
for sitedir in sitedirs:
148149
if os.path.isdir(sitedir):
149150
addsitedir(sitedir)
150151

152+
del dirs_in_sys_path
153+
151154
# Define new built-ins 'quit' and 'exit'.
152155
# These are simply strings that display a hint on how to exit.
153156
if os.sep == ':':

0 commit comments

Comments
 (0)