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.
--- a/mercurial/posix.py Wed Jan 09 21:13:52 2013 +0200
+++ b/mercurial/posix.py Wed Jan 09 20:27:17 2013 +0100
@@ -21,14 +21,26 @@
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'''
--- a/tests/test-doctest.py Wed Jan 09 21:13:52 2013 +0200
+++ b/tests/test-doctest.py Wed Jan 09 20:27:17 2013 +0100
@@ -6,6 +6,8 @@
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)