Mercurial > hg
changeset 47809:98c3fa6a3ac2 stable
vfs: always use / as file separator (issue6546)
Various part of vfs already enforce `/` usage and using `\` confuse the encoded
vfs. So we simply use `/` all the time.
Differential Revision: https://phab.mercurial-scm.org/D11260
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Thu, 05 Aug 2021 12:53:44 +0200 |
parents | 23921bc857b5 |
children | 6ec897345b87 |
files | mercurial/vfs.py tests/test-annotate.t |
diffstat | 2 files changed, 24 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/vfs.py Thu Aug 05 12:53:36 2021 +0200 +++ b/mercurial/vfs.py Thu Aug 05 12:53:44 2021 +0200 @@ -50,6 +50,14 @@ class abstractvfs(object): """Abstract base class; cannot be instantiated""" + # default directory separator for vfs + # + # Other vfs code always use `/` and this works fine because python file API + # abstract the use of `/` and make it work transparently. For consistency + # vfs will always use `/` when joining. This avoid some confusion in + # encoded vfs (see issue6546) + _dir_sep = b'/' + def __init__(self, *args, **kwargs): '''Prevent instantiation; don't call this from subclasses.''' raise NotImplementedError('attempted instantiating ' + str(type(self))) @@ -152,12 +160,22 @@ mode = st.st_mode return stat.S_ISREG(mode) or stat.S_ISLNK(mode) + def _join(self, *paths): + root_idx = 0 + for idx, p in enumerate(paths): + if os.path.isabs(p) or p.startswith(self._dir_sep): + root_idx = idx + if root_idx != 0: + paths = paths[root_idx:] + paths = [p for p in paths if p] + return self._dir_sep.join(paths) + def reljoin(self, *paths): """join various elements of a path together (as os.path.join would do) The vfs base is not injected so that path stay relative. This exists to allow handling of strange encoding if needed.""" - return os.path.join(*paths) + return self._join(*paths) def split(self, path): """split top-most element of a path (as os.path.split would do) @@ -528,7 +546,9 @@ def join(self, path, *insidef): if path: - return os.path.join(self.base, path, *insidef) + parts = [self.base, path] + parts.extend(insidef) + return self._join(*parts) else: return self.base
--- a/tests/test-annotate.t Thu Aug 05 12:53:36 2021 +0200 +++ b/tests/test-annotate.t Thu Aug 05 12:53:44 2021 +0200 @@ -631,7 +631,7 @@ $ rm baz $ hg annotate -ncr "wdir()" baz - abort: $TESTTMP\repo\baz: $ENOENT$ (windows !) + abort: $TESTTMP\repo/baz: $ENOENT$ (windows !) abort: $ENOENT$: '$TESTTMP/repo/baz' (no-windows !) [255] @@ -640,7 +640,7 @@ $ hg rm baz $ hg annotate -ncr "wdir()" baz - abort: $TESTTMP\repo\baz: $ENOENT$ (windows !) + abort: $TESTTMP\repo/baz: $ENOENT$ (windows !) abort: $ENOENT$: '$TESTTMP/repo/baz' (no-windows !) [255]