Bug 1293675 - Error out when GetShortPathName returns a long path name. r?gps
--- a/build/moz.configure/util.configure
+++ b/build/moz.configure/util.configure
@@ -113,16 +113,19 @@ def normalize_path():
path = normsep(path)
if quote(path) == path:
return path
size = 0
while True:
out = ctypes.create_unicode_buffer(size)
needed = GetShortPathNameW(path, out, size)
if size >= needed:
+ if ' ' in out.value:
+ die("GetShortPathName returned a long path name. "
+ "Are 8dot3 filenames disabled?")
return normsep(out.value)
size = needed
else:
def normalize_path(path):
return normsep(path)
return normalize_path
--- a/python/mozbuild/mozbuild/test/configure/common.py
+++ b/python/mozbuild/mozbuild/test/configure/common.py
@@ -20,16 +20,22 @@ from StringIO import StringIO
from which import WhichError
from buildconfig import (
topobjdir,
topsrcdir,
)
+def fake_short_path(path):
+ if sys.platform.startswith('win'):
+ return '/'.join(p.split(' ', 1)[0] + '~1' if ' 'in p else p
+ for p in mozpath.split(path))
+ return path
+
def ensure_exe_extension(path):
if sys.platform.startswith('win'):
return path + '.exe'
return path
class ConfigureTestVFS(object):
def __init__(self, paths):
@@ -161,17 +167,17 @@ class ConfigureTestSandbox(ConfigureSand
def create_unicode_buffer(self, *args, **kwargs):
class Buffer(object):
def __init__(self):
self.value = ''
return Buffer()
def GetShortPathNameW(self, path_in, path_out, length):
- path_out.value = path_in
+ path_out.value = fake_short_path(path_in)
return length
def which(self, command, path=None):
for parent in (path or self._search_path):
c = mozpath.abspath(mozpath.join(parent, command))
for candidate in (c, ensure_exe_extension(c)):
if self.imported_os.path.exists(candidate):
return candidate
--- a/python/mozbuild/mozbuild/test/configure/test_checks_configure.py
+++ b/python/mozbuild/mozbuild/test/configure/test_checks_configure.py
@@ -18,17 +18,21 @@ from mozunit import (
from mozbuild.configure import (
ConfigureError,
ConfigureSandbox,
)
from mozbuild.util import exec_
from mozpack import path as mozpath
from buildconfig import topsrcdir
-from common import ConfigureTestSandbox, ensure_exe_extension
+from common import (
+ ConfigureTestSandbox,
+ ensure_exe_extension,
+ fake_short_path,
+)
class TestChecksConfigure(unittest.TestCase):
def test_checking(self):
out = StringIO()
sandbox = ConfigureSandbox({}, stdout=out, stderr=out)
base_dir = os.path.join(topsrcdir, 'build', 'moz.configure')
sandbox.include_file(os.path.join(base_dir, 'checks.configure'))
@@ -174,18 +178,19 @@ class TestChecksConfigure(unittest.TestC
'check_prog("FOO", ("unknown", "known-b", "known c"))')
self.assertEqual(status, 0)
self.assertEqual(config, {'FOO': self.KNOWN_B})
self.assertEqual(out, 'checking for foo... %s\n' % self.KNOWN_B)
config, out, status = self.get_result(
'check_prog("FOO", ("unknown", "unknown-2", "known c"))')
self.assertEqual(status, 0)
- self.assertEqual(config, {'FOO': self.KNOWN_C})
- self.assertEqual(out, "checking for foo... '%s'\n" % self.KNOWN_C)
+ self.assertEqual(config, {'FOO': fake_short_path(self.KNOWN_C)})
+ self.assertEqual(out, "checking for foo... '%s'\n"
+ % fake_short_path(self.KNOWN_C))
config, out, status = self.get_result(
'check_prog("FOO", ("unknown",))')
self.assertEqual(status, 1)
self.assertEqual(config, {})
self.assertEqual(out, textwrap.dedent('''\
checking for foo... not found
DEBUG: foo: Trying unknown
@@ -254,18 +259,19 @@ class TestChecksConfigure(unittest.TestC
DEBUG: foo: Trying %s
ERROR: Cannot find foo
''') % path)
config, out, status = self.get_result(
'check_prog("FOO", ("unknown",))',
['FOO=known c'])
self.assertEqual(status, 0)
- self.assertEqual(config, {'FOO': self.KNOWN_C})
- self.assertEqual(out, "checking for foo... '%s'\n" % self.KNOWN_C)
+ self.assertEqual(config, {'FOO': fake_short_path(self.KNOWN_C)})
+ self.assertEqual(out, "checking for foo... '%s'\n"
+ % fake_short_path(self.KNOWN_C))
config, out, status = self.get_result(
'check_prog("FOO", ("unknown", "unknown-2", "unknown 3"), '
'allow_missing=True)', ['FOO=unknown'])
self.assertEqual(status, 1)
self.assertEqual(config, {})
self.assertEqual(out, textwrap.dedent('''\
checking for foo... not found