summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>2000-08-06 21:18:35 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>2000-08-06 21:18:35 (GMT)
commit2fc010937573534a4682844f1e4a21ac3e3cc874 (patch)
tree4d647fad85d33b98d58ffb5cfca4ab35d94a1f88
parent2afffd42fa09b0560d0585029979a79e8bf85192 (diff)
downloadcpython-2fc010937573534a4682844f1e4a21ac3e3cc874.zip
cpython-2fc010937573534a4682844f1e4a21ac3e3cc874.tar.gz
cpython-2fc010937573534a4682844f1e4a21ac3e3cc874.tar.bz2
Rewrite of normpath() by Corran Webster, so trailing :s are removed
(except for : and volume:, where they are needed).
-rw-r--r--Lib/macpath.py55
1 files changed, 23 insertions, 32 deletions
diff --git a/Lib/macpath.py b/Lib/macpath.py
index 899577c..7634f8e 100644
--- a/Lib/macpath.py
+++ b/Lib/macpath.py
@@ -179,39 +179,30 @@ def expanduser(path):
norm_error = 'macpath.norm_error: path cannot be normalized'
def normpath(s):
- """Normalize a pathname: get rid of '::' sequences by backing up,
- e.g., 'foo:bar::bletch' becomes 'foo:bletch'.
- Raise the exception norm_error below if backing up is impossible,
- e.g., for '::foo'."""
- # XXX The Unix version doesn't raise an exception but simply
- # returns an unnormalized path. Should do so here too.
-
- import string
- if ':' not in s:
- return ':' + s
- f = string.splitfields(s, ':')
- pre = []
- post = []
- if not f[0]:
- pre = f[:1]
- f = f[1:]
- if not f[len(f)-1]:
- post = f[-1:]
- f = f[:-1]
- res = []
- for seg in f:
- if seg:
- res.append(seg)
+ """Normalize a pathname. Will return the same result for
+ equivalent paths."""
+
+ if ":" not in s:
+ return ":"+s
+
+ comps = string.splitfields(s, ":")
+ i = 1
+ while i < len(comps)-1:
+ if comps[i] == "" and comps[i-1] != "":
+ if i > 1:
+ del comps[i-1:i+1]
+ i = i-1
+ else:
+ # best way to handle this is to raise an exception
+ raise norm_error, 'Cannot use :: immedeately after volume name'
else:
- if not res: raise norm_error, 'path starts with ::'
- del res[len(res)-1]
- if not (pre or res):
- raise norm_error, 'path starts with volume::'
- if pre: res = pre + res
- if post: res = res + post
- s = res[0]
- for seg in res[1:]:
- s = s + ':' + seg
+ i = i + 1
+
+ s = string.join(comps, ":")
+
+ # remove trailing ":" except for ":" and "Volume:"
+ if s[-1] == ":" and len(comps) > 2 and s != ":"*len(s):
+ s = s[:-1]
return s