[PATCH] posix: fix split() for the case where the path is at the root of the filesystem
Mads Kiilerich
mads at kiilerich.com
Sat Jan 5 20:43:48 CST 2013
Looks ok to me. Just some minor comments that doesn't lead to any
conclusion ...
Remy Blank wrote, On 01/06/2013 02:50 AM:
> # HG changeset patch
> # User Remy Blank <remy.blank at pobox.com>
> # Date 1357401181 -3600
> # Node ID c068597242626dbb517e750a7ef0bed664131517
> # 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,32 @@ umask = os.umask(0)
> os.umask(umask)
>
> def split(p):
> - '''Same as os.path.split, but faster'''
> + '''Same as os.path.split, but faster
> +
Nice test coverage. A bit verbose for a doctest ... but probably ok.
> + >>> split('/absolute/path/to/file')
> + ('/absolute/path/to', 'file')
> + >>> split('relative/path/to/file')
> + ('relative/path/to', 'file')
> + >>> split('file_alone')
> + ('', 'file_alone')
> + >>> split('path/to/directory/')
> + ('path/to/directory', '')
> + >>> split('/multiple/path//separators')
> + ('/multiple/path', 'separators')
> + >>> split('/file_at_root')
> + ('/', 'file_at_root')
(This is the case that gave ('', 'file_at_root') without this patch.
That could perhaps be made more clear in the patch description.)
> + >>> split('///multiple_leading_separators_at_root')
> + ('///', 'multiple_leading_separators_at_root')
That patch also changes this result from '//' to '///'. I am not sure
that is an improvement ... but probably not a problem.
> + >>> split('')
> + ('', '')
I can not imagine a case where this is relevant, so it should perhaps
just be left undefined and untested.
> + '''
> 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,7 @@ import doctest
>
> import mercurial.util
> doctest.testmod(mercurial.util)
> +doctest.testmod(mercurial.util.platform)
This is a clever way to make sure posix.py only is doctested on posix
systems ... but I tend to think it would be better to be more explicit.
Somewhat related:
We already use posixpath (= os.path on posix systems) on windows too. We
might soon want to use this posix.split on windows too, so it should
perhaps be made generally available in util somehow ...
/Mads
More information about the Mercurial-devel
mailing list