Commit 2639772a authored by Alvin Šipraga's avatar Alvin Šipraga Committed by Linus Torvalds
Browse files

get_maintainer: remove stray punctuation when cleaning file emails

When parsing emails from .yaml files in particular, stray punctuation
such as a leading '-' can end up in the name.  For example, consider a
common YAML section such as:

  maintainers:
    - devicetree@vger.kernel.org

This would previously be processed by get_maintainer.pl as:

  - <devicetree@vger.kernel.org>

Make the logic in clean_file_emails more robust by deleting any
sub-names which consist of common single punctuation marks before
proceeding to the best-effort name extraction logic.  The output is then
correct:

  devicetree@vger.kernel.org

Some additional comments are added to the function to make things
clearer to future readers.

Link: https://lore.kernel.org/all/0173e76a36b3a9b4e7f324dd3a36fd4a9757f302.camel@perches.com/


Suggested-by: default avatarJoe Perches <joe@perches.com>
Signed-off-by: default avatarAlvin Šipraga <alsi@bang-olufsen.dk>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 9c334eb9
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -2462,11 +2462,17 @@ sub clean_file_emails {
    foreach my $email (@file_emails) {
	$email =~ s/[\(\<\{]{0,1}([A-Za-z0-9_\.\+-]+\@[A-Za-z0-9\.-]+)[\)\>\}]{0,1}/\<$1\>/g;
	my ($name, $address) = parse_email($email);
	if ($name eq '"[,\.]"') {
	    $name = "";
	}

	# Strip quotes for easier processing, format_email will add them back
	$name =~ s/^"(.*)"$/$1/;

	# Split into name-like parts and remove stray punctuation particles
	my @nw = split(/[^\p{L}\'\,\.\+-]/, $name);
	@nw = grep(!/^[\'\,\.\+-]$/, @nw);

	# Make a best effort to extract the name, and only the name, by taking
	# only the last two names, or in the case of obvious initials, the last
	# three names.
	if (@nw > 2) {
	    my $first = $nw[@nw - 3];
	    my $middle = $nw[@nw - 2];
@@ -2480,18 +2486,16 @@ sub clean_file_emails {
	    } else {
		$name = "$middle $last";
	    }
	} else {
	    $name = "@nw";
	}

	if (substr($name, -1) =~ /[,\.]/) {
	    $name = substr($name, 0, length($name) - 1);
	} elsif (substr($name, -2) =~ /[,\.]"/) {
	    $name = substr($name, 0, length($name) - 2) . '"';
	}

	if (substr($name, 0, 1) =~ /[,\.]/) {
	    $name = substr($name, 1, length($name) - 1);
	} elsif (substr($name, 0, 2) =~ /"[,\.]/) {
	    $name = '"' . substr($name, 2, length($name) - 2);
	}

	my $fmt_email = format_email($name, $address, $email_usename);