summaryrefslogtreecommitdiffstats
path: root/Lib/posixpath.py
diff options
context:
space:
mode:
authorSkip Montanaro <skip@pobox.com>2000-07-19 17:09:51 (GMT)
committerSkip Montanaro <skip@pobox.com>2000-07-19 17:09:51 (GMT)
commit018dfae246ba7dc173008722e6b3d1bd7197734c (patch)
treecf19cee4415d5d10984649cc615cf9ed9067982a /Lib/posixpath.py
parent7cb15245860998c4b952c52a0d439d9686ea39bc (diff)
downloadcpython-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/posixpath.py')
-rw-r--r--Lib/posixpath.py41
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):