diff options
author | Skip Montanaro <skip@pobox.com> | 2000-07-19 17:09:51 (GMT) |
---|---|---|
committer | Skip Montanaro <skip@pobox.com> | 2000-07-19 17:09:51 (GMT) |
commit | 018dfae246ba7dc173008722e6b3d1bd7197734c (patch) | |
tree | cf19cee4415d5d10984649cc615cf9ed9067982a /Lib | |
parent | 7cb15245860998c4b952c52a0d439d9686ea39bc (diff) | |
download | cpython-018dfae246ba7dc173008722e6b3d1bd7197734c.zip cpython-018dfae246ba7dc173008722e6b3d1bd7197734c.tar.gz cpython-018dfae246ba7dc173008722e6b3d1bd7197734c.tar.bz2 |
added rewritten normpath from Moshe Zadka that does the right thing with
paths containing ..
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/posixpath.py | 41 |
1 files changed, 18 insertions, 23 deletions
diff --git a/Lib/posixpath.py b/Lib/posixpath.py index 2f7780c..d8da4ef 100644 --- a/Lib/posixpath.py +++ b/Lib/posixpath.py @@ -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): |