aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/_pathlib.py73
-rw-r--r--mesonbuild/mesonmain.py4
-rwxr-xr-xrun_project_tests.py6
-rwxr-xr-xrun_tests.py6
-rwxr-xr-xrun_unittests.py6
5 files changed, 92 insertions, 3 deletions
diff --git a/mesonbuild/_pathlib.py b/mesonbuild/_pathlib.py
new file mode 100644
index 0000000..640b5ed
--- /dev/null
+++ b/mesonbuild/_pathlib.py
@@ -0,0 +1,73 @@
+# Copyright 2021 The Meson development team
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+'''
+ This module soly exists to work around a pathlib.resolve bug on
+ certain Windows systems:
+
+ https://github.com/mesonbuild/meson/issues/7295
+ https://bugs.python.org/issue31842
+
+ It should **never** be used directly. Instead, it is automatically
+ used when `import pathlib` is used. This is achieved by messing with
+ `sys.modules['pathlib']` in mesonmain.
+
+ Additionally, the sole purpose of this module is to work around a
+ python bug. This only bugfixes to pathlib functions and classes are
+ allowed here. Finally, this file should be removed once all upstream
+ python bugs are fixed and it is OK to tell our users to "just upgrade
+ python".
+'''
+
+import pathlib
+import os
+import platform
+
+__all__ = [
+ 'PurePath',
+ 'PurePosixPath',
+ 'PureWindowsPath',
+ 'Path',
+]
+
+PurePath = pathlib.PurePath
+PurePosixPath = pathlib.PurePosixPath
+PureWindowsPath = pathlib.PureWindowsPath
+
+# Only patch on platforms where the bug occurs
+if platform.system().lower() in {'windows'}:
+ # Can not directly inherit from pathlib.Path because the __new__
+ # operator of pathlib.Path() returns a {Posix,Windows}Path object.
+ class Path(type(pathlib.Path())):
+ def resolve(self, strict: bool = False) -> 'Path':
+ '''
+ Work around a resolve bug on certain Windows systems:
+
+ https://github.com/mesonbuild/meson/issues/7295
+ https://bugs.python.org/issue31842
+ '''
+
+ try:
+ return super().resolve(strict=strict)
+ except OSError:
+ return Path(os.path.normpath(self))
+else:
+ Path = pathlib.Path
+ PosixPath = pathlib.PosixPath
+ WindowsPath = pathlib.WindowsPath
+
+ __all__ += [
+ 'PosixPath',
+ 'WindowsPath',
+ ]
diff --git a/mesonbuild/mesonmain.py b/mesonbuild/mesonmain.py
index 4dd47e4..a3fd27d 100644
--- a/mesonbuild/mesonmain.py
+++ b/mesonbuild/mesonmain.py
@@ -12,7 +12,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+# Work around some pathlib bugs...
+from . import _pathlib
import sys
+sys.modules['pathlib'] = _pathlib
+
import os.path
import importlib
import traceback
diff --git a/run_project_tests.py b/run_project_tests.py
index c9b7a8f..fcd856f 100755
--- a/run_project_tests.py
+++ b/run_project_tests.py
@@ -14,6 +14,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+# Work around some pathlib bugs...
+from mesonbuild import _pathlib
+import sys
+sys.modules['pathlib'] = _pathlib
+
from concurrent.futures import ProcessPoolExecutor, CancelledError
from enum import Enum
from io import StringIO
@@ -29,7 +34,6 @@ import shlex
import shutil
import signal
import subprocess
-import sys
import tempfile
import time
import typing as T
diff --git a/run_tests.py b/run_tests.py
index ae96bfa..90641ad 100755
--- a/run_tests.py
+++ b/run_tests.py
@@ -14,9 +14,13 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+# Work around some pathlib bugs...
+from mesonbuild import _pathlib
+import sys
+sys.modules['pathlib'] = _pathlib
+
import collections
import os
-import sys
import time
import shutil
import subprocess
diff --git a/run_unittests.py b/run_unittests.py
index f1ff2b4..9da20e6 100755
--- a/run_unittests.py
+++ b/run_unittests.py
@@ -13,6 +13,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+# Work around some pathlib bugs...
+from mesonbuild import _pathlib
+import sys
+sys.modules['pathlib'] = _pathlib
+
import time
import stat
import subprocess
@@ -22,7 +27,6 @@ import tempfile
import textwrap
import os
import shutil
-import sys
import unittest
import platform
import pickle