Skip to content

Commit

Permalink
Merge pull request #6204 from docker/5716-unix-paths-from-winhost
Browse files Browse the repository at this point in the history
Don't convert slashes for UNIX paths on Windows hosts
  • Loading branch information
shin- authored Sep 21, 2018
2 parents 30afcc4 + 9f9122c commit 2a7beb6
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 4 deletions.
19 changes: 16 additions & 3 deletions compose/config/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,20 @@ def normalize_path_for_engine(path):
return path.replace('\\', '/')


def normpath(path, win_host=False):
""" Custom path normalizer that handles Compose-specific edge cases like
UNIX paths on Windows hosts and vice-versa. """

sysnorm = ntpath.normpath if win_host else os.path.normpath
# If a path looks like a UNIX absolute path on Windows, it probably is;
# we'll need to revert the backslashes to forward slashes after normalization
flip_slashes = path.startswith('/') and IS_WINDOWS_PLATFORM
path = sysnorm(path)
if flip_slashes:
path = path.replace('\\', '/')
return path


class MountSpec(object):
options_map = {
'volume': {
Expand All @@ -152,12 +166,11 @@ class MountSpec(object):

@classmethod
def parse(cls, mount_dict, normalize=False, win_host=False):
normpath = ntpath.normpath if win_host else os.path.normpath
if mount_dict.get('source'):
if mount_dict['type'] == 'tmpfs':
raise ConfigurationError('tmpfs mounts can not specify a source')

mount_dict['source'] = normpath(mount_dict['source'])
mount_dict['source'] = normpath(mount_dict['source'], win_host)
if normalize:
mount_dict['source'] = normalize_path_for_engine(mount_dict['source'])

Expand Down Expand Up @@ -247,7 +260,7 @@ def separate_next_section(volume_config):
else:
external = parts[0]
parts = separate_next_section(parts[1])
external = ntpath.normpath(external)
external = normpath(external, True)
internal = parts[0]
if len(parts) > 1:
if ':' in parts[1]:
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/config/config_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -1291,7 +1291,7 @@ def test_volumes_long_syntax(self):
assert tmpfs_mount.target == '/tmpfs'
assert not tmpfs_mount.is_named_volume

assert host_mount.source == os.path.normpath('/abc')
assert host_mount.source == '/abc'
assert host_mount.target == '/xyz'
assert not host_mount.is_named_volume

Expand Down

0 comments on commit 2a7beb6

Please sign in to comment.