* [PATCH 0/2] MAINTAINERS: enforce file entries are consistent from meson
@ 2026-06-15 20:17 Pierrick Bouvier
2026-06-15 20:17 ` [PATCH 1/2] MAINTAINERS: fix entry for 'Python scripts' Pierrick Bouvier
2026-06-15 20:17 ` [PATCH 2/2] meson.build: check MAINTAINERS file is consistent with source tree Pierrick Bouvier
0 siblings, 2 replies; 13+ messages in thread
From: Pierrick Bouvier @ 2026-06-15 20:17 UTC (permalink / raw)
To: qemu-devel
Cc: Marc-André Lureau, John Snow, Cleber Rosa, philmd,
Daniel P. Berrangé, Paolo Bonzini, armbru,
Philippe Mathieu-Daudé, Pierrick Bouvier
Recently, Markus and Philippe made a great effort [1] to cleanup file entries in
MAINTAINERS that do not match any real file.
Now it's clean, we can ensure it will stay consistent in the future, by checking
those entries are consistent, directly at start of meson.build.
Forcing this through the build system makes sure it can't be skipped, whether on
local machine, or in CI. And since anyone needs to trigger it to add tests, doc
or code, it will be detected as soon as possible.
[1] https://lore.kernel.org/qemu-devel/20260521080511.999266-1-armbru@redhat.com/
In terms of performance, it takes 0.26s on a slow machine, where full configure
takes 35s, thus a slow down < 1%: worth it for the consistency we get IMHO.
The first patch cleans up the latest inconsistent entry left, which we solve
pragmatically. Commit mentions another alternative suggested.
The second patch is the check in itself. There was a conversation about
comparing files vs list of files returned by git ls-files. I would prefer to
stick comparing files instead of playing with regex, but I'm open to implement
it another way if that's really important.
The usage is quite simple if you want to play with it manually:
./scripts/check-maintainers-file.py MAINTAINERS
Pierrick Bouvier (2):
MAINTAINERS: fix entry for 'Python scripts'
meson.build: check MAINTAINERS file is consistent with source tree
MAINTAINERS | 4 ++-
meson.build | 5 +++
scripts/check-maintainers-file.py | 53 +++++++++++++++++++++++++++++++
3 files changed, 61 insertions(+), 1 deletion(-)
create mode 100755 scripts/check-maintainers-file.py
--
2.43.0
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/2] MAINTAINERS: fix entry for 'Python scripts'
2026-06-15 20:17 [PATCH 0/2] MAINTAINERS: enforce file entries are consistent from meson Pierrick Bouvier
@ 2026-06-15 20:17 ` Pierrick Bouvier
2026-06-17 5:48 ` Markus Armbruster
2026-06-15 20:17 ` [PATCH 2/2] meson.build: check MAINTAINERS file is consistent with source tree Pierrick Bouvier
1 sibling, 1 reply; 13+ messages in thread
From: Pierrick Bouvier @ 2026-06-15 20:17 UTC (permalink / raw)
To: qemu-devel
Cc: Marc-André Lureau, John Snow, Cleber Rosa, philmd,
Daniel P. Berrangé, Paolo Bonzini, armbru,
Philippe Mathieu-Daudé, Pierrick Bouvier
Existing entry tests/*.py does not match any file at the moment, the
semantic is "any py file under tests".
Kernel MAINTAINERS file supports 'K: regexp' entries to match entries,
but we don't support it, and I'm not sure it's the right solution here.
Instead of adding "yet another generic solution" to this problem, just
add manual entries matching existing sublevels. The Python scripts
section is the only one requiring this, and we can always reconsider the
K: approach later if another use case emerge.
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
MAINTAINERS | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/MAINTAINERS b/MAINTAINERS
index 2b5b581e173..61af956ed82 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3472,7 +3472,9 @@ M: John Snow <jsnow@redhat.com>
M: Cleber Rosa <crosa@redhat.com>
S: Odd Fixes
F: scripts/*.py
-F: tests/*.py
+F: tests/*/*.py
+F: tests/*/*/*.py
+F: tests/*/*/*/*.py
Benchmark util
M: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
--
2.43.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 2/2] meson.build: check MAINTAINERS file is consistent with source tree
2026-06-15 20:17 [PATCH 0/2] MAINTAINERS: enforce file entries are consistent from meson Pierrick Bouvier
2026-06-15 20:17 ` [PATCH 1/2] MAINTAINERS: fix entry for 'Python scripts' Pierrick Bouvier
@ 2026-06-15 20:17 ` Pierrick Bouvier
2026-06-15 20:21 ` Pierrick Bouvier
` (2 more replies)
1 sibling, 3 replies; 13+ messages in thread
From: Pierrick Bouvier @ 2026-06-15 20:17 UTC (permalink / raw)
To: qemu-devel
Cc: Marc-André Lureau, John Snow, Cleber Rosa, philmd,
Daniel P. Berrangé, Paolo Bonzini, armbru,
Philippe Mathieu-Daudé, Pierrick Bouvier
We add a new script: scripts/check-maintainers-file.py, that will run at
configuration time (and not at build time), to not hurt build time.
This script runs in 0.2s on my dev VM, which has an old cpu.
We can expect things to be mostly in sync since adding or removing a
source or test file will trigger a configure step.
For the rest, like docs, tcg tests, or remaining files, GitLab CI will
build things from scratch and always run the configure step.
With this, it should be impossible by design to have an upstream
MAINTAINERS file with non existing file entries.
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
meson.build | 5 +++
scripts/check-maintainers-file.py | 53 +++++++++++++++++++++++++++++++
2 files changed, 58 insertions(+)
create mode 100755 scripts/check-maintainers-file.py
diff --git a/meson.build b/meson.build
index 19e123423b5..57e9c9de42b 100644
--- a/meson.build
+++ b/meson.build
@@ -17,6 +17,11 @@ add_test_setup('thorough',
meson.add_postconf_script(find_program('scripts/symlink-install-tree.py'))
+# check our MAINTAINERS file is consistent
+check_maintainers = find_program('scripts/check-maintainers-file.py')
+maintainers_file = files('MAINTAINERS')
+run_command([check_maintainers, maintainers_file], check: true)
+
####################
# Global variables #
####################
diff --git a/scripts/check-maintainers-file.py b/scripts/check-maintainers-file.py
new file mode 100755
index 00000000000..b001816a401
--- /dev/null
+++ b/scripts/check-maintainers-file.py
@@ -0,0 +1,53 @@
+#! /usr/bin/env python3
+
+# Check incorrect file entries in MAINTAINERS
+#
+# Author: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+import argparse
+import glob
+import sys
+
+
+def check_one_entry(line) -> bool:
+ return True
+
+
+def main() -> None:
+ parser = argparse.ArgumentParser(description="Check MAINTAINERS file")
+ parser.add_argument("maintainers", help="Path to MAINTAINERS file")
+ args = parser.parse_args()
+
+ found_file_entry = False
+ found_incorrect_entries = False
+ line_counter = 0
+
+ with open(args.maintainers) as file:
+ for entry in file:
+ line_counter += 1
+
+ if not entry.startswith("F:"):
+ continue
+ entry = entry[2:].strip()
+ found_file_entry = True
+
+ file_exists = len(glob.glob(entry, recursive=True)) > 0
+ if file_exists:
+ continue
+
+ found_incorrect_entries = True
+ print(
+ f"No matching files for {args.maintainers} +{line_counter}: {entry}",
+ file=sys.stderr,
+ )
+
+ if not found_file_entry:
+ raise Exception("no file entry found - is MAINTAINERS path correct?")
+ if found_incorrect_entries:
+ raise Exception(f"incorrect entries found in {args.maintainers}")
+
+
+if __name__ == "__main__":
+ main()
--
2.43.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] meson.build: check MAINTAINERS file is consistent with source tree
2026-06-15 20:17 ` [PATCH 2/2] meson.build: check MAINTAINERS file is consistent with source tree Pierrick Bouvier
@ 2026-06-15 20:21 ` Pierrick Bouvier
2026-06-16 0:35 ` Philippe Mathieu-Daudé
2026-06-16 7:53 ` Daniel P. Berrangé
2 siblings, 0 replies; 13+ messages in thread
From: Pierrick Bouvier @ 2026-06-15 20:21 UTC (permalink / raw)
To: qemu-devel
Cc: Marc-André Lureau, John Snow, Cleber Rosa, philmd,
Daniel P. Berrangé, Paolo Bonzini, armbru,
Philippe Mathieu-Daudé
On 6/15/2026 1:17 PM, Pierrick Bouvier wrote:
> We add a new script: scripts/check-maintainers-file.py, that will run at
> configuration time (and not at build time), to not hurt build time.
> This script runs in 0.2s on my dev VM, which has an old cpu.
>
> We can expect things to be mostly in sync since adding or removing a
> source or test file will trigger a configure step.
> For the rest, like docs, tcg tests, or remaining files, GitLab CI will
> build things from scratch and always run the configure step.
>
> With this, it should be impossible by design to have an upstream
> MAINTAINERS file with non existing file entries.
>
> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
> ---
> meson.build | 5 +++
> scripts/check-maintainers-file.py | 53 +++++++++++++++++++++++++++++++
> 2 files changed, 58 insertions(+)
> create mode 100755 scripts/check-maintainers-file.py
>
> diff --git a/meson.build b/meson.build
> index 19e123423b5..57e9c9de42b 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -17,6 +17,11 @@ add_test_setup('thorough',
>
> meson.add_postconf_script(find_program('scripts/symlink-install-tree.py'))
>
> +# check our MAINTAINERS file is consistent
> +check_maintainers = find_program('scripts/check-maintainers-file.py')
> +maintainers_file = files('MAINTAINERS')
> +run_command([check_maintainers, maintainers_file], check: true)
> +
> ####################
> # Global variables #
> ####################
> diff --git a/scripts/check-maintainers-file.py b/scripts/check-maintainers-file.py
> new file mode 100755
> index 00000000000..b001816a401
> --- /dev/null
> +++ b/scripts/check-maintainers-file.py
> @@ -0,0 +1,53 @@
> +#! /usr/bin/env python3
> +
> +# Check incorrect file entries in MAINTAINERS
> +#
> +# Author: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
> +#
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +
> +import argparse
> +import glob
> +import sys
> +
> +
> +def check_one_entry(line) -> bool:
> + return True
> +
This function is dead code, I'll remove it.
> +
> +def main() -> None:
> + parser = argparse.ArgumentParser(description="Check MAINTAINERS file")
> + parser.add_argument("maintainers", help="Path to MAINTAINERS file")
> + args = parser.parse_args()
> +
> + found_file_entry = False
> + found_incorrect_entries = False
> + line_counter = 0
> +
> + with open(args.maintainers) as file:
> + for entry in file:
> + line_counter += 1
> +
> + if not entry.startswith("F:"):
> + continue
> + entry = entry[2:].strip()
> + found_file_entry = True
> +
> + file_exists = len(glob.glob(entry, recursive=True)) > 0
> + if file_exists:
> + continue
> +
> + found_incorrect_entries = True
> + print(
> + f"No matching files for {args.maintainers} +{line_counter}: {entry}",
> + file=sys.stderr,
> + )
> +
> + if not found_file_entry:
> + raise Exception("no file entry found - is MAINTAINERS path correct?")
> + if found_incorrect_entries:
> + raise Exception(f"incorrect entries found in {args.maintainers}")
> +
> +
> +if __name__ == "__main__":
> + main()
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] meson.build: check MAINTAINERS file is consistent with source tree
2026-06-15 20:17 ` [PATCH 2/2] meson.build: check MAINTAINERS file is consistent with source tree Pierrick Bouvier
2026-06-15 20:21 ` Pierrick Bouvier
@ 2026-06-16 0:35 ` Philippe Mathieu-Daudé
2026-06-16 2:51 ` Pierrick Bouvier
2026-06-16 7:53 ` Daniel P. Berrangé
2 siblings, 1 reply; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-06-16 0:35 UTC (permalink / raw)
To: Pierrick Bouvier, qemu-devel
Cc: Marc-André Lureau, John Snow, Cleber Rosa, philmd,
Daniel P. Berrangé, Paolo Bonzini, armbru
On 15/6/26 22:17, Pierrick Bouvier wrote:
> We add a new script: scripts/check-maintainers-file.py, that will run at
> configuration time (and not at build time), to not hurt build time.
> This script runs in 0.2s on my dev VM, which has an old cpu.
>
> We can expect things to be mostly in sync since adding or removing a
> source or test file will trigger a configure step.
You mention adding/removing but this script only checks for removals,
no additions; did I miss something?
> For the rest, like docs, tcg tests, or remaining files, GitLab CI will
> build things from scratch and always run the configure step.
>
> With this, it should be impossible by design to have an upstream
> MAINTAINERS file with non existing file entries.
>
> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
> ---
> meson.build | 5 +++
> scripts/check-maintainers-file.py | 53 +++++++++++++++++++++++++++++++
> 2 files changed, 58 insertions(+)
> create mode 100755 scripts/check-maintainers-file.py
>
> diff --git a/meson.build b/meson.build
> index 19e123423b5..57e9c9de42b 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -17,6 +17,11 @@ add_test_setup('thorough',
>
> meson.add_postconf_script(find_program('scripts/symlink-install-tree.py'))
>
> +# check our MAINTAINERS file is consistent
> +check_maintainers = find_program('scripts/check-maintainers-file.py')
> +maintainers_file = files('MAINTAINERS')
> +run_command([check_maintainers, maintainers_file], check: true)
> +
> ####################
> # Global variables #
> ####################
> diff --git a/scripts/check-maintainers-file.py b/scripts/check-maintainers-file.py
> new file mode 100755
> index 00000000000..b001816a401
> --- /dev/null
> +++ b/scripts/check-maintainers-file.py
> @@ -0,0 +1,53 @@
> +#! /usr/bin/env python3
> +
> +# Check incorrect file entries in MAINTAINERS
> +#
> +# Author: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
> +#
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +
> +import argparse
> +import glob
> +import sys
> +
> +
> +def check_one_entry(line) -> bool:
> + return True
> +
> +
> +def main() -> None:
> + parser = argparse.ArgumentParser(description="Check MAINTAINERS file")
> + parser.add_argument("maintainers", help="Path to MAINTAINERS file")
> + args = parser.parse_args()
> +
> + found_file_entry = False
> + found_incorrect_entries = False
> + line_counter = 0
> +
> + with open(args.maintainers) as file:
> + for entry in file:
> + line_counter += 1
> +
> + if not entry.startswith("F:"):
> + continue
> + entry = entry[2:].strip()
> + found_file_entry = True
> +
> + file_exists = len(glob.glob(entry, recursive=True)) > 0
> + if file_exists:
> + continue
> +
> + found_incorrect_entries = True
> + print(
> + f"No matching files for {args.maintainers} +{line_counter}: {entry}",
> + file=sys.stderr,
> + )
> +
> + if not found_file_entry:
> + raise Exception("no file entry found - is MAINTAINERS path correct?")
> + if found_incorrect_entries:
> + raise Exception(f"incorrect entries found in {args.maintainers}")
> +
> +
> +if __name__ == "__main__":
> + main()
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] meson.build: check MAINTAINERS file is consistent with source tree
2026-06-16 0:35 ` Philippe Mathieu-Daudé
@ 2026-06-16 2:51 ` Pierrick Bouvier
2026-06-16 3:15 ` Philippe Mathieu-Daudé
2026-06-17 6:42 ` Markus Armbruster
0 siblings, 2 replies; 13+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 2:51 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel
Cc: Marc-André Lureau, John Snow, Cleber Rosa,
Daniel P. Berrangé, Paolo Bonzini, armbru
On 6/15/2026 5:35 PM, Philippe Mathieu-Daudé wrote:
> On 15/6/26 22:17, Pierrick Bouvier wrote:
>> We add a new script: scripts/check-maintainers-file.py, that will run at
>> configuration time (and not at build time), to not hurt build time.
>> This script runs in 0.2s on my dev VM, which has an old cpu.
>>
>> We can expect things to be mostly in sync since adding or removing a
>> source or test file will trigger a configure step.
>
> You mention adding/removing but this script only checks for removals,
> no additions; did I miss something?
>
The initial scope was only to check the MAINTAINERS file itself is
correct. But while we're at it, we could extend the script to check that
all files in the tree belong to at least one maintainer entry. This
could have the benefit to force coverage for all new files. First we can
try to see what is not covered at the moment.
What do you think Markus?
>> For the rest, like docs, tcg tests, or remaining files, GitLab CI will
>> build things from scratch and always run the configure step.
>>
>> With this, it should be impossible by design to have an upstream
>> MAINTAINERS file with non existing file entries.
>>
>> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>> ---
>> meson.build | 5 +++
>> scripts/check-maintainers-file.py | 53 +++++++++++++++++++++++++++++++
>> 2 files changed, 58 insertions(+)
>> create mode 100755 scripts/check-maintainers-file.py
>>
>> diff --git a/meson.build b/meson.build
>> index 19e123423b5..57e9c9de42b 100644
>> --- a/meson.build
>> +++ b/meson.build
>> @@ -17,6 +17,11 @@ add_test_setup('thorough',
>> meson.add_postconf_script(find_program('scripts/symlink-install-
>> tree.py'))
>> +# check our MAINTAINERS file is consistent
>> +check_maintainers = find_program('scripts/check-maintainers-file.py')
>> +maintainers_file = files('MAINTAINERS')
>> +run_command([check_maintainers, maintainers_file], check: true)
>> +
>> ####################
>> # Global variables #
>> ####################
>> diff --git a/scripts/check-maintainers-file.py b/scripts/check-
>> maintainers-file.py
>> new file mode 100755
>> index 00000000000..b001816a401
>> --- /dev/null
>> +++ b/scripts/check-maintainers-file.py
>> @@ -0,0 +1,53 @@
>> +#! /usr/bin/env python3
>> +
>> +# Check incorrect file entries in MAINTAINERS
>> +#
>> +# Author: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>> +#
>> +# SPDX-License-Identifier: GPL-2.0-or-later
>> +
>> +import argparse
>> +import glob
>> +import sys
>> +
>> +
>> +def check_one_entry(line) -> bool:
>> + return True
>> +
>> +
>> +def main() -> None:
>> + parser = argparse.ArgumentParser(description="Check MAINTAINERS
>> file")
>> + parser.add_argument("maintainers", help="Path to MAINTAINERS file")
>> + args = parser.parse_args()
>> +
>> + found_file_entry = False
>> + found_incorrect_entries = False
>> + line_counter = 0
>> +
>> + with open(args.maintainers) as file:
>> + for entry in file:
>> + line_counter += 1
>> +
>> + if not entry.startswith("F:"):
>> + continue
>> + entry = entry[2:].strip()
>> + found_file_entry = True
>> +
>> + file_exists = len(glob.glob(entry, recursive=True)) > 0
>> + if file_exists:
>> + continue
>> +
>> + found_incorrect_entries = True
>> + print(
>> + f"No matching files for {args.maintainers}
>> +{line_counter}: {entry}",
>> + file=sys.stderr,
>> + )
>> +
>> + if not found_file_entry:
>> + raise Exception("no file entry found - is MAINTAINERS path
>> correct?")
>> + if found_incorrect_entries:
>> + raise Exception(f"incorrect entries found in
>> {args.maintainers}")
>> +
>> +
>> +if __name__ == "__main__":
>> + main()
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] meson.build: check MAINTAINERS file is consistent with source tree
2026-06-16 2:51 ` Pierrick Bouvier
@ 2026-06-16 3:15 ` Philippe Mathieu-Daudé
2026-06-17 6:42 ` Markus Armbruster
1 sibling, 0 replies; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-06-16 3:15 UTC (permalink / raw)
To: Pierrick Bouvier, qemu-devel
Cc: Marc-André Lureau, John Snow, Cleber Rosa,
Daniel P. Berrangé, Paolo Bonzini, armbru
On 16/6/26 04:51, Pierrick Bouvier wrote:
> On 6/15/2026 5:35 PM, Philippe Mathieu-Daudé wrote:
>> On 15/6/26 22:17, Pierrick Bouvier wrote:
>>> We add a new script: scripts/check-maintainers-file.py, that will run at
>>> configuration time (and not at build time), to not hurt build time.
>>> This script runs in 0.2s on my dev VM, which has an old cpu.
>>>
>>> We can expect things to be mostly in sync since adding or removing a
>>> source or test file will trigger a configure step.
>>
>> You mention adding/removing but this script only checks for removals,
>> no additions; did I miss something?
>>
> The initial scope was only to check the MAINTAINERS file itself is
> correct. But while we're at it, we could extend the script to check that
> all files in the tree belong to at least one maintainer entry. This
> could have the benefit to force coverage for all new files. First we can
> try to see what is not covered at the moment.
OK. So far removing "adding or" and check_one_entry():
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
>
> What do you think Markus?
>
>>> For the rest, like docs, tcg tests, or remaining files, GitLab CI will
>>> build things from scratch and always run the configure step.
>>>
>>> With this, it should be impossible by design to have an upstream
>>> MAINTAINERS file with non existing file entries.
>>>
>>> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>>> ---
>>> meson.build | 5 +++
>>> scripts/check-maintainers-file.py | 53 +++++++++++++++++++++++++++++++
>>> 2 files changed, 58 insertions(+)
>>> create mode 100755 scripts/check-maintainers-file.py
>>>
>>> diff --git a/meson.build b/meson.build
>>> index 19e123423b5..57e9c9de42b 100644
>>> --- a/meson.build
>>> +++ b/meson.build
>>> @@ -17,6 +17,11 @@ add_test_setup('thorough',
>>> meson.add_postconf_script(find_program('scripts/symlink-install-
>>> tree.py'))
>>> +# check our MAINTAINERS file is consistent
>>> +check_maintainers = find_program('scripts/check-maintainers-file.py')
>>> +maintainers_file = files('MAINTAINERS')
>>> +run_command([check_maintainers, maintainers_file], check: true)
>>> +
>>> ####################
>>> # Global variables #
>>> ####################
>>> diff --git a/scripts/check-maintainers-file.py b/scripts/check-
>>> maintainers-file.py
>>> new file mode 100755
>>> index 00000000000..b001816a401
>>> --- /dev/null
>>> +++ b/scripts/check-maintainers-file.py
>>> @@ -0,0 +1,53 @@
>>> +#! /usr/bin/env python3
>>> +
>>> +# Check incorrect file entries in MAINTAINERS
>>> +#
>>> +# Author: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>>> +#
>>> +# SPDX-License-Identifier: GPL-2.0-or-later
>>> +
>>> +import argparse
>>> +import glob
>>> +import sys
>>> +
>>> +
>>> +def check_one_entry(line) -> bool:
>>> + return True
>>> +
>>> +
>>> +def main() -> None:
>>> + parser = argparse.ArgumentParser(description="Check MAINTAINERS
>>> file")
>>> + parser.add_argument("maintainers", help="Path to MAINTAINERS file")
>>> + args = parser.parse_args()
>>> +
>>> + found_file_entry = False
>>> + found_incorrect_entries = False
>>> + line_counter = 0
>>> +
>>> + with open(args.maintainers) as file:
>>> + for entry in file:
>>> + line_counter += 1
>>> +
>>> + if not entry.startswith("F:"):
>>> + continue
>>> + entry = entry[2:].strip()
>>> + found_file_entry = True
>>> +
>>> + file_exists = len(glob.glob(entry, recursive=True)) > 0
>>> + if file_exists:
>>> + continue
>>> +
>>> + found_incorrect_entries = True
>>> + print(
>>> + f"No matching files for {args.maintainers}
>>> +{line_counter}: {entry}",
>>> + file=sys.stderr,
>>> + )
>>> +
>>> + if not found_file_entry:
>>> + raise Exception("no file entry found - is MAINTAINERS path
>>> correct?")
>>> + if found_incorrect_entries:
>>> + raise Exception(f"incorrect entries found in
>>> {args.maintainers}")
>>> +
>>> +
>>> +if __name__ == "__main__":
>>> + main()
>>
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] meson.build: check MAINTAINERS file is consistent with source tree
2026-06-15 20:17 ` [PATCH 2/2] meson.build: check MAINTAINERS file is consistent with source tree Pierrick Bouvier
2026-06-15 20:21 ` Pierrick Bouvier
2026-06-16 0:35 ` Philippe Mathieu-Daudé
@ 2026-06-16 7:53 ` Daniel P. Berrangé
2026-06-16 8:30 ` Peter Maydell
2 siblings, 1 reply; 13+ messages in thread
From: Daniel P. Berrangé @ 2026-06-16 7:53 UTC (permalink / raw)
To: Pierrick Bouvier
Cc: qemu-devel, Marc-André Lureau, John Snow, Cleber Rosa,
philmd, Paolo Bonzini, armbru, Philippe Mathieu-Daudé
On Mon, Jun 15, 2026 at 01:17:23PM -0700, Pierrick Bouvier wrote:
> We add a new script: scripts/check-maintainers-file.py, that will run at
> configuration time (and not at build time), to not hurt build time.
> This script runs in 0.2s on my dev VM, which has an old cpu.
>
> We can expect things to be mostly in sync since adding or removing a
> source or test file will trigger a configure step.
> For the rest, like docs, tcg tests, or remaining files, GitLab CI will
> build things from scratch and always run the configure step.
>
> With this, it should be impossible by design to have an upstream
> MAINTAINERS file with non existing file entries.
Accuracy of the MAINTAINERS file is an upstream-only concern, but
IIUC, this check is going to apply universally to every build of
QEMU which is undesirable. It is irrelevant to end users and not
appropriate to check in downsteam vendors forks.
In a "normal" modern project this kind of check would be done in
a CI job on the merge request, since that's the only place it is
relevant. In our case, the nearest fit is the checkpatch.pl file.
>
> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
> ---
> meson.build | 5 +++
> scripts/check-maintainers-file.py | 53 +++++++++++++++++++++++++++++++
> 2 files changed, 58 insertions(+)
> create mode 100755 scripts/check-maintainers-file.py
>
> diff --git a/meson.build b/meson.build
> index 19e123423b5..57e9c9de42b 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -17,6 +17,11 @@ add_test_setup('thorough',
>
> meson.add_postconf_script(find_program('scripts/symlink-install-tree.py'))
>
> +# check our MAINTAINERS file is consistent
> +check_maintainers = find_program('scripts/check-maintainers-file.py')
> +maintainers_file = files('MAINTAINERS')
> +run_command([check_maintainers, maintainers_file], check: true)
> +
> ####################
> # Global variables #
> ####################
> diff --git a/scripts/check-maintainers-file.py b/scripts/check-maintainers-file.py
> new file mode 100755
> index 00000000000..b001816a401
> --- /dev/null
> +++ b/scripts/check-maintainers-file.py
> @@ -0,0 +1,53 @@
> +#! /usr/bin/env python3
> +
> +# Check incorrect file entries in MAINTAINERS
> +#
> +# Author: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
> +#
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +
> +import argparse
> +import glob
> +import sys
> +
> +
> +def check_one_entry(line) -> bool:
> + return True
> +
> +
> +def main() -> None:
> + parser = argparse.ArgumentParser(description="Check MAINTAINERS file")
> + parser.add_argument("maintainers", help="Path to MAINTAINERS file")
> + args = parser.parse_args()
> +
> + found_file_entry = False
> + found_incorrect_entries = False
> + line_counter = 0
> +
> + with open(args.maintainers) as file:
> + for entry in file:
> + line_counter += 1
> +
> + if not entry.startswith("F:"):
> + continue
> + entry = entry[2:].strip()
> + found_file_entry = True
> +
> + file_exists = len(glob.glob(entry, recursive=True)) > 0
> + if file_exists:
> + continue
> +
> + found_incorrect_entries = True
> + print(
> + f"No matching files for {args.maintainers} +{line_counter}: {entry}",
> + file=sys.stderr,
> + )
> +
> + if not found_file_entry:
> + raise Exception("no file entry found - is MAINTAINERS path correct?")
> + if found_incorrect_entries:
> + raise Exception(f"incorrect entries found in {args.maintainers}")
> +
> +
> +if __name__ == "__main__":
> + main()
> --
> 2.43.0
>
With regards,
Daniel
--
|: https://berrange.com ~~ https://hachyderm.io/@berrange :|
|: https://libvirt.org ~~ https://entangle-photo.org :|
|: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :|
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] meson.build: check MAINTAINERS file is consistent with source tree
2026-06-16 7:53 ` Daniel P. Berrangé
@ 2026-06-16 8:30 ` Peter Maydell
2026-06-16 18:16 ` Pierrick Bouvier
0 siblings, 1 reply; 13+ messages in thread
From: Peter Maydell @ 2026-06-16 8:30 UTC (permalink / raw)
To: Daniel P. Berrangé
Cc: Pierrick Bouvier, qemu-devel, Marc-André Lureau, John Snow,
Cleber Rosa, philmd, Paolo Bonzini, armbru,
Philippe Mathieu-Daudé
On Tue, 16 Jun 2026 at 08:54, Daniel P. Berrangé <berrange@redhat.com> wrote:
>
> On Mon, Jun 15, 2026 at 01:17:23PM -0700, Pierrick Bouvier wrote:
> > We add a new script: scripts/check-maintainers-file.py, that will run at
> > configuration time (and not at build time), to not hurt build time.
> > This script runs in 0.2s on my dev VM, which has an old cpu.
> >
> > We can expect things to be mostly in sync since adding or removing a
> > source or test file will trigger a configure step.
> > For the rest, like docs, tcg tests, or remaining files, GitLab CI will
> > build things from scratch and always run the configure step.
> >
> > With this, it should be impossible by design to have an upstream
> > MAINTAINERS file with non existing file entries.
>
> Accuracy of the MAINTAINERS file is an upstream-only concern, but
> IIUC, this check is going to apply universally to every build of
> QEMU which is undesirable. It is irrelevant to end users and not
> appropriate to check in downsteam vendors forks.
>
> In a "normal" modern project this kind of check would be done in
> a CI job on the merge request, since that's the only place it is
> relevant. In our case, the nearest fit is the checkpatch.pl file.
You could put it in "make check", or (if you want to avoid the
downstream-forks issue) in some sub-bit of "make check"
that we don't check by default but do check in one of our CI jobs.
checkpatch isn't a great place for checks that you want to
stay consistent on because so much of its output is "this
is wrong/merely something to check, ignore".
-- PMM
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] meson.build: check MAINTAINERS file is consistent with source tree
2026-06-16 8:30 ` Peter Maydell
@ 2026-06-16 18:16 ` Pierrick Bouvier
2026-06-17 6:19 ` Markus Armbruster
0 siblings, 1 reply; 13+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:16 UTC (permalink / raw)
To: Peter Maydell, Daniel P. Berrangé
Cc: qemu-devel, Marc-André Lureau, John Snow, Cleber Rosa,
philmd, Paolo Bonzini, armbru, Philippe Mathieu-Daudé
On 6/16/2026 1:30 AM, Peter Maydell wrote:
> On Tue, 16 Jun 2026 at 08:54, Daniel P. Berrangé <berrange@redhat.com> wrote:
>>
>> On Mon, Jun 15, 2026 at 01:17:23PM -0700, Pierrick Bouvier wrote:
>>> We add a new script: scripts/check-maintainers-file.py, that will run at
>>> configuration time (and not at build time), to not hurt build time.
>>> This script runs in 0.2s on my dev VM, which has an old cpu.
>>>
>>> We can expect things to be mostly in sync since adding or removing a
>>> source or test file will trigger a configure step.
>>> For the rest, like docs, tcg tests, or remaining files, GitLab CI will
>>> build things from scratch and always run the configure step.
>>>
>>> With this, it should be impossible by design to have an upstream
>>> MAINTAINERS file with non existing file entries.
>>
>> Accuracy of the MAINTAINERS file is an upstream-only concern, but
>> IIUC, this check is going to apply universally to every build of
>> QEMU which is undesirable. It is irrelevant to end users and not
>> appropriate to check in downsteam vendors forks.
>>
I accept the argument about downstream forks even though they are free
to remove the check since they are... forks.
However, it's relevant to users I think. It's very easy to move a file,
and forget to update associated MAINTAINERS entry, and the sooner we
catch that, the better. Similar, when a new file is added and not
covered by an entry in MAINTAINERS, it's very easy to miss that.
>> In a "normal" modern project this kind of check would be done in
>> a CI job on the merge request, since that's the only place it is
>> relevant. In our case, the nearest fit is the checkpatch.pl file.
It depends how fast you want to catch the problem.
Adding yet another round trip latency to a project that already has a
multi day latency for upstream is not a good thing IMHO.
Also, it brings yet another burden on top maintainers that will have to
deal with this new failure, fix it themselves, or recreate their staging
set for the next batch and wait for yet another day. More time spent,
more noise, more iteration, just for a missing line update in
MAINTAINERS file.
All that is nonexistent if no one can build it if it's incorrect. That's
why we use -Werror by default for instance. And if someone sends a patch
breaking this, you can be sure they didn't even try to build their own
code/doc/test.
Does that open your view on this approach?
>
> You could put it in "make check", or (if you want to avoid the
> downstream-forks issue) in some sub-bit of "make check"
> that we don't check by default but do check in one of our CI jobs.
>
If argument above is still rejected, we can just add a CI job (calling
script directly). I'm not sure any kind of integration is needed. Also,
not sure where to fit that in any existing test suite to be honest.
> checkpatch isn't a great place for checks that you want to
> stay consistent on because so much of its output is "this
> is wrong/merely something to check, ignore".
>
I agree, checkpatch is not useful to enforce things. It would be
different if it was strictly enforced in CI, but that's not the case,
and won't be given the false positives it brings.
> -- PMM
Thanks for both of you for the feedback,
Pierrick
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] MAINTAINERS: fix entry for 'Python scripts'
2026-06-15 20:17 ` [PATCH 1/2] MAINTAINERS: fix entry for 'Python scripts' Pierrick Bouvier
@ 2026-06-17 5:48 ` Markus Armbruster
0 siblings, 0 replies; 13+ messages in thread
From: Markus Armbruster @ 2026-06-17 5:48 UTC (permalink / raw)
To: Pierrick Bouvier
Cc: qemu-devel, Marc-André Lureau, John Snow, Cleber Rosa,
philmd, Daniel P. Berrangé, Paolo Bonzini,
Philippe Mathieu-Daudé
Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> writes:
> Existing entry tests/*.py does not match any file at the moment, the
> semantic is "any py file under tests".
> Kernel MAINTAINERS file supports 'K: regexp' entries to match entries,
> but we don't support it, and I'm not sure it's the right solution here.
I think you mean N:. K: matches file contents. From the kernel's
MAINTAINERS file:
N: Files and directories *Regex* patterns.
N: [^a-z]tegra all files whose path contains tegra
(not including files like integrator)
One pattern per line. Multiple N: lines acceptable.
scripts/get_maintainer.pl has different behavior for files that
match F: pattern and matches of N: patterns. By default,
get_maintainer will not look at git log history when an F: pattern
match occurs. When an N: match occurs, git log history is used
to also notify the people that have git commit signatures.
K: *Content regex* (perl extended) pattern match in a patch or file.
For instance:
K: of_get_profile
matches patches or files that contain "of_get_profile"
K: \b(printk|pr_(info|err))\b
matches patches or files that contain one or more of the words
printk, pr_info or pr_err
One regex pattern per line. Multiple K: lines acceptable.
> Instead of adding "yet another generic solution" to this problem, just
> add manual entries matching existing sublevels. The Python scripts
> section is the only one requiring this, and we can always reconsider the
> K: approach later if another use case emerge.
"Only one" is not correct, because ...
>
> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
> ---
> MAINTAINERS | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 2b5b581e173..61af956ed82 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -3472,7 +3472,9 @@ M: John Snow <jsnow@redhat.com>
> M: Cleber Rosa <crosa@redhat.com>
> S: Odd Fixes
> F: scripts/*.py
> -F: tests/*.py
> +F: tests/*/*.py
> +F: tests/*/*/*.py
> +F: tests/*/*/*/*.py
... F: scripts/*.py matches only about a third of the .py under scripts.
I'm not demanding you port over N:, I'm just giving you information :)
The "one F: per directory level" solution is pleasantly stupid, but also
somewhat brittle.
>
> Benchmark util
> M: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] meson.build: check MAINTAINERS file is consistent with source tree
2026-06-16 18:16 ` Pierrick Bouvier
@ 2026-06-17 6:19 ` Markus Armbruster
0 siblings, 0 replies; 13+ messages in thread
From: Markus Armbruster @ 2026-06-17 6:19 UTC (permalink / raw)
To: Pierrick Bouvier
Cc: Peter Maydell, Daniel P. Berrangé, qemu-devel,
Marc-André Lureau, John Snow, Cleber Rosa, philmd,
Paolo Bonzini, Philippe Mathieu-Daudé
Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> writes:
> On 6/16/2026 1:30 AM, Peter Maydell wrote:
>> On Tue, 16 Jun 2026 at 08:54, Daniel P. Berrangé <berrange@redhat.com> wrote:
>>>
>>> On Mon, Jun 15, 2026 at 01:17:23PM -0700, Pierrick Bouvier wrote:
>>>> We add a new script: scripts/check-maintainers-file.py, that will run at
>>>> configuration time (and not at build time), to not hurt build time.
>>>> This script runs in 0.2s on my dev VM, which has an old cpu.
>>>>
>>>> We can expect things to be mostly in sync since adding or removing a
>>>> source or test file will trigger a configure step.
>>>> For the rest, like docs, tcg tests, or remaining files, GitLab CI will
>>>> build things from scratch and always run the configure step.
>>>>
>>>> With this, it should be impossible by design to have an upstream
>>>> MAINTAINERS file with non existing file entries.
>>>
>>> Accuracy of the MAINTAINERS file is an upstream-only concern, but
>>> IIUC, this check is going to apply universally to every build of
>>> QEMU which is undesirable. It is irrelevant to end users and not
>>> appropriate to check in downsteam vendors forks.
>>>
>
> I accept the argument about downstream forks even though they are free
> to remove the check since they are... forks.
> However, it's relevant to users I think. It's very easy to move a file,
> and forget to update associated MAINTAINERS entry, and the sooner we
> catch that, the better. Similar, when a new file is added and not
> covered by an entry in MAINTAINERS, it's very easy to miss that.
>
>>> In a "normal" modern project this kind of check would be done in
>>> a CI job on the merge request, since that's the only place it is
>>> relevant. In our case, the nearest fit is the checkpatch.pl file.
>
> It depends how fast you want to catch the problem.
> Adding yet another round trip latency to a project that already has a
> multi day latency for upstream is not a good thing IMHO.
Yes, and ...
> Also, it brings yet another burden on top maintainers that will have to
> deal with this new failure, fix it themselves, or recreate their staging
> set for the next batch and wait for yet another day. More time spent,
> more noise, more iteration, just for a missing line update in
> MAINTAINERS file.
... yes.
We might have conditioned ourselves to consider such loops normal.
They're not.
> All that is nonexistent if no one can build it if it's incorrect. That's
> why we use -Werror by default for instance. And if someone sends a patch
> breaking this, you can be sure they didn't even try to build their own
> code/doc/test.
I don't want make to fail during development just because I haven't
updated MAINTAINERS, yet. It's a distraction that could snap me out of
the flow. I'm developing with -Werror disabled for the same reason.
I do want make to fail before I send patches. I do another compile with
-Werror enabled then, but that's just my personal workflow.
Solutions I like well enough:
* Make it a compile-time warning that obeys --enable-werror. Could well
be more trouble than it's worth.
* Make it fail "make check".
Dislike:
* Make it a checkpatch.pl error. Stays out of my hair during
development, but then I have to remember to actually run
checkpatch.pl, or risk having CI bouncing things back to me, wasting
everybody's time. Meh
* Make it fail CI in some other way. Worse, because now I have to
remember running checkpatch.pl *and* that other way.
* Make it fail "make". Stay out of my hair!
> Does that open your view on this approach?
>
>>
>> You could put it in "make check", or (if you want to avoid the
>> downstream-forks issue) in some sub-bit of "make check"
>> that we don't check by default but do check in one of our CI jobs.
>>
>
> If argument above is still rejected, we can just add a CI job (calling
> script directly). I'm not sure any kind of integration is needed. Also,
> not sure where to fit that in any existing test suite to be honest.
>
>> checkpatch isn't a great place for checks that you want to
>> stay consistent on because so much of its output is "this
>> is wrong/merely something to check, ignore".
>>
>
> I agree, checkpatch is not useful to enforce things. It would be
> different if it was strictly enforced in CI, but that's not the case,
> and won't be given the false positives it brings.
CI should only reject things that are actually wrong, or at least
undesirable.
checkpatch.pl warns when you add, move, or delete files without updating
MAINTAINERS. It's only a warning, because MAINTAINERS may in fact not
need an update. Not good enough for CI rejects.
The purpose of warnings is to help maintainers and developers find
*potential* issues.
>
>> -- PMM
>
> Thanks for both of you for the feedback,
> Pierrick
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] meson.build: check MAINTAINERS file is consistent with source tree
2026-06-16 2:51 ` Pierrick Bouvier
2026-06-16 3:15 ` Philippe Mathieu-Daudé
@ 2026-06-17 6:42 ` Markus Armbruster
1 sibling, 0 replies; 13+ messages in thread
From: Markus Armbruster @ 2026-06-17 6:42 UTC (permalink / raw)
To: Pierrick Bouvier
Cc: Philippe Mathieu-Daudé, qemu-devel, Marc-André Lureau,
John Snow, Cleber Rosa, Daniel P. Berrangé, Paolo Bonzini
Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> writes:
> On 6/15/2026 5:35 PM, Philippe Mathieu-Daudé wrote:
>> On 15/6/26 22:17, Pierrick Bouvier wrote:
>>> We add a new script: scripts/check-maintainers-file.py, that will run at
>>> configuration time (and not at build time), to not hurt build time.
>>> This script runs in 0.2s on my dev VM, which has an old cpu.
>>>
>>> We can expect things to be mostly in sync since adding or removing a
>>> source or test file will trigger a configure step.
>>
>> You mention adding/removing but this script only checks for removals,
>> no additions; did I miss something?
>>
> The initial scope was only to check the MAINTAINERS file itself is
> correct. But while we're at it, we could extend the script to check that
> all files in the tree belong to at least one maintainer entry. This
> could have the benefit to force coverage for all new files. First we can
> try to see what is not covered at the moment.
>
> What do you think Markus?
I periodically post a report on MAINTAINERS coverage. The most recent
one is for v10.2.0-rc4:
Subject: Report on MAINTAINERS coverage
To: qemu-devel@nongnu.org
Date: Thu, 18 Dec 2025 13:45:24 +0100
Message-ID: <87h5toc61n.fsf@pond.sub.org>
https://lore.kernel.org/qemu-devel/87h5toc61n.fsf@pond.sub.org/
We had more than a thousand files not covered then. Getting to 100%
coverage would take a big push, and require help from many people.
Even with imperfect coverage, we could still require coverage for all
new files. I'm not sure this is practical without at least some
targeted MAINTAINERS improvements. Test-drive with a month or three
worth of existing commits to see how bad it would have been, to give us
an idea on how bad it would be? Or just take the plunge, and revert if
it turns out to be bad?
This series tries to solve a smaller problem. Even if we decide we want
the bigger problem solved, getting the smaller problem solved sooner is
probably better than getting it solved together with the bigger one
later.
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2026-06-17 6:43 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-15 20:17 [PATCH 0/2] MAINTAINERS: enforce file entries are consistent from meson Pierrick Bouvier
2026-06-15 20:17 ` [PATCH 1/2] MAINTAINERS: fix entry for 'Python scripts' Pierrick Bouvier
2026-06-17 5:48 ` Markus Armbruster
2026-06-15 20:17 ` [PATCH 2/2] meson.build: check MAINTAINERS file is consistent with source tree Pierrick Bouvier
2026-06-15 20:21 ` Pierrick Bouvier
2026-06-16 0:35 ` Philippe Mathieu-Daudé
2026-06-16 2:51 ` Pierrick Bouvier
2026-06-16 3:15 ` Philippe Mathieu-Daudé
2026-06-17 6:42 ` Markus Armbruster
2026-06-16 7:53 ` Daniel P. Berrangé
2026-06-16 8:30 ` Peter Maydell
2026-06-16 18:16 ` Pierrick Bouvier
2026-06-17 6:19 ` Markus Armbruster
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.