mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 02:17:36 -04:00
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:
committed by
Andrew Morton
parent
f13f1b0cb5
commit
09d8b39563
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user