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