diff options
author | Eli Schwartz <eschwartz@archlinux.org> | 2023-03-19 15:31:09 -0400 |
---|---|---|
committer | Eli Schwartz <eschwartz@archlinux.org> | 2023-05-24 19:05:06 -0400 |
commit | 2c806099c7d581b4181acd3ecffac42bed223bea (patch) | |
tree | 891e61c6c13751f750abd5d054f36c5fdaba2196 /mesonbuild | |
parent | 1ff996ea6753595d181e357a6b8821c1bd5c8724 (diff) | |
download | meson-2c806099c7d581b4181acd3ecffac42bed223bea.zip meson-2c806099c7d581b4181acd3ecffac42bed223bea.tar.gz meson-2c806099c7d581b4181acd3ecffac42bed223bea.tar.bz2 |
repair install_mode support for uid/gid effectively everywhere
We silently dropped all integer values to install_mode since the
original implementation of doing this in KwargInfo, in commit
596c8d4af50d0e5a25ee0ee1e177e46b6c7ad22e.
This happened because install_mode is supposed to convert False
(exactly) to None, and otherwise pass all arguments in place. But a
generator is homogeneous and attempting to do this correctly produced a
mypy error that FileMode arguments were allowed to be ints -- well of
course they are -- so that resulted in the convertor... treating ints
like False instead, to make mypy happy.
Fixes #11538
Diffstat (limited to 'mesonbuild')
-rw-r--r-- | mesonbuild/interpreter/type_checking.py | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/mesonbuild/interpreter/type_checking.py b/mesonbuild/interpreter/type_checking.py index beae001..2d2b916 100644 --- a/mesonbuild/interpreter/type_checking.py +++ b/mesonbuild/interpreter/type_checking.py @@ -97,8 +97,17 @@ def _install_mode_validator(mode: T.List[T.Union[str, bool, int]]) -> T.Optional def _install_mode_convertor(mode: T.Optional[T.List[T.Union[str, bool, int]]]) -> FileMode: """Convert the DSL form of the `install_mode` keyword argument to `FileMode`""" - # this has already been validated by the validator - return FileMode(*(m if isinstance(m, str) else None for m in mode)) + if not mode: + return FileMode() + + # This has already been validated by the validator. False denotes "use + # default". mypy is totally incapable of understanding it, because + # generators clobber types via homogeneous return. But also we *must* + # convert the first element different from the rest + m1 = mode[0] if isinstance(mode[0], str) else None + rest = (m if isinstance(m, (str, int)) else None for m in mode[1:]) + + return FileMode(m1, *rest) def _lower_strlist(input: T.List[str]) -> T.List[str]: |