Fix KeyError in Python module

0e7fb07 introduced a subtile bug in the Python module.
If a python version is found, but is missing a required module,
it is added to the list of python installations, but the
`run_bytecompile` attribute for that version was not initialized.
Therefore, if any other python version added something to install, it
was raising a KeyError when trying to read the `run_bytecompile`
attribute for the python version with missing module.
This commit is contained in:
Charles Brunet 2024-02-08 10:15:37 -05:00 committed by Jussi Pakkanen
parent 43fe006190
commit b290a82541
4 changed files with 20 additions and 3 deletions

View File

@ -74,6 +74,7 @@ class PythonExternalProgram(BasicPythonExternalProgram):
if ret:
self.platlib = self._get_path(state, 'platlib')
self.purelib = self._get_path(state, 'purelib')
self.run_bytecompile.setdefault(self.info['version'], False)
return ret
def _get_path(self, state: T.Optional['ModuleState'], key: str) -> str:
@ -544,7 +545,6 @@ class PythonModule(ExtensionModule):
assert isinstance(python, PythonExternalProgram), 'for mypy'
python = copy.copy(python)
python.pure = kwargs['pure']
python.run_bytecompile.setdefault(python.info['version'], False)
return python
raise mesonlib.MesonBugException('Unreachable code was reached (PythonModule.find_installation).')

View File

View File

@ -1,7 +1,19 @@
project('python kwarg')
project('python kwarg',
default_options: [
'python.bytecompile=-1',
'python.purelibdir=/pure',
]
)
py = import('python')
prog_python = py.find_installation('python3', modules : ['os', 'sys', 're'])
prog_python = py.find_installation('python3', modules : ['os', 'sys', 're'], pure: true)
assert(prog_python.found() == true, 'python not found when should be')
# In meson 1.2 - 1.3.2, there was a bug when a python installation
# with a different version did not have a module, and we try to install
# something with another python version...
py.find_installation('python3.7', modules: ['notamodule'], required: false)
prog_python.install_sources('a.py')
prog_python = py.find_installation('python3', modules : ['thisbetternotexistmod'], required : false)
assert(prog_python.found() == false, 'python not found but reported as found')

View File

@ -0,0 +1,5 @@
{
"installed": [
{ "type": "python_file", "file": "pure/a.py"}
]
}