* [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python
@ 2025-12-11 18:01 Alex Bennée
2025-12-11 18:01 ` [RFC PATCH 1/9] MAINTAINERS: fix missing names Alex Bennée
` (11 more replies)
0 siblings, 12 replies; 19+ messages in thread
From: Alex Bennée @ 2025-12-11 18:01 UTC (permalink / raw)
To: qemu-devel
Cc: Cleber Rosa, Thomas Huth, Alex Bennée,
Philippe Mathieu-Daudé, John Snow
*incomplete
I wanted to look at adding gitlab tags to MAINTAINERS and baulked
slightly at figuring out what I would need to change in the perl
script to cleanly handle it.
While we imported the perl script from the kernel I'm fairly sure we
don't use half the features it has and as us grey beards age out less
people will be willing to tweak it. Consider this a proof-of-concept
for discussion about if it is worth perusing this path.
It only supports the two main forms:
./scripts/get_maintainer.py -f path/to/file
./scripts/get_maintainer.py path/to/patch1 path/to/patch2 ...
But who needs more?
Future improvements could include some more detailed analysis in
conjugation with the repo to analysis:
- missing areas of coverage
- maintainer stats
Who knows maybe the kernel guys will want to import our script one day
;-)
Alex.
Alex Bennée (9):
MAINTAINERS: fix missing names
MAINTAINERS: fix libvirt entry
MAINTAINERS: regularise the status fields
scripts/get_maintainer.py: minimal argument parsing
scripts/get_maintainer.py: resolve the source path
scripts/get_maintainer.py: initial parsing of MAINTAINERS
scripts/get_maintainer.py: add support for -f
scripts/get_maintainer.py: add support reading patch files
gitlab: add a check-maintainers task
MAINTAINERS | 10 +-
.gitlab-ci.d/static_checks.yml | 9 +
scripts/get_maintainer.py | 356 +++++++++++++++++++++++++++++++++
3 files changed, 370 insertions(+), 5 deletions(-)
create mode 100755 scripts/get_maintainer.py
--
2.47.3
^ permalink raw reply [flat|nested] 19+ messages in thread
* [RFC PATCH 1/9] MAINTAINERS: fix missing names
2025-12-11 18:01 [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python Alex Bennée
@ 2025-12-11 18:01 ` Alex Bennée
2025-12-11 18:01 ` [RFC PATCH 2/9] MAINTAINERS: fix libvirt entry Alex Bennée
` (10 subsequent siblings)
11 siblings, 0 replies; 19+ messages in thread
From: Alex Bennée @ 2025-12-11 18:01 UTC (permalink / raw)
To: qemu-devel
Cc: Cleber Rosa, Thomas Huth, Alex Bennée,
Philippe Mathieu-Daudé, John Snow
The form is Name <email> so lets fix that up before we enforce it.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
MAINTAINERS | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/MAINTAINERS b/MAINTAINERS
index 63e9ba521bc..05b644cfc9b 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2519,7 +2519,7 @@ F: hw/virtio/vhost-user-snd*
F: include/hw/virtio/vhost-user-snd.h
vhost-user-scmi
-R: mzamazal@redhat.com
+R: Milan Zamazal <mzamazal@redhat.com>
S: Supported
F: hw/virtio/vhost-user-scmi*
F: include/hw/virtio/vhost-user-scmi.h
--
2.47.3
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [RFC PATCH 2/9] MAINTAINERS: fix libvirt entry
2025-12-11 18:01 [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python Alex Bennée
2025-12-11 18:01 ` [RFC PATCH 1/9] MAINTAINERS: fix missing names Alex Bennée
@ 2025-12-11 18:01 ` Alex Bennée
2025-12-12 6:45 ` Philippe Mathieu-Daudé
2025-12-11 18:01 ` [RFC PATCH 3/9] MAINTAINERS: regularise the status fields Alex Bennée
` (9 subsequent siblings)
11 siblings, 1 reply; 19+ messages in thread
From: Alex Bennée @ 2025-12-11 18:01 UTC (permalink / raw)
To: qemu-devel
Cc: Cleber Rosa, Thomas Huth, Alex Bennée,
Philippe Mathieu-Daudé, John Snow
We have a particular tag for lists so lets use it.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
MAINTAINERS | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/MAINTAINERS b/MAINTAINERS
index 05b644cfc9b..a3fdc4ca911 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -4466,7 +4466,7 @@ F: gitdm.config
F: contrib/gitdm/*
Incompatible changes
-R: devel@lists.libvirt.org
+L: devel@lists.libvirt.org
F: docs/about/deprecated.rst
Build System
--
2.47.3
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [RFC PATCH 3/9] MAINTAINERS: regularise the status fields
2025-12-11 18:01 [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python Alex Bennée
2025-12-11 18:01 ` [RFC PATCH 1/9] MAINTAINERS: fix missing names Alex Bennée
2025-12-11 18:01 ` [RFC PATCH 2/9] MAINTAINERS: fix libvirt entry Alex Bennée
@ 2025-12-11 18:01 ` Alex Bennée
2025-12-12 6:43 ` Philippe Mathieu-Daudé
2025-12-11 18:01 ` [RFC PATCH 4/9] scripts/get_maintainer.py: minimal argument parsing Alex Bennée
` (8 subsequent siblings)
11 siblings, 1 reply; 19+ messages in thread
From: Alex Bennée @ 2025-12-11 18:01 UTC (permalink / raw)
To: qemu-devel
Cc: Cleber Rosa, Thomas Huth, Alex Bennée,
Philippe Mathieu-Daudé, John Snow
Orphaned isn't a state, Orphan is. Likewise all the other "Odd Fixes"
are capitalised so fix the ones that are not.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
MAINTAINERS | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/MAINTAINERS b/MAINTAINERS
index a3fdc4ca911..4488364c14e 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2662,7 +2662,7 @@ F: hw/i2c/i2c_mux_pca954x.c
F: include/hw/i2c/i2c_mux_pca954x.h
pcf8574
-S: Orphaned
+S: Orphan
F: hw/gpio/pcf8574.c
F: include/gpio/pcf8574.h
@@ -2884,7 +2884,7 @@ S390 3270 device
M: Halil Pasic <pasic@linux.ibm.com>
M: Christian Borntraeger <borntraeger@linux.ibm.com>
R: Collin Walling <walling@linux.ibm.com>
-S: Odd fixes
+S: Odd Fixes
F: include/hw/s390x/3270-ccw.h
F: hw/char/terminal3270.c
F: hw/s390x/3270-ccw.c
@@ -3795,7 +3795,7 @@ F: tests/unit/test-uuid.c
Yank feature
M: Lukas Straub <lukasstraub2@web.de>
-S: Odd fixes
+S: Odd Fixes
F: util/yank.c
F: migration/yank_functions*
F: tests/unit/test-yank.c
--
2.47.3
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [RFC PATCH 4/9] scripts/get_maintainer.py: minimal argument parsing
2025-12-11 18:01 [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python Alex Bennée
` (2 preceding siblings ...)
2025-12-11 18:01 ` [RFC PATCH 3/9] MAINTAINERS: regularise the status fields Alex Bennée
@ 2025-12-11 18:01 ` Alex Bennée
2025-12-11 18:01 ` [RFC PATCH 5/9] scripts/get_maintainer.py: resolve the source path Alex Bennée
` (7 subsequent siblings)
11 siblings, 0 replies; 19+ messages in thread
From: Alex Bennée @ 2025-12-11 18:01 UTC (permalink / raw)
To: qemu-devel
Cc: Cleber Rosa, Thomas Huth, Alex Bennée,
Philippe Mathieu-Daudé, John Snow
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
scripts/get_maintainer.py | 44 +++++++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
create mode 100755 scripts/get_maintainer.py
diff --git a/scripts/get_maintainer.py b/scripts/get_maintainer.py
new file mode 100755
index 00000000000..2b8fc7ae9ee
--- /dev/null
+++ b/scripts/get_maintainer.py
@@ -0,0 +1,44 @@
+#!/usr/bin/env python
+#
+# get_maintainer.py: Print selected MAINTAINERS information
+#
+# usage: scripts/get_maintainer.py [OPTIONS] <patch>
+# scripts/get_maintainer.py [OPTIONS] -f <file>
+#
+# (c) 2025, Alex Bennée <alex.bennee@linaro.org>
+# based on get_maintainers.pl
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+from argparse import ArgumentParser, ArgumentTypeError
+from os import path
+from pathlib import Path
+
+
+def valid_file_path(arg):
+ """
+ Checks if arg exists and is a regular file or raises ArgumentTypeError.
+ """
+ if not path.exists(arg):
+ raise ArgumentTypeError(f"File '{arg}' does not exist.")
+ if not path.isfile(arg):
+ raise ArgumentTypeError(f"Path '{arg}' is not a regular file.")
+ return Path(path.abspath(arg))
+
+
+def main():
+ parser = ArgumentParser(description='Extract maintainer information. ')
+
+ # We can either specify patches or an individual file
+ group = parser.add_mutually_exclusive_group()
+ group.add_argument('patch', nargs='*', type=valid_file_path,
+ help='path to patch file')
+ group.add_argument('-f', '--file', type=valid_file_path,
+ help='path to source file')
+
+ args = parser.parse_args()
+
+
+
+if __name__ == '__main__':
+ main()
--
2.47.3
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [RFC PATCH 5/9] scripts/get_maintainer.py: resolve the source path
2025-12-11 18:01 [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python Alex Bennée
` (3 preceding siblings ...)
2025-12-11 18:01 ` [RFC PATCH 4/9] scripts/get_maintainer.py: minimal argument parsing Alex Bennée
@ 2025-12-11 18:01 ` Alex Bennée
2025-12-11 18:01 ` [RFC PATCH 6/9] scripts/get_maintainer.py: initial parsing of MAINTAINERS Alex Bennée
` (6 subsequent siblings)
11 siblings, 0 replies; 19+ messages in thread
From: Alex Bennée @ 2025-12-11 18:01 UTC (permalink / raw)
To: qemu-devel
Cc: Cleber Rosa, Thomas Huth, Alex Bennée,
Philippe Mathieu-Daudé, John Snow
We will need this to automagically find MAINTAINERS. Use the same
logic as the perl script by looking for expected files and
directories.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
scripts/get_maintainer.py | 77 +++++++++++++++++++++++++++++++++++++++
1 file changed, 77 insertions(+)
diff --git a/scripts/get_maintainer.py b/scripts/get_maintainer.py
index 2b8fc7ae9ee..c713f290cc7 100755
--- a/scripts/get_maintainer.py
+++ b/scripts/get_maintainer.py
@@ -15,6 +15,59 @@
from pathlib import Path
+#
+# Helper functions for dealing with the source path
+#
+
+def is_qemu_src_root(directory):
+ """
+ Checks if the given path appears to be the root of a QEMU source tree,
+ based on the presence of key files and directories.
+ """
+ if not path.isdir(directory):
+ return False
+
+ required_files = ['COPYING', 'MAINTAINERS', 'Makefile', 'VERSION']
+ required_dirs = ['docs', 'linux-user', 'system']
+
+ for f in required_files:
+ if not path.isfile(path.join(directory, f)):
+ return False
+ for d in required_dirs:
+ if not path.isdir(path.join(directory, d)):
+ return False
+ return True
+
+
+def find_src_root():
+ """
+ Walks up the directory tree from the script's location
+ to find the QEMU source root.
+ Returns the absolute path of the root directory if found, or None.
+ """
+ script_dir = path.dirname(path.abspath(__file__))
+ current_dir = script_dir
+
+ while True:
+ if is_qemu_src_root(current_dir):
+ return current_dir
+
+ # Move up to the parent directory
+ parent_dir = path.dirname(current_dir)
+
+ # If we reached the filesystem root and haven't found it, stop
+ if parent_dir == current_dir:
+ break
+
+ current_dir = parent_dir
+
+ return None
+
+#
+# Argument validation
+#
+
+
def valid_file_path(arg):
"""
Checks if arg exists and is a regular file or raises ArgumentTypeError.
@@ -26,7 +79,21 @@ def valid_file_path(arg):
return Path(path.abspath(arg))
+def valid_src_root(arg):
+ """
+ Checks if arg is a valid QEMU source root or raise ArgumentTypeError.
+ """
+ abs_path = path.abspath(arg)
+ if not is_qemu_src_root(abs_path):
+ raise ArgumentTypeError(f"Path '{arg}' is not a valid QEMU source tree")
+ return abs_path
+
+
def main():
+ """
+ Main entry point for the script.
+ """
+
parser = ArgumentParser(description='Extract maintainer information. ')
# We can either specify patches or an individual file
@@ -36,6 +103,16 @@ def main():
group.add_argument('-f', '--file', type=valid_file_path,
help='path to source file')
+ # We need to know or be told where the root of the source tree is
+ src = find_src_root()
+
+ if src is None:
+ parser.add_argument('--src', type=valid_src_root, required=True,
+ help='Root of QEMU source tree')
+ else:
+ parser.add_argument('--src', type=valid_src_root, default=src,
+ help=f'Root of QEMU source tree (default: {src})')
+
args = parser.parse_args()
--
2.47.3
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [RFC PATCH 6/9] scripts/get_maintainer.py: initial parsing of MAINTAINERS
2025-12-11 18:01 [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python Alex Bennée
` (4 preceding siblings ...)
2025-12-11 18:01 ` [RFC PATCH 5/9] scripts/get_maintainer.py: resolve the source path Alex Bennée
@ 2025-12-11 18:01 ` Alex Bennée
2025-12-11 18:01 ` [RFC PATCH 7/9] scripts/get_maintainer.py: add support for -f Alex Bennée
` (5 subsequent siblings)
11 siblings, 0 replies; 19+ messages in thread
From: Alex Bennée @ 2025-12-11 18:01 UTC (permalink / raw)
To: qemu-devel
Cc: Cleber Rosa, Thomas Huth, Alex Bennée,
Philippe Mathieu-Daudé, John Snow
Add the basic infrastructure to parse MAINTAINERS and generate a list
of MaintainerSection objects we can use later.
Add a --validate argument so we can use the script to ensure
MAINTAINERS is always parse-able in our CI.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
scripts/get_maintainer.py | 165 +++++++++++++++++++++++++++++++++++++-
1 file changed, 164 insertions(+), 1 deletion(-)
diff --git a/scripts/get_maintainer.py b/scripts/get_maintainer.py
index c713f290cc7..7b8ce2b65e3 100755
--- a/scripts/get_maintainer.py
+++ b/scripts/get_maintainer.py
@@ -10,9 +10,156 @@
#
# SPDX-License-Identifier: GPL-2.0-or-later
-from argparse import ArgumentParser, ArgumentTypeError
+from argparse import ArgumentParser, ArgumentTypeError, BooleanOptionalAction
from os import path
from pathlib import Path
+from enum import StrEnum, auto
+from re import compile as re_compile
+
+#
+# Subsystem MAINTAINER entries
+#
+# The MAINTAINERS file is an unstructured text file where the
+# important information is in lines that follow the form:
+#
+# X: some data
+#
+# where X is a documented tag and the data is variously an email,
+# path, regex or link. Other lines should be ignored except the
+# preceding non-blank or underlined line which represents the name of
+# the "subsystem" or general area of the project.
+#
+# A blank line denominates the end of a section.
+#
+
+tag_re = re_compile(r"^([A-Z]):")
+
+
+class UnhandledTag(Exception):
+ "Exception for unhandled tags"
+
+
+class BadStatus(Exception):
+ "Exception for unknown status"
+
+
+class Status(StrEnum):
+ "Maintenance status"
+
+ UNKNOWN = auto()
+ SUPPORTED = 'Supported'
+ MAINTAINED = 'Maintained'
+ ODD_FIXES = 'Odd Fixes'
+ ORPHAN = 'Orphan'
+ OBSOLETE = 'Obsolete'
+
+ @classmethod
+ def _missing_(cls, value):
+ # _missing_ is only invoked by the enum machinery if 'value' does not
+ # match any existing enum member's value.
+ # So, if we reach this point, 'value' is inherently invalid for this enum.
+ raise BadStatus(f"'{value}' is not a valid maintenance status.")
+
+
+person_re = re_compile(r"^(?P<name>[^<]+?)\s*<(?P<email>[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})>\s*(?:@(?P<handle>\w+))?$")
+
+
+class BadPerson(Exception):
+ "Exception for un-parsable person"
+
+
+class Person:
+ "Class representing a maintainer or reviewer and their details"
+
+ def __init__(self, info):
+ match = person_re.search(info)
+
+ if match is None:
+ raise BadPerson(f"Failed to parse {info}")
+
+ self.name = match.group('name')
+ self.email = match.group('email')
+
+
+class MaintainerSection:
+ "Class representing a section of MAINTAINERS"
+
+ def _expand(self, pattern):
+ if pattern.endswith("/"):
+ return f"{pattern}*"
+ return pattern
+
+ def __init__(self, section, entries):
+ self.section = section
+ self.status = Status.UNKNOWN
+ self.maintainers = []
+ self.reviewers = []
+ self.files = []
+ self.files_exclude = []
+ self.trees = []
+ self.lists = []
+ self.web = []
+ self.keywords = []
+
+ for e in entries:
+ (tag, data) = e.split(": ", 2)
+
+ if tag == "M":
+ person = Person(data)
+ self.maintainers.append(person)
+ elif tag == "R":
+ person = Person(data)
+ self.reviewers.append(person)
+ elif tag == "S":
+ self.status = Status(data)
+ elif tag == "L":
+ self.lists.append(data)
+ elif tag == 'F':
+ pat = self._expand(data)
+ self.files.append(pat)
+ elif tag == 'W':
+ self.web.append(data)
+ elif tag == 'K':
+ self.keywords.append(data)
+ elif tag == 'T':
+ self.trees.append(data)
+ elif tag == 'X':
+ pat = self._expand(data)
+ self.files_exclude.append(pat)
+ else:
+ raise UnhandledTag(f"'{tag}' is not understood.")
+
+
+
+def read_maintainers(src):
+ """
+ Read the MAINTAINERS file, return a list of MaintainerSection objects.
+ """
+
+ mfile = path.join(src, 'MAINTAINERS')
+ entries = []
+
+ section = None
+ fields = []
+
+ with open(mfile, 'r', encoding='utf-8') as f:
+ for line in f:
+ if not line.strip(): # Blank line found, potential end of a section
+ if section:
+ new_section = MaintainerSection(section, fields)
+ entries.append(new_section)
+ # reset for next section
+ section = None
+ fields = []
+ elif tag_re.match(line):
+ fields.append(line.strip())
+ else:
+ if line.startswith("-") or line.startswith("="):
+ continue
+
+ section = line.strip()
+
+ return entries
#
@@ -103,6 +250,12 @@ def main():
group.add_argument('-f', '--file', type=valid_file_path,
help='path to source file')
+ # Validate MAINTAINERS
+ parser.add_argument('--validate',
+ action=BooleanOptionalAction,
+ default=None,
+ help="Just validate MAINTAINERS file")
+
# We need to know or be told where the root of the source tree is
src = find_src_root()
@@ -115,6 +268,16 @@ def main():
args = parser.parse_args()
+ try:
+ # Now we start by reading the MAINTAINERS file
+ maint_sections = read_maintainers(args.src)
+ except Exception as e:
+ print(f"Error: {e}")
+ exit(-1)
+
+ if args.validate:
+ print(f"loaded {len(maint_sections)} from MAINTAINERS")
+ exit(0)
if __name__ == '__main__':
--
2.47.3
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [RFC PATCH 7/9] scripts/get_maintainer.py: add support for -f
2025-12-11 18:01 [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python Alex Bennée
` (5 preceding siblings ...)
2025-12-11 18:01 ` [RFC PATCH 6/9] scripts/get_maintainer.py: initial parsing of MAINTAINERS Alex Bennée
@ 2025-12-11 18:01 ` Alex Bennée
2025-12-11 18:01 ` [RFC PATCH 8/9] scripts/get_maintainer.py: add support reading patch files Alex Bennée
` (4 subsequent siblings)
11 siblings, 0 replies; 19+ messages in thread
From: Alex Bennée @ 2025-12-11 18:01 UTC (permalink / raw)
To: qemu-devel
Cc: Cleber Rosa, Thomas Huth, Alex Bennée,
Philippe Mathieu-Daudé, John Snow
Now we have our sections we can add support for checking each file
against the maintainer list and gathering the ones we want. Finally we
can print the list out.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
scripts/get_maintainer.py | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/scripts/get_maintainer.py b/scripts/get_maintainer.py
index 7b8ce2b65e3..bf45865438e 100755
--- a/scripts/get_maintainer.py
+++ b/scripts/get_maintainer.py
@@ -129,6 +129,32 @@ def __init__(self, section, entries):
else:
raise UnhandledTag(f"'{tag}' is not understood.")
+ def __str__(self) -> str:
+ entries = []
+
+ for m in self.maintainers:
+ entries.append(f"{m.name} <{m.email}> (maintainer: {self.section})")
+
+ for r in self.reviewers:
+ entries.append(f"{r.name} <{r.email}> (reviewer: {self.section})")
+
+ for l in self.lists:
+ entries.append(f"{l} (open list: {self.section})")
+
+ return "\n".join(entries)
+
+ def is_file_covered(self, filename):
+ "Is filename covered by this maintainer section"
+
+ for fx in self.files_exclude:
+ if filename.match(fx):
+ return False
+
+ for f in self.files:
+ if filename.match(f):
+ return True
+
+ return False
def read_maintainers(src):
@@ -279,6 +305,15 @@ def main():
print(f"loaded {len(maint_sections)} from MAINTAINERS")
exit(0)
+ relevent_maintainers = None
+
+ if args.file:
+ relevent_maintainers = [ms for ms in maint_sections if
+ ms.is_file_covered(args.file)]
+
+ for rm in relevent_maintainers:
+ print(rm)
+
if __name__ == '__main__':
main()
--
2.47.3
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [RFC PATCH 8/9] scripts/get_maintainer.py: add support reading patch files
2025-12-11 18:01 [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python Alex Bennée
` (6 preceding siblings ...)
2025-12-11 18:01 ` [RFC PATCH 7/9] scripts/get_maintainer.py: add support for -f Alex Bennée
@ 2025-12-11 18:01 ` Alex Bennée
2025-12-11 18:01 ` [RFC PATCH 9/9] gitlab: add a check-maintainers task Alex Bennée
` (3 subsequent siblings)
11 siblings, 0 replies; 19+ messages in thread
From: Alex Bennée @ 2025-12-11 18:01 UTC (permalink / raw)
To: qemu-devel
Cc: Cleber Rosa, Thomas Huth, Alex Bennée,
Philippe Mathieu-Daudé, John Snow
Not so different from individual files, we just need to parse the
patch looking for the files and add them to the list. As we can parse
multiple patches we also need to ensure the final list of sections is
unique so we don't repeat ourselves.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
scripts/get_maintainer.py | 47 ++++++++++++++++++++++++++++++++++-----
1 file changed, 42 insertions(+), 5 deletions(-)
diff --git a/scripts/get_maintainer.py b/scripts/get_maintainer.py
index bf45865438e..daeefecef64 100755
--- a/scripts/get_maintainer.py
+++ b/scripts/get_maintainer.py
@@ -15,6 +15,7 @@
from pathlib import Path
from enum import StrEnum, auto
from re import compile as re_compile
+from re import sub as re_sub
#
# Subsystem MAINTAINER entries
@@ -187,6 +188,29 @@ def read_maintainers(src):
return entries
+#
+# Helper functions for dealing with patch files
+#
+patchfile_re = re_compile(r"\+\+\+\s+(\S+)")
+
+#TODO: also return a list of keyword hits for K:?
+def extract_filenames_from_patch(patchfile):
+ """
+ Read a patchfile and return a list of files which are modified by
+ the patch.
+ """
+ file_list = []
+
+ with open(patchfile, 'r', encoding='utf-8') as f:
+ for line in f:
+ m = patchfile_re.match(line)
+ if m:
+ # strip leading [ab]/
+ stripped = re_sub(r'^[^/]*/', '', m.group(1))
+ as_path = Path(path.abspath(stripped))
+ file_list.append(as_path)
+
+ return file_list
#
# Helper functions for dealing with the source path
@@ -305,14 +329,27 @@ def main():
print(f"loaded {len(maint_sections)} from MAINTAINERS")
exit(0)
- relevent_maintainers = None
+ # Build array of Path objects representing the files
+ files = []
if args.file:
- relevent_maintainers = [ms for ms in maint_sections if
- ms.is_file_covered(args.file)]
+ files.append(args.file)
+
+ if args.patch:
+ for p in args.patch:
+ pfiles = extract_filenames_from_patch(p)
+ files.extend(pfiles)
+
+ # unique set of maintainer sections
+ maintained: set[MaintainerSection] = set()
+
+ for f in files:
+ fmaint = [ms for ms in maint_sections if ms.is_file_covered(f)]
+ for m in fmaint:
+ maintained.add(m)
- for rm in relevent_maintainers:
- print(rm)
+ for rm in maintained:
+ print(str(rm))
if __name__ == '__main__':
--
2.47.3
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [RFC PATCH 9/9] gitlab: add a check-maintainers task
2025-12-11 18:01 [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python Alex Bennée
` (7 preceding siblings ...)
2025-12-11 18:01 ` [RFC PATCH 8/9] scripts/get_maintainer.py: add support reading patch files Alex Bennée
@ 2025-12-11 18:01 ` Alex Bennée
2025-12-12 8:15 ` [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python Daniel P. Berrangé
` (2 subsequent siblings)
11 siblings, 0 replies; 19+ messages in thread
From: Alex Bennée @ 2025-12-11 18:01 UTC (permalink / raw)
To: qemu-devel
Cc: Cleber Rosa, Thomas Huth, Alex Bennée,
Philippe Mathieu-Daudé, John Snow
Now we have a more flexible get_maintainer script we can use it to
validate MAINTAINERS.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
.gitlab-ci.d/static_checks.yml | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/.gitlab-ci.d/static_checks.yml b/.gitlab-ci.d/static_checks.yml
index 61fe2fa39ab..c74698ad948 100644
--- a/.gitlab-ci.d/static_checks.yml
+++ b/.gitlab-ci.d/static_checks.yml
@@ -23,6 +23,15 @@ check-dco:
before_script:
- apk -U add git
+check-maintainers:
+ extends: .base_job_template
+ stage: build
+ image: python:3.10-alpine
+ needs: []
+ script: scripts/get_maintainer.py --validate
+ variables:
+ GIT_DEPTH: 1
+
check-python-minreqs:
extends: .base_job_template
stage: test
--
2.47.3
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 3/9] MAINTAINERS: regularise the status fields
2025-12-11 18:01 ` [RFC PATCH 3/9] MAINTAINERS: regularise the status fields Alex Bennée
@ 2025-12-12 6:43 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 19+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-12-12 6:43 UTC (permalink / raw)
To: Alex Bennée, qemu-devel; +Cc: Cleber Rosa, Thomas Huth, John Snow
On 11/12/25 19:01, Alex Bennée wrote:
> Orphaned isn't a state, Orphan is. Likewise all the other "Odd Fixes"
> are capitalised so fix the ones that are not.
>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
> MAINTAINERS | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 2/9] MAINTAINERS: fix libvirt entry
2025-12-11 18:01 ` [RFC PATCH 2/9] MAINTAINERS: fix libvirt entry Alex Bennée
@ 2025-12-12 6:45 ` Philippe Mathieu-Daudé
2025-12-12 11:00 ` Alex Bennée
0 siblings, 1 reply; 19+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-12-12 6:45 UTC (permalink / raw)
To: Alex Bennée, qemu-devel
Cc: Cleber Rosa, Thomas Huth, John Snow, devel@lists.libvirt.org,
Daniel P. Berrangé
On 11/12/25 19:01, Alex Bennée wrote:
> We have a particular tag for lists so lets use it.
>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
> MAINTAINERS | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 05b644cfc9b..a3fdc4ca911 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -4466,7 +4466,7 @@ F: gitdm.config
> F: contrib/gitdm/*
>
> Incompatible changes
> -R: devel@lists.libvirt.org
> +L: devel@lists.libvirt.org
Maybe keep both? See:
commit b02c9bc35a03c099600693d6909f4566078880b8
Author: Markus Armbruster <armbru@redhat.com>
Date: Mon Jul 16 09:32:26 2018 +0200
MAINTAINERS: New section "Incompatible changes", copy libvir-list
Libvirt developers would like to be copied on patches to qemu-doc
appendix "Deprecated features". Do them the favor.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20180716073226.21127-3-armbru@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
diff --git a/MAINTAINERS b/MAINTAINERS
index 20eef3cb61c..666e9368126 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2194,6 +2194,10 @@ M: Daniel P. Berrange <berrange@redhat.com>
S: Odd Fixes
F: docs/devel/build-system.txt
+Incompatible changes
+R: libvir-list@redhat.com
+F: qemu-deprecated.texi
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python
2025-12-11 18:01 [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python Alex Bennée
` (8 preceding siblings ...)
2025-12-11 18:01 ` [RFC PATCH 9/9] gitlab: add a check-maintainers task Alex Bennée
@ 2025-12-12 8:15 ` Daniel P. Berrangé
2025-12-12 11:00 ` Alex Bennée
2025-12-12 11:27 ` Peter Maydell
2025-12-12 14:38 ` Markus Armbruster
11 siblings, 1 reply; 19+ messages in thread
From: Daniel P. Berrangé @ 2025-12-12 8:15 UTC (permalink / raw)
To: Alex Bennée
Cc: qemu-devel, Cleber Rosa, Thomas Huth, Philippe Mathieu-Daudé,
John Snow
On Thu, Dec 11, 2025 at 06:01:23PM +0000, Alex Bennée wrote:
> *incomplete
>
> I wanted to look at adding gitlab tags to MAINTAINERS and baulked
> slightly at figuring out what I would need to change in the perl
> script to cleanly handle it.
>
> While we imported the perl script from the kernel I'm fairly sure we
> don't use half the features it has and as us grey beards age out less
> people will be willing to tweak it. Consider this a proof-of-concept
> for discussion about if it is worth perusing this path.
>
> It only supports the two main forms:
>
> ./scripts/get_maintainer.py -f path/to/file
> ./scripts/get_maintainer.py path/to/patch1 path/to/patch2 ...
>
> But who needs more?
the $QEMU/.gitpublish file contains
cccmd = scripts/get_maintainer.pl --noroles --norolestats --nogit --nogit-fallback 2>/dev/null
And the .b4-config file contains the same:
send-auto-cc-cmd = scripts/get_maintainer.pl --noroles --norolestats --nogit --nogit-fallback
Is trawling the git history to guess at maintainers useful
for regular usage, while undesirable for sending patches,
or should we just pick a behaviour use it unconditionally?
>
> Future improvements could include some more detailed analysis in
> conjugation with the repo to analysis:
>
> - missing areas of coverage
> - maintainer stats
>
> Who knows maybe the kernel guys will want to import our script one day
> ;-)
>
> Alex.
>
> Alex Bennée (9):
> MAINTAINERS: fix missing names
> MAINTAINERS: fix libvirt entry
> MAINTAINERS: regularise the status fields
> scripts/get_maintainer.py: minimal argument parsing
> scripts/get_maintainer.py: resolve the source path
> scripts/get_maintainer.py: initial parsing of MAINTAINERS
> scripts/get_maintainer.py: add support for -f
> scripts/get_maintainer.py: add support reading patch files
> gitlab: add a check-maintainers task
>
> MAINTAINERS | 10 +-
> .gitlab-ci.d/static_checks.yml | 9 +
> scripts/get_maintainer.py | 356 +++++++++++++++++++++++++++++++++
> 3 files changed, 370 insertions(+), 5 deletions(-)
> create mode 100755 scripts/get_maintainer.py
>
> --
> 2.47.3
>
>
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python
2025-12-12 8:15 ` [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python Daniel P. Berrangé
@ 2025-12-12 11:00 ` Alex Bennée
2025-12-12 11:25 ` Peter Maydell
0 siblings, 1 reply; 19+ messages in thread
From: Alex Bennée @ 2025-12-12 11:00 UTC (permalink / raw)
To: Daniel P. Berrangé
Cc: qemu-devel, Cleber Rosa, Thomas Huth, Philippe Mathieu-Daudé,
John Snow
Daniel P. Berrangé <berrange@redhat.com> writes:
> On Thu, Dec 11, 2025 at 06:01:23PM +0000, Alex Bennée wrote:
>> *incomplete
>>
>> I wanted to look at adding gitlab tags to MAINTAINERS and baulked
>> slightly at figuring out what I would need to change in the perl
>> script to cleanly handle it.
>>
>> While we imported the perl script from the kernel I'm fairly sure we
>> don't use half the features it has and as us grey beards age out less
>> people will be willing to tweak it. Consider this a proof-of-concept
>> for discussion about if it is worth perusing this path.
>>
>> It only supports the two main forms:
>>
>> ./scripts/get_maintainer.py -f path/to/file
>> ./scripts/get_maintainer.py path/to/patch1 path/to/patch2 ...
>>
>> But who needs more?
>
> the $QEMU/.gitpublish file contains
>
> cccmd = scripts/get_maintainer.pl --noroles --norolestats --nogit --nogit-fallback 2>/dev/null
>
> And the .b4-config file contains the same:
>
> send-auto-cc-cmd = scripts/get_maintainer.pl --noroles --norolestats --nogit --nogit-fallback
>
>
> Is trawling the git history to guess at maintainers useful
> for regular usage, while undesirable for sending patches,
> or should we just pick a behaviour use it unconditionally?
We can certainly add the ability to dig through git but to honest those
doing archaeology are probably better off reading the logs. The default
it just to match paths to MAINTAINERS which I think is what the main use
is. It's not called get_git_blame_info.py ;-)
>
>>
>> Future improvements could include some more detailed analysis in
>> conjugation with the repo to analysis:
>>
>> - missing areas of coverage
>> - maintainer stats
>>
>> Who knows maybe the kernel guys will want to import our script one day
>> ;-)
>>
>> Alex.
>>
>> Alex Bennée (9):
>> MAINTAINERS: fix missing names
>> MAINTAINERS: fix libvirt entry
>> MAINTAINERS: regularise the status fields
>> scripts/get_maintainer.py: minimal argument parsing
>> scripts/get_maintainer.py: resolve the source path
>> scripts/get_maintainer.py: initial parsing of MAINTAINERS
>> scripts/get_maintainer.py: add support for -f
>> scripts/get_maintainer.py: add support reading patch files
>> gitlab: add a check-maintainers task
>>
>> MAINTAINERS | 10 +-
>> .gitlab-ci.d/static_checks.yml | 9 +
>> scripts/get_maintainer.py | 356 +++++++++++++++++++++++++++++++++
>> 3 files changed, 370 insertions(+), 5 deletions(-)
>> create mode 100755 scripts/get_maintainer.py
>>
>> --
>> 2.47.3
>>
>>
>
> With regards,
> Daniel
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 2/9] MAINTAINERS: fix libvirt entry
2025-12-12 6:45 ` Philippe Mathieu-Daudé
@ 2025-12-12 11:00 ` Alex Bennée
2025-12-12 11:12 ` Ján Tomko
0 siblings, 1 reply; 19+ messages in thread
From: Alex Bennée @ 2025-12-12 11:00 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: qemu-devel, Cleber Rosa, Thomas Huth, John Snow,
devel@lists.libvirt.org, Daniel P. Berrangé
Philippe Mathieu-Daudé <philmd@linaro.org> writes:
> On 11/12/25 19:01, Alex Bennée wrote:
>> We have a particular tag for lists so lets use it.
>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>> ---
>> MAINTAINERS | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>> diff --git a/MAINTAINERS b/MAINTAINERS
>> index 05b644cfc9b..a3fdc4ca911 100644
>> --- a/MAINTAINERS
>> +++ b/MAINTAINERS
>> @@ -4466,7 +4466,7 @@ F: gitdm.config
>> F: contrib/gitdm/*
>> Incompatible changes
>> -R: devel@lists.libvirt.org
>> +L: devel@lists.libvirt.org
>
> Maybe keep both? See:
It will still cause them to be added to the CC, like all the other L: entries.
>
> commit b02c9bc35a03c099600693d6909f4566078880b8
> Author: Markus Armbruster <armbru@redhat.com>
> Date: Mon Jul 16 09:32:26 2018 +0200
>
> MAINTAINERS: New section "Incompatible changes", copy libvir-list
>
> Libvirt developers would like to be copied on patches to qemu-doc
> appendix "Deprecated features". Do them the favor.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> Message-Id: <20180716073226.21127-3-armbru@redhat.com>
> Reviewed-by: Thomas Huth <thuth@redhat.com>
> Reviewed-by: Cornelia Huck <cohuck@redhat.com>
> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 20eef3cb61c..666e9368126 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -2194,6 +2194,10 @@ M: Daniel P. Berrange <berrange@redhat.com>
> S: Odd Fixes
> F: docs/devel/build-system.txt
>
> +Incompatible changes
> +R: libvir-list@redhat.com
> +F: qemu-deprecated.texi
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 2/9] MAINTAINERS: fix libvirt entry
2025-12-12 11:00 ` Alex Bennée
@ 2025-12-12 11:12 ` Ján Tomko
0 siblings, 0 replies; 19+ messages in thread
From: Ján Tomko @ 2025-12-12 11:12 UTC (permalink / raw)
To: Alex Bennée
Cc: Philippe Mathieu-Daudé, qemu-devel, Cleber Rosa, Thomas Huth,
John Snow, devel@lists.libvirt.org
[-- Attachment #1: Type: text/plain, Size: 818 bytes --]
On a Friday in 2025, Alex Bennée wrote:
>Philippe Mathieu-Daudé <philmd@linaro.org> writes:
>
>> On 11/12/25 19:01, Alex Bennée wrote:
>>> We have a particular tag for lists so lets use it.
>>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>>> ---
>>> MAINTAINERS | 2 +-
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>> diff --git a/MAINTAINERS b/MAINTAINERS
>>> index 05b644cfc9b..a3fdc4ca911 100644
>>> --- a/MAINTAINERS
>>> +++ b/MAINTAINERS
>>> @@ -4466,7 +4466,7 @@ F: gitdm.config
>>> F: contrib/gitdm/*
>>> Incompatible changes
>>> -R: devel@lists.libvirt.org
>>> +L: devel@lists.libvirt.org
>>
>> Maybe keep both? See:
>
>It will still cause them to be added to the CC, like all the other L: entries.
>
Good.
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Jano
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python
2025-12-12 11:00 ` Alex Bennée
@ 2025-12-12 11:25 ` Peter Maydell
0 siblings, 0 replies; 19+ messages in thread
From: Peter Maydell @ 2025-12-12 11:25 UTC (permalink / raw)
To: Alex Bennée
Cc: Daniel P. Berrangé, qemu-devel, Cleber Rosa, Thomas Huth,
Philippe Mathieu-Daudé, John Snow
On Fri, 12 Dec 2025 at 11:00, Alex Bennée <alex.bennee@linaro.org> wrote:
> We can certainly add the ability to dig through git but to honest those
> doing archaeology are probably better off reading the logs. The default
> it just to match paths to MAINTAINERS which I think is what the main use
> is. It's not called get_git_blame_info.py ;-)
The default of the existing script is to start with
MAINTAINERS but to fall back to looking at git if
there's nothing in the MAINTAINERS file.
thanks
-- PMM
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python
2025-12-11 18:01 [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python Alex Bennée
` (9 preceding siblings ...)
2025-12-12 8:15 ` [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python Daniel P. Berrangé
@ 2025-12-12 11:27 ` Peter Maydell
2025-12-12 14:38 ` Markus Armbruster
11 siblings, 0 replies; 19+ messages in thread
From: Peter Maydell @ 2025-12-12 11:27 UTC (permalink / raw)
To: Alex Bennée
Cc: qemu-devel, Cleber Rosa, Thomas Huth, Philippe Mathieu-Daudé,
John Snow, Mauro Carvalho Chehab
On Thu, 11 Dec 2025 at 18:02, Alex Bennée <alex.bennee@linaro.org> wrote:
>
> *incomplete
>
> I wanted to look at adding gitlab tags to MAINTAINERS and baulked
> slightly at figuring out what I would need to change in the perl
> script to cleanly handle it.
>
> While we imported the perl script from the kernel I'm fairly sure we
> don't use half the features it has and as us grey beards age out less
> people will be willing to tweak it. Consider this a proof-of-concept
> for discussion about if it is worth perusing this path.
I think it would be interesting to know if the upstream
kernel folks have any plans with get_maintainers -- they
recently did a big conversion of kernel-doc from perl
to python, for instance. I've cc'd Mauro who might know
if anything has been proposed similarly for get_maintainers.
thanks
-- PMM
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python
2025-12-11 18:01 [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python Alex Bennée
` (10 preceding siblings ...)
2025-12-12 11:27 ` Peter Maydell
@ 2025-12-12 14:38 ` Markus Armbruster
11 siblings, 0 replies; 19+ messages in thread
From: Markus Armbruster @ 2025-12-12 14:38 UTC (permalink / raw)
To: Alex Bennée
Cc: qemu-devel, Cleber Rosa, Thomas Huth, Philippe Mathieu-Daudé,
John Snow
Alex Bennée <alex.bennee@linaro.org> writes:
> *incomplete
>
> I wanted to look at adding gitlab tags to MAINTAINERS and baulked
> slightly at figuring out what I would need to change in the perl
> script to cleanly handle it.
>
> While we imported the perl script from the kernel I'm fairly sure we
> don't use half the features it has and as us grey beards age out less
> people will be willing to tweak it. Consider this a proof-of-concept
> for discussion about if it is worth perusing this path.
>
> It only supports the two main forms:
>
> ./scripts/get_maintainer.py -f path/to/file
> ./scripts/get_maintainer.py path/to/patch1 path/to/patch2 ...
>
> But who needs more?
I've used options --git --nogit-fallback --git-since and --git-blame.
> Future improvements could include some more detailed analysis in
> conjugation with the repo to analysis:
>
> - missing areas of coverage
I've used
$ for i in `git-ls-files`; do [ "`scripts/get_maintainer.pl -f --no-git-fallback $i | grep -v '^qemu-devel@nongnu\.org'`" ] || echo $i; done >unmaintained-files
Last post:
From: Markus Armbruster <armbru@redhat.com>
Subject: MAINTAINERS still leaves more files uncovered than I'd like
To: qemu-devel@nongnu.org
Date: Fri, 29 Sep 2023 13:43:30 +0200
Message-ID: <87lecp6w7x.fsf@pond.sub.org>
https://lore.kernel.org/qemu-devel/87lecp6w7x.fsf@pond.sub.org/
I think I'll do it again soonish.
> - maintainer stats
>
> Who knows maybe the kernel guys will want to import our script one day
> ;-)
>
> Alex.
^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2025-12-12 14:38 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-11 18:01 [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python Alex Bennée
2025-12-11 18:01 ` [RFC PATCH 1/9] MAINTAINERS: fix missing names Alex Bennée
2025-12-11 18:01 ` [RFC PATCH 2/9] MAINTAINERS: fix libvirt entry Alex Bennée
2025-12-12 6:45 ` Philippe Mathieu-Daudé
2025-12-12 11:00 ` Alex Bennée
2025-12-12 11:12 ` Ján Tomko
2025-12-11 18:01 ` [RFC PATCH 3/9] MAINTAINERS: regularise the status fields Alex Bennée
2025-12-12 6:43 ` Philippe Mathieu-Daudé
2025-12-11 18:01 ` [RFC PATCH 4/9] scripts/get_maintainer.py: minimal argument parsing Alex Bennée
2025-12-11 18:01 ` [RFC PATCH 5/9] scripts/get_maintainer.py: resolve the source path Alex Bennée
2025-12-11 18:01 ` [RFC PATCH 6/9] scripts/get_maintainer.py: initial parsing of MAINTAINERS Alex Bennée
2025-12-11 18:01 ` [RFC PATCH 7/9] scripts/get_maintainer.py: add support for -f Alex Bennée
2025-12-11 18:01 ` [RFC PATCH 8/9] scripts/get_maintainer.py: add support reading patch files Alex Bennée
2025-12-11 18:01 ` [RFC PATCH 9/9] gitlab: add a check-maintainers task Alex Bennée
2025-12-12 8:15 ` [RFC PATCH 0/9] for 11.0 conversion* of get_maintainers.pl to python Daniel P. Berrangé
2025-12-12 11:00 ` Alex Bennée
2025-12-12 11:25 ` Peter Maydell
2025-12-12 11:27 ` Peter Maydell
2025-12-12 14:38 ` Markus Armbruster
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).