aboutsummaryrefslogtreecommitdiffstats
path: root/meson/mesonbuild/_pathlib.py
diff options
context:
space:
mode:
Diffstat (limited to 'meson/mesonbuild/_pathlib.py')
-rw-r--r--meson/mesonbuild/_pathlib.py73
1 files changed, 73 insertions, 0 deletions
diff --git a/meson/mesonbuild/_pathlib.py b/meson/mesonbuild/_pathlib.py
new file mode 100644
index 000000000..640b5ed21
--- /dev/null
+++ b/meson/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',
+ ]