get_maintainer: add --json output mode

Add a --json flag to get_maintainer.pl that emits structured JSON output,
making results machine-parseable for CI systems, IDE integrations, and
AI-assisted development tools.

The JSON output includes a maintainers array with structured name, email,
and role fields, plus optional arrays for scm, status, subsystem, web, and
bug information when those flags are enabled.

Normal text output behavior is completely unchanged when --json is not
specified.

Assisted-by: Claude:claude-opus-4-6
Link: https://lore.kernel.org/20260408194542.1354549-1-sashal@kernel.org
Signed-off-by: Sasha Levin <sashal@kernel.org>
Acked-by: Joe Perches <joe@perches.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Sasha Levin
2026-04-08 15:45:42 -04:00
committed by Andrew Morton
parent f13f1b0cb5
commit 09d8b39563

View File

@@ -21,6 +21,7 @@ use Cwd;
use File::Find;
use File::Spec::Functions;
use open qw(:std :encoding(UTF-8));
use JSON::PP;
my $cur_path = fastgetcwd() . '/';
my $lk_path = "./";
@@ -68,6 +69,7 @@ my $pattern_depth = 0;
my $self_test = undef;
my $version = 0;
my $help = 0;
my $json = 0;
my $find_maintainer_files = 0;
my $maintainer_path;
my $vcs_used = 0;
@@ -285,6 +287,7 @@ if (!GetOptions(
'find-maintainer-files' => \$find_maintainer_files,
'mpath|maintainer-path=s' => \$maintainer_path,
'self-test:s' => \$self_test,
'json!' => \$json,
'v|version' => \$version,
'h|help|usage' => \$help,
)) {
@@ -650,39 +653,48 @@ my %deduplicate_name_hash = ();
my %deduplicate_address_hash = ();
my @maintainers = get_maintainers();
if (@maintainers) {
@maintainers = merge_email(@maintainers);
output(@maintainers);
}
if ($scm) {
@scm = uniq(@scm);
output(@scm);
}
@maintainers = merge_email(@maintainers) if (@maintainers);
@scm = uniq(@scm) if ($scm);
@substatus = uniq(@substatus) if ($output_substatus);
@status = uniq(@status) if ($status);
@subsystem = uniq(@subsystem) if ($subsystem);
@web = uniq(@web) if ($web);
@bug = uniq(@bug) if ($bug);
if ($output_substatus) {
@substatus = uniq(@substatus);
output(@substatus);
}
if ($json) {
my @json_maintainers;
for my $m (@maintainers) {
my ($addr, $role);
if ($output_roles && $m =~ /^(.*?)\s+\((.+)\)\s*$/) {
$addr = $1;
$role = $2;
} else {
$addr = $m;
}
my ($name, $email_addr) = parse_email($addr);
my %entry = (name => $name, email => $email_addr);
$entry{role} = $role if (defined $role && $role ne '');
push(@json_maintainers, \%entry);
}
if ($status) {
@status = uniq(@status);
output(@status);
}
my %result = (maintainers => \@json_maintainers);
$result{scm} = \@scm if ($scm);
$result{status} = \@status if ($status);
$result{subsystem} = \@subsystem if ($subsystem);
$result{web} = \@web if ($web);
$result{bug} = \@bug if ($bug);
if ($subsystem) {
@subsystem = uniq(@subsystem);
output(@subsystem);
}
if ($web) {
@web = uniq(@web);
output(@web);
}
if ($bug) {
@bug = uniq(@bug);
output(@bug);
my $json_encoder = JSON::PP->new->canonical->utf8;
print($json_encoder->encode(\%result) . "\n");
} else {
output(@maintainers) if (@maintainers);
output(@scm) if ($scm);
output(@substatus) if ($output_substatus);
output(@status) if ($status);
output(@subsystem) if ($subsystem);
output(@web) if ($web);
output(@bug) if ($bug);
}
exit($exit);
@@ -1104,6 +1116,7 @@ Output type options:
--separator [, ] => separator for multiple entries on 1 line
using --separator also sets --nomultiline if --separator is not [, ]
--multiline => print 1 entry per line
--json => output results as JSON
Other options:
--pattern-depth => Number of pattern directory traversals (default: 0 (all))