]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
ntpath now compresses erroneous slashes between the drive letter and rest of
authorBrett Cannon <bcannon@gmail.com>
Sat, 10 Jul 2004 20:47:29 +0000 (20:47 +0000)
committerBrett Cannon <bcannon@gmail.com>
Sat, 10 Jul 2004 20:47:29 +0000 (20:47 +0000)
the path.  Also clarifies handling of UNC paths.  Appropriate test were added.

Fixes bug #980327 with patch #988607.  Thanks Paul Moore.

Lib/ntpath.py
Lib/test/test_ntpath.py
Misc/NEWS

index 687d88513e2051dab276bb4fe3f1b7d83c7b85dd..65ef6844267b59f86e568183dcf8db33b845aedf 100644 (file)
@@ -439,9 +439,25 @@ def normpath(path):
     """Normalize path, eliminating double slashes, etc."""
     path = path.replace("/", "\\")
     prefix, path = splitdrive(path)
-    while path[:1] == "\\":
-        prefix = prefix + "\\"
-        path = path[1:]
+    # We need to be careful here. If the prefix is empty, and the path starts
+    # with a backslash, it could either be an absolute path on the current
+    # drive (\dir1\dir2\file) or a UNC filename (\\server\mount\dir1\file). It
+    # is therefore imperative NOT to collapse multiple backslashes blindly in
+    # that case.
+    # The code below preserves multiple backslashes when there is no drive
+    # letter. This means that the invalid filename \\\a\b is preserved
+    # unchanged, where a\\\b is normalised to a\b. It's not clear that there
+    # is any better behaviour for such edge cases.
+    if prefix == '':
+        # No drive letter - preserve initial backslashes
+        while path[:1] == "\\":
+            prefix = prefix + "\\"
+            path = path[1:]
+    else:
+        # We have a drive letter - collapse initial backslashes
+        if path.startswith("\\"):
+            prefix = prefix + "\\"
+            path = path.lstrip("\\")
     comps = path.split("\\")
     i = 0
     while i < len(comps):
index fdb431aa6413cd003bbc23e4b70dffef6b72bd66..139aa1f28e06160dc72752c605872d2f37696dda 100644 (file)
@@ -99,12 +99,9 @@ tester("ntpath.normpath('C:A//B')", r'C:A\B')
 tester("ntpath.normpath('D:A/./B')", r'D:A\B')
 tester("ntpath.normpath('e:A/foo/../B')", r'e:A\B')
 
-# Next 3 seem dubious, and especially the 3rd, but normpath is possibly
-# trying to leave UNC paths alone without actually knowing anything about
-# them.
-tester("ntpath.normpath('C:///A//B')", r'C:\\\A\B')
-tester("ntpath.normpath('D:///A/./B')", r'D:\\\A\B')
-tester("ntpath.normpath('e:///A/foo/../B')", r'e:\\\A\B')
+tester("ntpath.normpath('C:///A//B')", r'C:\A\B')
+tester("ntpath.normpath('D:///A/./B')", r'D:\A\B')
+tester("ntpath.normpath('e:///A/foo/../B')", r'e:\A\B')
 
 tester("ntpath.normpath('..')", r'..')
 tester("ntpath.normpath('.')", r'.')
@@ -115,6 +112,8 @@ tester("ntpath.normpath('/../.././..')", '\\')
 tester("ntpath.normpath('c:/../../..')", 'c:\\')
 tester("ntpath.normpath('../.././..')", r'..\..\..')
 tester("ntpath.normpath('K:../.././..')", r'K:..\..\..')
+tester("ntpath.normpath('C:////a/b')", r'C:\a\b')
+tester("ntpath.normpath('//machine/share//a/b')", r'\\machine\share\a\b')
 
 # ntpath.abspath() can only be used on a system with the "nt" module
 # (reasonably), so we protect this test with "import nt".  This allows
index 5d736ee95947683748a30433aa59a4e0e3364eec..46050d7cb80077592198b3e5b7d7c46ee5093c23 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -40,6 +40,10 @@ Extension modules
 Library
 -------
 
+- Bug #980327/Patch #988607: ntpath now compresses extra slashes between the
+  drive letter and the rest of the path properly.  Also removed ambiguity from
+  UNC paths.  Thanks Paul Moore.
+
 - Bug #679953: zipfile can now handle file sizes over 2 GB.  Previously the
   compressed and uncompressed file sizes were being stored as signed longs
   instead of unsigned as the ZIP spec specifies.