[PATCH] posix: fix split() for the case where the path is at the root of the filesystem

Remy Blank remy.blank at pobox.com
Wed Jan 9 13:33:11 CST 2013


# HG changeset patch
# User Remy Blank <remy.blank at pobox.com>
# Date 1357759637 -3600
# Node ID 8e96659eec9e524c08f5a4a604e5e2dfd1879ed3
# Parent  83aa4359c49f67bcb98fb9c7d885ed4ac7443239
posix: fix split() for the case where the path is at the root of the filesystem

posixpath.split() strips '/' from the dirname *unless it is the root*. This
patch reproduces this behavior in posix.split(). The old behavior causes a
crash when creating a file at the root of the repo with localrepo.wfile()
when the repo is at the root of the filesystem.

diff --git a/mercurial/posix.py b/mercurial/posix.py
--- a/mercurial/posix.py
+++ b/mercurial/posix.py
@@ -21,14 +21,26 @@ umask = os.umask(0)
 os.umask(umask)
 
 def split(p):
-    '''Same as os.path.split, but faster'''
+    '''Same as posixpath.split, but faster
+
+    >>> import posixpath
+    >>> for f in ['/absolute/path/to/file',
+    ...           'relative/path/to/file',
+    ...           'file_alone',
+    ...           'path/to/directory/',
+    ...           '/multiple/path//separators',
+    ...           '/file_at_root',
+    ...           '///multiple_leading_separators_at_root',
+    ...           '']:
+    ...     assert split(f) == posixpath.split(f), f
+    '''
     ht = p.rsplit('/', 1)
     if len(ht) == 1:
         return '', p
     nh = ht[0].rstrip('/')
     if nh:
         return nh, ht[1]
-    return ht
+    return ht[0] + '/', ht[1]
 
 def openhardlinks():
     '''return true if it is safe to hold open file handles to hardlinks'''
diff --git a/tests/test-doctest.py b/tests/test-doctest.py
--- a/tests/test-doctest.py
+++ b/tests/test-doctest.py
@@ -6,6 +6,8 @@ import doctest
 
 import mercurial.util
 doctest.testmod(mercurial.util)
+# Only run doctests for the current platform
+doctest.testmod(mercurial.util.platform)
 
 import mercurial.changelog
 doctest.testmod(mercurial.changelog)


More information about the Mercurial-devel mailing list