Răsfoiți Sursa

Force consistent behavior around long paths on Windows builds

Signed-off-by: Joffrey F <[email protected]>
Joffrey F 7 ani în urmă
părinte
comite
96a49a0253
2 a modificat fișierele cu 15 adăugiri și 6 ștergeri
  1. 1 0
      compose/const.py
  2. 14 6
      compose/service.py

+ 1 - 0
compose/const.py

@@ -22,6 +22,7 @@ NANOCPUS_SCALE = 1000000000
 PARALLEL_LIMIT = 64
 
 SECRETS_PATH = '/run/secrets'
+WINDOWS_LONGPATH_PREFIX = '\\\\?\\'
 
 COMPOSEFILE_V1 = ComposeVersion('1')
 COMPOSEFILE_V2_0 = ComposeVersion('2.0')

+ 14 - 6
compose/service.py

@@ -43,6 +43,7 @@ from .const import LABEL_SERVICE
 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
@@ -1048,12 +1049,7 @@ class Service(object):
         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'
@@ -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