From nobody Mon Jun 15 07:32:47 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D645837EFE9 for ; Wed, 8 Apr 2026 19:45:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775677543; cv=none; b=GGJ4ne2oMhD2l6TYMk3pykFXsOUoYNhc5JBxmtMk+AO/ua2KIK6Q4Xyp+PGELW8nu9sy2g7892IJGorJ6Lwq5ZR0/7yNfJkjcgTgxt9veOvFdE7ki/pQf5miXqR582w3iHwtGOZ+t+0IlqLhq17pCRt50A5TaZ6Im+kqDHkdZe4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775677543; c=relaxed/simple; bh=vevBevHSmDyUTvNC/PkHXYmivj9yYPtWjac1x+wmOXw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Kd5DjUI6c8CarQ3pzMyv82y2TuSi2Tt4Pe+f0QBekFUR4aS2XZatanMr99Zws3SyzMcXtGt3Qq4DukXK70svjim11Wx2VpbX6o9seQs6omixKrU7SQgdVJxJ2Y9hxgZZ4fUkbKriV1mLm6iIgRPJ6b+NgAfhgrbIyWcY4VY8GaE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dNAVcyD6; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="dNAVcyD6" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 53C6BC19421; Wed, 8 Apr 2026 19:45:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1775677543; bh=vevBevHSmDyUTvNC/PkHXYmivj9yYPtWjac1x+wmOXw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dNAVcyD6yTLG36oW+C6RTy6hIEHcPkp0go4cOoijUlbZMd2Hc5htpV5YTsyB72CsC WZJGWyddPawonMs/YGVKRDgT8fprNfI3TE+6eJzkzIJbe/PKgSULjDNr3E5KIXzwns 7JOM4AKcFEq1/I4xvql1FqrERKErjEhIAQIl80v8RSrHjgA2MUPwMXKGQvVVE7GjSw ntub320bAQ386pEB7aH9bOBupH2rsvKa/LIspYvBh9mrwPUnhfgVfwP+nobjUwEu0H ZxxXBwyJgR0mfFkwldXp01WUs0x/jEDBrlB+aKMIbODOwefdBgcfxRmAprtIUWRagF 91QY4zyQrR7yg== From: Sasha Levin To: joe@perches.com Cc: linux-kernel@vger.kernel.org, Sasha Levin Subject: [PATCH v2] get_maintainer: add --json output mode Date: Wed, 8 Apr 2026 15:45:42 -0400 Message-ID: <20260408194542.1354549-1-sashal@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260406170138.4034983-1-sashal@kernel.org> References: <20260406170138.4034983-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 Signed-off-by: Sasha Levin Acked-by: Joe Perches --- Changes since v1: - Replace hand-rolled json_escape_str()/json_str_array() with JSON::PP module (core since perl 5.14) - Reuse merge_email() for deduplication instead of reimplementing it, per Joe's review - Consolidate uniq() dedup calls before the json/non-json branch so both paths share the same logic --- scripts/get_maintainer.pl | 73 +++++++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/scripts/get_maintainer.pl b/scripts/get_maintainer.pl index 4414194bedcfd..1bd4170684483 100755 --- a/scripts/get_maintainer.pl +++ b/scripts/get_maintainer.pl @@ -21,6 +21,7 @@ use Cwd; use File::Find; use File::Spec::Functions; use open qw(:std :encoding(UTF-8)); +use JSON::PP; =20 my $cur_path =3D fastgetcwd() . '/'; my $lk_path =3D "./"; @@ -68,6 +69,7 @@ my $pattern_depth =3D 0; my $self_test =3D undef; my $version =3D 0; my $help =3D 0; +my $json =3D 0; my $find_maintainer_files =3D 0; my $maintainer_path; my $vcs_used =3D 0; @@ -285,6 +287,7 @@ if (!GetOptions( 'find-maintainer-files' =3D> \$find_maintainer_files, 'mpath|maintainer-path=3Ds' =3D> \$maintainer_path, 'self-test:s' =3D> \$self_test, + 'json!' =3D> \$json, 'v|version' =3D> \$version, 'h|help|usage' =3D> \$help, )) { @@ -648,39 +651,48 @@ my %deduplicate_name_hash =3D (); my %deduplicate_address_hash =3D (); =20 my @maintainers =3D get_maintainers(); -if (@maintainers) { - @maintainers =3D merge_email(@maintainers); - output(@maintainers); -} - -if ($scm) { - @scm =3D uniq(@scm); - output(@scm); -} - -if ($output_substatus) { - @substatus =3D uniq(@substatus); - output(@substatus); -} - -if ($status) { - @status =3D uniq(@status); - output(@status); -} =20 -if ($subsystem) { - @subsystem =3D uniq(@subsystem); - output(@subsystem); -} +@maintainers =3D merge_email(@maintainers) if (@maintainers); +@scm =3D uniq(@scm) if ($scm); +@substatus =3D uniq(@substatus) if ($output_substatus); +@status =3D uniq(@status) if ($status); +@subsystem =3D uniq(@subsystem) if ($subsystem); +@web =3D uniq(@web) if ($web); +@bug =3D uniq(@bug) if ($bug); + +if ($json) { + my @json_maintainers; + for my $m (@maintainers) { + my ($addr, $role); + if ($output_roles && $m =3D~ /^(.*?)\s+\((.+)\)\s*$/) { + $addr =3D $1; + $role =3D $2; + } else { + $addr =3D $m; + } + my ($name, $email_addr) =3D parse_email($addr); + my %entry =3D (name =3D> $name, email =3D> $email_addr); + $entry{role} =3D $role if (defined $role && $role ne ''); + push(@json_maintainers, \%entry); + } =20 -if ($web) { - @web =3D uniq(@web); - output(@web); -} + my %result =3D (maintainers =3D> \@json_maintainers); + $result{scm} =3D \@scm if ($scm); + $result{status} =3D \@status if ($status); + $result{subsystem} =3D \@subsystem if ($subsystem); + $result{web} =3D \@web if ($web); + $result{bug} =3D \@bug if ($bug); =20 -if ($bug) { - @bug =3D uniq(@bug); - output(@bug); + my $json_encoder =3D 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); } =20 exit($exit); @@ -1099,6 +1111,7 @@ Output type options: --separator [, ] =3D> separator for multiple entries on 1 line using --separator also sets --nomultiline if --separator is not [, ] --multiline =3D> print 1 entry per line + --json =3D> output results as JSON =20 Other options: --pattern-depth =3D> Number of pattern directory traversals (default: 0 = (all)) --=20 2.53.0