Skip to content

Commit

Permalink
Merge pull request #6205 from docker/2473-windows-long-paths
Browse files Browse the repository at this point in the history
Force consistent behavior around long paths on Windows builds
  • Loading branch information
shin- committed Sep 20, 2018
2 parents f80630f + 96a49a0 commit 0fb6cd1
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 6 deletions.
1 change: 1 addition & 0 deletions compose/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
PARALLEL_LIMIT = 64

SECRETS_PATH = '/run/secrets'
WINDOWS_LONGPATH_PREFIX = '\\\\?\\'

COMPOSEFILE_V1 = ComposeVersion('1')
COMPOSEFILE_V2_0 = ComposeVersion('2.0')
Expand Down
20 changes: 14 additions & 6 deletions compose/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
from .const import LABEL_SLUG
from .const import LABEL_VERSION
from .const import NANOCPUS_SCALE
from .const import WINDOWS_LONGPATH_PREFIX
from .container import Container
from .errors import HealthCheckFailed
from .errors import NoHealthCheckConfigured
Expand Down Expand Up @@ -1048,12 +1049,7 @@ def build(self, no_cache=False, pull=False, force_rm=False, memory=None, build_a
for k, v in self._parse_proxy_config().items():
build_args.setdefault(k, v)

# python2 os.stat() doesn't support unicode on some UNIX, so we
# encode it to a bytestring to be safe
path = build_opts.get('context')
if not six.PY3 and not IS_WINDOWS_PLATFORM:
path = path.encode('utf8')

path = rewrite_build_path(build_opts.get('context'))
if self.platform and version_lt(self.client.api_version, '1.35'):
raise OperationFailedError(
'Impossible to perform platform-targeted builds for API version < 1.35'
Expand Down Expand Up @@ -1662,3 +1658,15 @@ def convert_blkio_config(blkio_config):
arr.append(dict([(k.capitalize(), v) for k, v in item.items()]))
result[field] = arr
return result


def rewrite_build_path(path):
# python2 os.stat() doesn't support unicode on some UNIX, so we
# encode it to a bytestring to be safe
if not six.PY3 and not IS_WINDOWS_PLATFORM:
path = path.encode('utf8')

if IS_WINDOWS_PLATFORM and not path.startswith(WINDOWS_LONGPATH_PREFIX):
path = WINDOWS_LONGPATH_PREFIX + os.path.normpath(path)

return path

0 comments on commit 0fb6cd1

Please sign in to comment.