added rewritten normpath from Moshe Zadka that does the right thing with

paths containing ..
This commit is contained in:
Skip Montanaro 2000-07-19 17:09:51 +00:00
parent 7cb1524586
commit 018dfae246
1 changed files with 18 additions and 23 deletions

View File

@ -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):