mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	update_authors: output possible mailmap additions
Once we've selected a best ident for the AUTHORS file, it makes sense to set up a corresponding mailmap entry for any other ident for that committer, to ensure the git history also reflects this into the future. So, here we output potential mailmap updates for a human to consider. For the moment, this needs to be done by a human, because update_authors uses git to get the author names, and thus is reliant on the mailmap contents to generate its output, so having it update mailmap directly would introduce a circular dependency that I'm not totally sure about. It's definitely better than having to go back through the history and check each commit by hand though. Sponsored-by: https://despairlabs.com/sponsor/ Signed-off-by: Rob Norris <robn@despairlabs.com>
This commit is contained in:
		
							parent
							
								
									8e318fda80
								
							
						
					
					
						commit
						ae2caf9cb0
					
				| @ -133,8 +133,15 @@ for my $line (do { local (@ARGV) = ('AUTHORS'); <> }) { | |||||||
| # mappings, keyed on slug. Note that this format is getting the | # mappings, keyed on slug. Note that this format is getting the | ||||||
| # .mailmap-converted form. This lets us control the input to some extent by | # .mailmap-converted form. This lets us control the input to some extent by | ||||||
| # making changes there. | # making changes there. | ||||||
| my %git_names; | my %seen_names; | ||||||
| my %git_emails; | my %seen_emails; | ||||||
|  | 
 | ||||||
|  | # The true email address from commits, by slug. We do this so we can generate | ||||||
|  | # mailmap entries, which will only match the exact address from the commit, | ||||||
|  | # not anything "prettified". This lets us remember the prefix part of Github | ||||||
|  | # noreply addresses, while not including it in AUTHORS if that is truly the | ||||||
|  | # best option we have. | ||||||
|  | my %commit_email; | ||||||
| 
 | 
 | ||||||
| for my $line (reverse qx(git log --pretty=tformat:'%aN:::%aE:::%(trailers:key=signed-off-by,valueonly,separator=:::)')) { | for my $line (reverse qx(git log --pretty=tformat:'%aN:::%aE:::%(trailers:key=signed-off-by,valueonly,separator=:::)')) { | ||||||
| 	chomp $line; | 	chomp $line; | ||||||
| @ -145,8 +152,11 @@ for my $line (reverse qx(git log --pretty=tformat:'%aN:::%aE:::%(trailers:key=si | |||||||
| 	my $sname = name_slug($name); | 	my $sname = name_slug($name); | ||||||
| 
 | 
 | ||||||
| 	# Track the committer name and email. | 	# Track the committer name and email. | ||||||
| 	$git_names{$semail}{$sname} = 1; | 	$seen_names{$semail}{$sname} = 1; | ||||||
| 	$git_emails{$sname}{$semail} = 1; | 	$seen_emails{$sname}{$semail} = 1; | ||||||
|  | 
 | ||||||
|  | 	# Keep the original commit address. | ||||||
|  | 	$commit_email{$semail} = $email; | ||||||
| 
 | 
 | ||||||
| 	# Consider if these are the best we've ever seen. | 	# Consider if these are the best we've ever seen. | ||||||
| 	update_display_name($name); | 	update_display_name($name); | ||||||
| @ -160,8 +170,8 @@ for my $line (reverse qx(git log --pretty=tformat:'%aN:::%aE:::%(trailers:key=si | |||||||
| 		my $ssoname = name_slug($soname); | 		my $ssoname = name_slug($soname); | ||||||
| 		my $ssoemail = email_slug($soemail); | 		my $ssoemail = email_slug($soemail); | ||||||
| 		if (($semail eq $ssoemail) ^ ($sname eq $ssoname)) { | 		if (($semail eq $ssoemail) ^ ($sname eq $ssoname)) { | ||||||
| 		    $git_names{$ssoemail}{$ssoname} = 1; | 		    $seen_names{$ssoemail}{$ssoname} = 1; | ||||||
| 		    $git_emails{$ssoname}{$ssoemail} = 1; | 		    $seen_emails{$ssoname}{$ssoemail} = 1; | ||||||
| 		    update_display_name($soname); | 		    update_display_name($soname); | ||||||
| 		    update_display_email($soemail); | 		    update_display_email($soemail); | ||||||
| 		} | 		} | ||||||
| @ -172,9 +182,9 @@ for my $line (reverse qx(git log --pretty=tformat:'%aN:::%aE:::%(trailers:key=si | |||||||
| # We start with emails and resolve all possible names, then we resolve the | # We start with emails and resolve all possible names, then we resolve the | ||||||
| # emails for those names, and round and round until there's nothing left. | # emails for those names, and round and round until there's nothing left. | ||||||
| my @committers; | my @committers; | ||||||
| for my $start_email (sort keys %git_names) { | for my $start_email (sort keys %seen_names) { | ||||||
| 	# it might have been deleted already through a cross-reference | 	# it might have been deleted already through a cross-reference | ||||||
| 	next unless $git_names{$start_email}; | 	next unless $seen_names{$start_email}; | ||||||
| 
 | 
 | ||||||
| 	my %emails; | 	my %emails; | ||||||
| 	my %names; | 	my %names; | ||||||
| @ -185,12 +195,12 @@ for my $start_email (sort keys %git_names) { | |||||||
| 		while (my $email = shift @check_emails) { | 		while (my $email = shift @check_emails) { | ||||||
| 			next if $emails{$email}++; | 			next if $emails{$email}++; | ||||||
| 			push @check_names, | 			push @check_names, | ||||||
| 			    sort keys %{delete $git_names{$email}}; | 			    sort keys %{delete $seen_names{$email}}; | ||||||
| 		} | 		} | ||||||
| 		while (my $name = shift @check_names) { | 		while (my $name = shift @check_names) { | ||||||
| 			next if $names{$name}++; | 			next if $names{$name}++; | ||||||
| 			push @check_emails, | 			push @check_emails, | ||||||
| 			    sort keys %{delete $git_emails{$name}}; | 			    sort keys %{delete $seen_emails{$name}}; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @ -212,6 +222,20 @@ for my $committer (@committers) { | |||||||
| 
 | 
 | ||||||
| 	$authors_email{$name} = $email; | 	$authors_email{$name} = $email; | ||||||
| 	$authors_name{$email} = $name; | 	$authors_name{$email} = $name; | ||||||
|  | 
 | ||||||
|  | 	# We've now selected our canonical name going forward. If there | ||||||
|  | 	# were other options from commit authors only (not signoffs), | ||||||
|  | 	# emit mailmap lines for the user to past into .mailmap | ||||||
|  | 	my $cemail = $display_email{email_slug($authors_email{$name})}; | ||||||
|  | 	for my $alias (@$emails) { | ||||||
|  | 		next if $alias eq $email; | ||||||
|  | 
 | ||||||
|  | 		my $calias = $commit_email{$alias}; | ||||||
|  | 		next unless $calias; | ||||||
|  | 
 | ||||||
|  | 		my $cname = $display_name{$name}; | ||||||
|  | 		say "$cname <$cemail> <$calias>"; | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| # Now output the new AUTHORS file | # Now output the new AUTHORS file | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Rob Norris
						Rob Norris