From 018dfae246ba7dc173008722e6b3d1bd7197734c Mon Sep 17 00:00:00 2001 From: Skip Montanaro Date: Wed, 19 Jul 2000 17:09:51 +0000 Subject: [PATCH] added rewritten normpath from Moshe Zadka that does the right thing with paths containing .. --- Lib/posixpath.py | 41 ++++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/Lib/posixpath.py b/Lib/posixpath.py index 2f7780c816e..d8da4efa473 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):