added rewritten normpath from Moshe Zadka that does the right thing with
paths containing ..
This commit is contained in:
parent
7cb1524586
commit
018dfae246
|
@ -346,30 +346,25 @@ are left unchanged"""
|
|||
|
||||
def normpath(path):
|
||||
"""Normalize path, eliminating double slashes, etc."""
|
||||
if path == '':
|
||||
return '.'
|
||||
import string
|
||||
# Treat initial slashes specially
|
||||
slashes = ''
|
||||
while path[:1] == '/':
|
||||
slashes = slashes + '/'
|
||||
path = path[1:]
|
||||
comps = string.splitfields(path, '/')
|
||||
i = 0
|
||||
while i < len(comps):
|
||||
if comps[i] == '.':
|
||||
del comps[i]
|
||||
while i < len(comps) and comps[i] == '':
|
||||
del comps[i]
|
||||
elif comps[i] == '..' and i > 0 and comps[i-1] not in ('', '..'):
|
||||
del comps[i-1:i+1]
|
||||
i = i-1
|
||||
elif comps[i] == '' and i > 0 and comps[i-1] <> '':
|
||||
del comps[i]
|
||||
else:
|
||||
i = i+1
|
||||
# If the path is now empty, substitute '.'
|
||||
if not comps and not slashes:
|
||||
comps.append('.')
|
||||
return slashes + string.joinfields(comps, '/')
|
||||
initial_slash = (path[0] == '/')
|
||||
comps = string.split(path, '/')
|
||||
new_comps = []
|
||||
for comp in comps:
|
||||
if comp in ('', '.'):
|
||||
continue
|
||||
if (comp != '..' or (not initial_slash and not new_comps) or
|
||||
(new_comps and new_comps[-1] == '..')):
|
||||
new_comps.append(comp)
|
||||
elif new_comps:
|
||||
new_comps.pop()
|
||||
comps = new_comps
|
||||
path = string.join(comps, '/')
|
||||
if initial_slash:
|
||||
path = '/' + path
|
||||
return path or '.'
|
||||
|
||||
|
||||
def abspath(path):
|
||||
|
|
Loading…
Reference in New Issue