pathlib: Patch pathlib to work around some bugs (fixes #7295)
(cherry picked from 28175bbee2
by
Paolo Bonzini)
0.58
parent
0602fd8587
commit
5809e73d9c
5 changed files with 92 additions and 3 deletions
@ -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', |
||||||
|
] |
Loading…
Reference in new issue