Pierrick Bouvier <[email protected]> writes:
> Hi Markus,
>
> On 5/21/2026 1:04 AM, Markus Armbruster wrote:
>> Quite a few F: lines don't match any files. The quick & dirty check
>>
>> $ ls `sed -n 's/^F: *//p' MAINTAINERS ` >/dev/null
>>
>> finds about fifty.
>>
>> Philippe Mathieu-Daudé recently posted a few fixes:
>>
>> MAINTAINERS: Fix docker/dockerfiles/debian-hexagon-cross.docker path
>> MAINTAINERS: Cover debian-loongarch-cross.docker with LoongArch section
>> MAINTAINERS: Cover debian-xtensa-cross.docker with Xtensa section
>> MAINTAINERS: Cover debian-tricore-cross.docker with TriCore section
>> MAINTAINERS: Cover python.docker with Python library section
>> MAINTAINERS: Fix s390x storage key/attribute device paths
>> MAINTAINERS: Fix tcg/s390x/ path
>> MAINTAINERS: Correct scripts/coverity-model.c path
>> MAINTAINERS: Fix hexagon-linux-user.mak path
>>
>> These are in
>>
>> Subject: [PATCH 0/7] docker: Remove LegacyKeyValueFormat warnings
>> Date: Mon, 18 May 2026 12:22:15 +0200
>> Message-ID: <[email protected]>
>>
>> Subject: [PATCH v2 0/4] buildsys: Stop checking for ESA/390 host
>> Date: Tue, 19 May 2026 19:12:36 +0200
>> Message-ID: <[email protected]>
>>
>>
>> Subject: [PATCH] MAINTAINERS: Correct scripts/coverity-model.c path
>> Date: Tue, 19 May 2026 19:19:26 +0200
>> Message-ID: <[email protected]>
>>
>> Subject: [PATCH] MAINTAINERS: Fix hexagon-linux-user.mak path
>> Date: Wed, 20 May 2026 14:39:47 +0200
>> Message-ID: <[email protected]>
>>
>> This series takes care of the remainder, except for one discussed
>> below. It applies cleanly with and without Philippe's patches.
>>
>> The exception is the last line in
>>
>> Python scripts
>> M: John Snow <[email protected]>
>> M: Cleber Rosa <[email protected]>
>> S: Odd Fixes
>> F: scripts/*.py
>> F: tests/*.py
>>
>> Both F: are actually wrong here: they match only in the scripts/ and
>> tests/ not further down. Left for another day.
>>
>> Markus Armbruster (39):
>> MAINTAINERS: Improve another "Overall" section headline
>> MAINTAINERS: Delete trailing colons in section headlines
>> MAINTAINERS: Drop stale F: from "Guest CPU cores (TCG)"
>> MAINTAINERS: Drop stale F: in "RISC-V TCG CPUs"
>> MAINTAINERS: Drop stale F: in "SPARC TCG CPUs"
>> MAINTAINERS: Drop stale F: from "Overall KVM CPUs"
>> MAINTAINERS: Drop stale F: from "Overall CPUs other accelerators"
>> MAINTAINERS: Drop stale F: from "virtio"
>> MAINTAINERS: Fix F: in "Apple Silicon HVF CPUs"
>> MAINTAINERS: Drop bad F: in "X86 Xen CPUs"
>> MAINTAINERS: Fix F: in "WebAssembly"
>> MAINTAINERS: Fix F: in "Allwinner-a10"
>> MAINTAINERS: Fix F: in "Raspberry Pi"
>> MAINTAINERS: Drop bad F: from "Xilinx Zynq"
>> MAINTAINERS: Drop stale F: from "New World (mac99)"
>> MAINTAINERS: Drop stale F: from "sPAPR (pseries)"
>> MAINTAINERS: Fix F: typo in "sam460ex"
>> MAINTAINERS: Fix F: in "SiFive Machines"
>> MAINTAINERS: Fix F: typo in "ACPI/HEST/GHES/ARM processor CPER"
>> MAINTAINERS: Fix F: in "SSI"
>> MAINTAINERS: Fix F: in "vhost"
>> MAINTAINERS: Fix F: in "virtio-input"
>> MAINTAINERS: Fix bad / stale F: in "virtio-rng"
>> MAINTAINERS: Fix F: in "vhost-user-stubs"
>> MAINTAINERS: Fix F: in "virtio-snd" and "virtio-gpu"
>> MAINTAINERS: Fix F: typo in "pcf8574"
>> MAINTAINERS: Drop stale F: from "Block I/O path"
>> MAINTAINERS: Fix F: typo in "Dump"
>> MAINTAINERS: Drop stale F: from "Human Monitor (HMP)"
>> MAINTAINERS: Fix F: in "QDev"
>> MAINTAINERS: Fix F: in "QMP"
>> MAINTAINERS: Fix F: typo in "I3C"
>> MAINTAINERS: Drop stale F: from "EDK2 Firmware"
>> MAINTAINERS: Drop stale F: from "TCI TCG target"
>> MAINTAINERS: Drop stale F: from "Linux io_uring"
>> MAINTAINERS: Fix F: in "VFIO-USER"
>> MAINTAINERS: Fix F: in "Build and test automation"
>> MAINTAINERS: Drop stale F: from "Sphinx documentation configuration
>> ..."
>> MAINTAINERS: Fix F: in "Rust build system integration"
>>
>> MAINTAINERS | 73 ++++++++++++++++++-----------------------------------
>> 1 file changed, 24 insertions(+), 49 deletions(-)
>>
>
> thanks for posting this.
>
> In addition, see the patch attached to this email.
> It integrates checking this directly at configure time, so we never run
> into any missing entry again in the future.
>
> I share this here not for a review, but simply to avoid a duplicated
> effort, and make sure people know it will be sent after this series.
>
> I don't believe in adding this in checkpatch, because it's not enforced
> systematically unfortunately. Breaking the meson configuration is a good
> way to make sure it's enforced by design.
No objection.
> With your series applied, the left entries are:
Most of these are fixed in Philippe's patches mentioned above.
> No matching files for /usr2/pbouvier/.work/qemu/MAINTAINERS +258:
> configs/targets/hexagon-linux-user/default.mak
MAINTAINERS: Fix hexagon-linux-user.mak path
> No matching files for /usr2/pbouvier/.work/qemu/MAINTAINERS +259:
> docker/dockerfiles/debian-hexagon-cross.docker
MAINTAINERS: Fix docker/dockerfiles/debian-hexagon-cross.docker path
> No matching files for /usr2/pbouvier/.work/qemu/MAINTAINERS +2956:
> hw/s390x/storage-keys.h
> No matching files for /usr2/pbouvier/.work/qemu/MAINTAINERS +2965:
> hw/s390x/storage-attributes.h
MAINTAINERS: Fix s390x storage key/attribute device paths
> No matching files for /usr2/pbouvier/.work/qemu/MAINTAINERS +3241:
> scripts/coverity-model.c
MAINTAINERS: Correct scripts/coverity-model.c path
> No matching files for /usr2/pbouvier/.work/qemu/MAINTAINERS +3468:
> tests/*.py
This is the exception I mentioned above.
The intent is to match *.py below tests/. It actually matches only in
tests/, not in its subdirectories.
Here's a dumb fix:
F: tests/*.py
F: tests/*/*.py
F: tests/*/*/*.py
F: tests/*/*/*/*.py
for however many levels we have. Same for the scripts/ line next to it.
Blech.
The smart fix might be to port N: from the kernel.
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.
But I wonder: is this section useful at all?
> No matching files for /usr2/pbouvier/.work/qemu/MAINTAINERS +4149:
> tcg/s390/
MAINTAINERS: Fix tcg/s390x/ path
> Once your current series is pulled, I'll fix the remaining and send the
> attached patch. Or feel free to do it directly if you like the idea :)
>
> Regards,
> Pierrick
Two remarks inline.
> From 6c9b49ac7ec06c0159d2b4ba9c9d1081e02ef765 Mon Sep 17 00:00:00 2001
> From: Pierrick Bouvier <[email protected]>
> Date: Fri, 22 May 2026 12:23:17 -0700
> Subject: [PATCH] meson.build: check MAINTAINERS file is consistent with source
> tree
>
> 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 <[email protected]>
> ---
> 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 eeb096c1487..ddfb0b90ca6 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -18,6 +18,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, console:
> true)
My version of meson (1.8.5) chokes on console: true. According to
https://mesonbuild.com/Reference-manual_functions_run_command.html#run_command_console
it's new in 1.11.0.
I tested with it deleted.
> +
> ####################
> # 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 <[email protected]>
> +#
> +# 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
I'm afraid this matches files not in git, just like my quick & dirty
one-liner. Shouldn't we match against contents of HEAD, say output of
"git-ls-tree -r --name-only @"?
> + 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()