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 | |
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
-rw-r--r-- | docs/yaml/functions/configure_file.yaml | 3 | ||||
-rw-r--r-- | docs/yaml/functions/custom_target.yaml | 3 | ||||
-rw-r--r-- | docs/yaml/functions/install_data.yaml | 3 | ||||
-rw-r--r-- | docs/yaml/functions/install_emptydir.yaml | 3 | ||||
-rw-r--r-- | docs/yaml/functions/install_headers.yaml | 3 | ||||
-rw-r--r-- | docs/yaml/functions/install_man.yaml | 3 | ||||
-rw-r--r-- | docs/yaml/functions/install_subdir.yaml | 3 | ||||
-rw-r--r-- | mesonbuild/interpreter/type_checking.py | 13 |
8 files changed, 32 insertions, 2 deletions
diff --git a/docs/yaml/functions/configure_file.yaml b/docs/yaml/functions/configure_file.yaml index 8f4d9e0..df37ff5 100644 --- a/docs/yaml/functions/configure_file.yaml +++ b/docs/yaml/functions/configure_file.yaml @@ -20,6 +20,9 @@ description: | this function will copy the file provided in `input:` to a file in the build directory with the name `output:` in the current directory. +warnings: + - the `install_mode` kwarg ignored integer values between 0.62 -- 1.1.0. + kwargs: capture: type: bool diff --git a/docs/yaml/functions/custom_target.yaml b/docs/yaml/functions/custom_target.yaml index 7d05282..caccd48 100644 --- a/docs/yaml/functions/custom_target.yaml +++ b/docs/yaml/functions/custom_target.yaml @@ -52,6 +52,9 @@ notes: is not portable, notably to Windows. Instead, consider using a `native: true` [[executable]], or a python script. +warnings: + - the `install_mode` kwarg ignored integer values between 0.60.0 -- 1.1.0. + optargs: name: type: str diff --git a/docs/yaml/functions/install_data.yaml b/docs/yaml/functions/install_data.yaml index 191c612..b083479 100644 --- a/docs/yaml/functions/install_data.yaml +++ b/docs/yaml/functions/install_data.yaml @@ -10,6 +10,9 @@ varargs: type: file | str description: Files to install. +warnings: + - the `install_mode` kwarg ignored integer values between 0.59.0 -- 1.1.0. + kwargs: install_dir: type: str diff --git a/docs/yaml/functions/install_emptydir.yaml b/docs/yaml/functions/install_emptydir.yaml index e598b5e..df84f60 100644 --- a/docs/yaml/functions/install_emptydir.yaml +++ b/docs/yaml/functions/install_emptydir.yaml @@ -6,6 +6,9 @@ description: | argument. If the directory exists and is not empty, the contents are left in place. +warnings: + - the `install_mode` kwarg ignored integer values before 1.1.0. + varargs: name: dirpath type: str diff --git a/docs/yaml/functions/install_headers.yaml b/docs/yaml/functions/install_headers.yaml index 65489d2..958ab15 100644 --- a/docs/yaml/functions/install_headers.yaml +++ b/docs/yaml/functions/install_headers.yaml @@ -41,6 +41,9 @@ varargs: type: file | str description: Header files to install. +warnings: + - the `install_mode` kwarg ignored integer values between 0.59.0 -- 1.1.0. + kwargs: install_dir: type: str diff --git a/docs/yaml/functions/install_man.yaml b/docs/yaml/functions/install_man.yaml index b695dc1..8d9ba60 100644 --- a/docs/yaml/functions/install_man.yaml +++ b/docs/yaml/functions/install_man.yaml @@ -15,6 +15,9 @@ varargs: type: file | str description: Man pages to install. +warnings: + - the `install_mode` kwarg ignored integer values between 0.59.0 -- 1.1.0. + kwargs: install_mode: type: list[str | int] diff --git a/docs/yaml/functions/install_subdir.yaml b/docs/yaml/functions/install_subdir.yaml index 90baed2..1907cec 100644 --- a/docs/yaml/functions/install_subdir.yaml +++ b/docs/yaml/functions/install_subdir.yaml @@ -56,6 +56,9 @@ example: | new_directory/ ``` +warnings: + - the `install_mode` kwarg ignored integer values between 0.59.0 -- 1.1.0. + posargs: subdir_name: type: str 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]: |