From b290a8254122f53d6477b7ba24366d81cfc5e99c Mon Sep 17 00:00:00 2001 From: Charles Brunet Date: Thu, 8 Feb 2024 10:15:37 -0500 Subject: [PATCH] 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. --- mesonbuild/modules/python.py | 2 +- test cases/python/5 modules kwarg/a.py | 0 test cases/python/5 modules kwarg/meson.build | 16 ++++++++++++++-- test cases/python/5 modules kwarg/test.json | 5 +++++ 4 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 test cases/python/5 modules kwarg/a.py create mode 100644 test cases/python/5 modules kwarg/test.json diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py index 7a2cd2837..59b5050c0 100644 --- a/mesonbuild/modules/python.py +++ b/mesonbuild/modules/python.py @@ -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).') diff --git a/test cases/python/5 modules kwarg/a.py b/test cases/python/5 modules kwarg/a.py new file mode 100644 index 000000000..e69de29bb diff --git a/test cases/python/5 modules kwarg/meson.build b/test cases/python/5 modules kwarg/meson.build index 41a9a4fae..6e745ba62 100644 --- a/test cases/python/5 modules kwarg/meson.build +++ b/test cases/python/5 modules kwarg/meson.build @@ -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') diff --git a/test cases/python/5 modules kwarg/test.json b/test cases/python/5 modules kwarg/test.json new file mode 100644 index 000000000..cf874f102 --- /dev/null +++ b/test cases/python/5 modules kwarg/test.json @@ -0,0 +1,5 @@ +{ + "installed": [ + { "type": "python_file", "file": "pure/a.py"} + ] +} \ No newline at end of file