]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
patch [ 1105730 ] Faster commonprefix in macpath, ntpath, etc.
authorGeorg Brandl <georg@python.org>
Wed, 3 Aug 2005 07:30:12 +0000 (07:30 +0000)
committerGeorg Brandl <georg@python.org>
Wed, 3 Aug 2005 07:30:12 +0000 (07:30 +0000)
Lib/macpath.py
Lib/ntpath.py
Lib/os2emxpath.py
Lib/plat-riscos/riscospath.py
Misc/NEWS

index f50f66072d9a4f23d8a6103c93363a4270dadad9..dc7f753f02760c8b2f665adf9d114cf13b28b247 100644 (file)
@@ -175,14 +175,14 @@ def lexists(path):
 def commonprefix(m):
     "Given a list of pathnames, returns the longest common leading component"
     if not m: return ''
-    prefix = m[0]
-    for item in m:
-        for i in range(len(prefix)):
-            if prefix[:i+1] != item[:i+1]:
-                prefix = prefix[:i]
-                if i == 0: return ''
-                break
-    return prefix
+    s1 = min(m)
+    s2 = max(m)
+    n = min(len(s1), len(s2))
+    for i in xrange(n):
+        if s1[i] != s2[i]:
+            return s1[:i]
+    return s1[:n]
+
 
 def expandvars(path):
     """Dummy to retain interface-compatibility with other operating systems."""
index 649e424f26443e38632901ae54213d3a0932525b..35f266c69be310c19b28a23ff7257482f8b9c9df 100644 (file)
@@ -212,14 +212,13 @@ def dirname(p):
 def commonprefix(m):
     "Given a list of pathnames, returns the longest common leading component"
     if not m: return ''
-    prefix = m[0]
-    for item in m:
-        for i in range(len(prefix)):
-            if prefix[:i+1] != item[:i+1]:
-                prefix = prefix[:i]
-                if i == 0: return ''
-                break
-    return prefix
+    s1 = min(m)
+    s2 = max(m)
+    n = min(len(s1), len(s2))
+    for i in xrange(n):
+        if s1[i] != s2[i]:
+            return s1[:i]
+    return s1[:n]
 
 
 # Get size, mtime, atime of files.
index 4c64324e9d7400a281997652bc79839845fc7099..5b1cb186e39b4b9db47230a5a332d0ce58b1c3ee 100644 (file)
@@ -173,14 +173,13 @@ def dirname(p):
 def commonprefix(m):
     "Given a list of pathnames, returns the longest common leading component"
     if not m: return ''
-    prefix = m[0]
-    for item in m:
-        for i in range(len(prefix)):
-            if prefix[:i+1] != item[:i+1]:
-                prefix = prefix[:i]
-                if i == 0: return ''
-                break
-    return prefix
+    s1 = min(m)
+    s2 = max(m)
+    n = min(len(s1), len(s2))
+    for i in xrange(n):
+        if s1[i] != s2[i]:
+            return s1[:i]
+    return s1[:n]
 
 
 # Get size, mtime, atime of files.
index 97b4f65780319bf6d8117aa8d29c1aa3c00c12ce..ea39e60f10353b1957fa628c0a3fc43ee05a6a6e 100644 (file)
@@ -168,23 +168,16 @@ def dirname(p):
     return split(p)[0]
 
 
-def commonprefix(ps):
-    """
-  Return the longest prefix of all list elements. Purely string-based; does not
-  separate any path parts. Why am I in os.path?
-  """
-    if len(ps)==0:
-        return ''
-    prefix= ps[0]
-    for p in ps[1:]:
-        prefix= prefix[:len(p)]
-        for i in range(len(prefix)):
-            if prefix[i] <> p[i]:
-                prefix= prefix[:i]
-                if i==0:
-                    return ''
-                break
-    return prefix
+def commonprefix(m):
+    "Given a list of pathnames, returns the longest common leading component"
+    if not m: return ''
+    s1 = min(m)
+    s2 = max(m)
+    n = min(len(s1), len(s2))
+    for i in xrange(n):
+        if s1[i] != s2[i]:
+            return s1[:i]
+    return s1[:n]
 
 
 ## File access functions. Why are we in os.path?
index ebc9b0dea29f7d04434e16c446297bbdecc5f913..8a2d504b43f3f38a5684b2aba2475b5af61fc05f 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -178,6 +178,9 @@ Extension Modules
 Library
 -------
 
+- Patch #1105730: Apply the new implementation of commonprefix in posixpath
+  to ntpath, macpath, os2emxpath and riscospath.
+
 - Fix a problem in Tkinter introduced by SF patch #869468: delete bogus
   __hasattr__ and __delattr__ methods on class Tk that were breaking
   Tkdnd.