aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Mickler <florian@mickler.org>2010-10-26 17:22:54 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2010-10-26 19:52:17 -0400
commitdace8e300d6820c2842de750d12b498a743bcfe5 (patch)
tree2c98305bee3da1914c00768c5ac65a0dedda83d5
parentbcde44ed7d2a58733efdf04b5392c027d1348bac (diff)
scripts/get_maintainer.pl: add interactive mode
This is a first version of an interactive mode for scripts/get_maintainer.pl. It allows the user to interact with the script. Each cc candidate can be selected and deselected and a shortlog of authored commits can be displayed for each candidate. The menu is displayed via STDERR, the end result is outputted to STDOUT. This unusual mechanism allows using get_maintainer.pl in interactive mode via git send-email --cc-cmd. Signed-off-by: Joe Perches <joe@perches.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rwxr-xr-xscripts/get_maintainer.pl146
1 files changed, 141 insertions, 5 deletions
diff --git a/scripts/get_maintainer.pl b/scripts/get_maintainer.pl
index e5a400c53bf0..1ae8c50f1908 100755
--- a/scripts/get_maintainer.pl
+++ b/scripts/get_maintainer.pl
@@ -33,6 +33,7 @@ my $email_git_max_maintainers = 5;
33my $email_git_min_percent = 5; 33my $email_git_min_percent = 5;
34my $email_git_since = "1-year-ago"; 34my $email_git_since = "1-year-ago";
35my $email_hg_since = "-365"; 35my $email_hg_since = "-365";
36my $interactive = 0;
36my $email_remove_duplicates = 1; 37my $email_remove_duplicates = 1;
37my $output_multiline = 1; 38my $output_multiline = 1;
38my $output_separator = ", "; 39my $output_separator = ", ";
@@ -52,6 +53,8 @@ my $help = 0;
52 53
53my $exit = 0; 54my $exit = 0;
54 55
56my %shortlog_buffer;
57
55my @penguin_chief = (); 58my @penguin_chief = ();
56push(@penguin_chief, "Linus Torvalds:torvalds\@linux-foundation.org"); 59push(@penguin_chief, "Linus Torvalds:torvalds\@linux-foundation.org");
57#Andrew wants in on most everything - 2009/01/14 60#Andrew wants in on most everything - 2009/01/14
@@ -93,7 +96,8 @@ my %VCS_cmds_git = (
93 "blame_range_cmd" => "git blame -l -L \$diff_start,+\$diff_length \$file", 96 "blame_range_cmd" => "git blame -l -L \$diff_start,+\$diff_length \$file",
94 "blame_file_cmd" => "git blame -l \$file", 97 "blame_file_cmd" => "git blame -l \$file",
95 "commit_pattern" => "^commit [0-9a-f]{40,40}", 98 "commit_pattern" => "^commit [0-9a-f]{40,40}",
96 "blame_commit_pattern" => "^([0-9a-f]+) " 99 "blame_commit_pattern" => "^([0-9a-f]+) ",
100 "shortlog_cmd" => "git log --no-color --oneline --since=\$email_git_since --author=\"\$email\" -- \$file"
97); 101);
98 102
99my %VCS_cmds_hg = ( 103my %VCS_cmds_hg = (
@@ -107,7 +111,8 @@ my %VCS_cmds_hg = (
107 "blame_range_cmd" => "", # not supported 111 "blame_range_cmd" => "", # not supported
108 "blame_file_cmd" => "hg blame -c \$file", 112 "blame_file_cmd" => "hg blame -c \$file",
109 "commit_pattern" => "^commit [0-9a-f]{40,40}", 113 "commit_pattern" => "^commit [0-9a-f]{40,40}",
110 "blame_commit_pattern" => "^([0-9a-f]+):" 114 "blame_commit_pattern" => "^([0-9a-f]+):",
115 "shortlog_cmd" => "ht log --date=\$email_hg_since"
111); 116);
112 117
113my $conf = which_conf(".get_maintainer.conf"); 118my $conf = which_conf(".get_maintainer.conf");
@@ -148,6 +153,7 @@ if (!GetOptions(
148 'git-min-percent=i' => \$email_git_min_percent, 153 'git-min-percent=i' => \$email_git_min_percent,
149 'git-since=s' => \$email_git_since, 154 'git-since=s' => \$email_git_since,
150 'hg-since=s' => \$email_hg_since, 155 'hg-since=s' => \$email_hg_since,
156 'i|interactive!' => \$interactive,
151 'remove-duplicates!' => \$email_remove_duplicates, 157 'remove-duplicates!' => \$email_remove_duplicates,
152 'm!' => \$email_maintainer, 158 'm!' => \$email_maintainer,
153 'n!' => \$email_usename, 159 'n!' => \$email_usename,
@@ -225,6 +231,8 @@ if ($email_git_all_signature_types) {
225 $signaturePattern = "(.+?)[Bb][Yy]:"; 231 $signaturePattern = "(.+?)[Bb][Yy]:";
226} 232}
227 233
234
235
228## Read MAINTAINERS for type/value pairs 236## Read MAINTAINERS for type/value pairs
229 237
230my @typevalue = (); 238my @typevalue = ();
@@ -450,10 +458,13 @@ foreach my $file (@files) {
450 ($email_git || ($email_git_fallback && !$exact_pattern_match))) { 458 ($email_git || ($email_git_fallback && !$exact_pattern_match))) {
451 vcs_file_signoffs($file); 459 vcs_file_signoffs($file);
452 } 460 }
453
454 if ($email && $email_git_blame) { 461 if ($email && $email_git_blame) {
455 vcs_file_blame($file); 462 vcs_file_blame($file);
456 } 463 }
464 if ($email && $interactive){
465 vcs_file_shortlogs($file);
466
467 }
457} 468}
458 469
459if ($keywords) { 470if ($keywords) {
@@ -486,9 +497,13 @@ if ($email) {
486 } 497 }
487} 498}
488 499
500
489if ($email || $email_list) { 501if ($email || $email_list) {
490 my @to = (); 502 my @to = ();
491 if ($email) { 503 if ($email) {
504 if ($interactive) {
505 @email_to = @{vcs_interactive_menu(\@email_to)};
506 }
492 @to = (@to, @email_to); 507 @to = (@to, @email_to);
493 } 508 }
494 if ($email_list) { 509 if ($email_list) {
@@ -501,7 +516,6 @@ if ($scm) {
501 @scm = uniq(@scm); 516 @scm = uniq(@scm);
502 output(@scm); 517 output(@scm);
503} 518}
504
505if ($status) { 519if ($status) {
506 @status = uniq(@status); 520 @status = uniq(@status);
507 output(@status); 521 output(@status);
@@ -556,6 +570,7 @@ MAINTAINER field selection options:
556 --git-blame => use git blame to find modified commits for patch or file 570 --git-blame => use git blame to find modified commits for patch or file
557 --git-since => git history to use (default: $email_git_since) 571 --git-since => git history to use (default: $email_git_since)
558 --hg-since => hg history to use (default: $email_hg_since) 572 --hg-since => hg history to use (default: $email_hg_since)
573 --interactive => display a menu (mostly useful if used with the --git option)
559 --m => include maintainer(s) if any 574 --m => include maintainer(s) if any
560 --n => include name 'Full Name <addr\@domain.tld>' 575 --n => include name 'Full Name <addr\@domain.tld>'
561 --l => include list(s) if any 576 --l => include list(s) if any
@@ -1156,6 +1171,127 @@ sub vcs_exists {
1156 return 0; 1171 return 0;
1157} 1172}
1158 1173
1174sub vcs_interactive_menu {
1175 my $list_ref = shift;
1176 my @list = @$list_ref;
1177
1178 return if (!vcs_exists());
1179
1180 my %selected;
1181 my %shortlog;
1182 my $input;
1183 my $count = 0;
1184
1185 #select maintainers by default
1186 foreach my $entry (@list){
1187 my $role = $entry->[1];
1188 $selected{$count} = ($role =~ /maintainer:|supporter:/);
1189 $count++;
1190 }
1191
1192 #menu loop
1193 do {
1194 my $count = 0;
1195 foreach my $entry (@list){
1196 my $email = $entry->[0];
1197 my $role = $entry->[1];
1198 if ($selected{$count}){
1199 print STDERR "* ";
1200 } else {
1201 print STDERR " ";
1202 }
1203 print STDERR "$count: $email,\t\t $role";
1204 print STDERR "\n";
1205 if ($shortlog{$count}){
1206 my $entries_ref = vcs_get_shortlog($email);
1207 foreach my $entry_ref (@{$entries_ref}){
1208 my $filename = @{$entry_ref}[0];
1209 my @shortlog = @{@{$entry_ref}[1]};
1210 print STDERR "\tshortlog for $filename (authored commits: " . @shortlog . ").\n";
1211 foreach my $commit (@shortlog){
1212 print STDERR "\t $commit\n";
1213 }
1214 print STDERR "\n";
1215 }
1216 }
1217 $count++;
1218 }
1219 print STDERR "\n";
1220 print STDERR "Choose whom to cc by entering a commaseperated list of numbers and hitting enter.\n";
1221 print STDERR "To show a short list of commits, precede the number by a '?',\n";
1222 print STDERR "A blank line indicates that you are satisfied with your choice.\n";
1223 $input = <STDIN>;
1224 chomp($input);
1225
1226 my @wish = split(/[, ]+/,$input);
1227 foreach my $nr (@wish){
1228 my $logtoggle = 0;
1229 if ($nr =~ /\?/){
1230 $nr =~ s/\?//;
1231 $logtoggle = 1;
1232 }
1233
1234 #skip out of bounds numbers
1235 next unless ($nr <= $count && $nr >= 0);
1236
1237 if ($logtoggle){
1238 $shortlog{$nr} = !$shortlog{$nr};
1239 } else {
1240 $selected{$nr} = !$selected{$nr};
1241
1242 #switch shortlog on if an entry get's selected
1243 if ($selected{$nr}){
1244 $shortlog{$nr}=1;
1245 }
1246 }
1247 };
1248 } while(length($input) > 0);
1249
1250 #drop not selected entries
1251 $count = 0;
1252 my @new_emailto;
1253 foreach my $entry (@list){
1254 if ($selected{$count}){
1255 push(@new_emailto,$list[$count]);
1256 print STDERR "$count: ";
1257 print STDERR $email_to[$count]->[0];
1258 print STDERR ",\t\t ";
1259 print STDERR $email_to[$count]->[1];
1260 print STDERR "\n";
1261 }
1262 $count++;
1263 }
1264 return \@new_emailto;
1265}
1266
1267sub vcs_get_shortlog {
1268 my $arg = shift;
1269 my ($name, $address) = parse_email($arg);
1270 return $shortlog_buffer{$address};
1271}
1272
1273sub vcs_file_shortlogs {
1274 my ($file) = @_;
1275 print STDERR "shortlog processing $file:";
1276 foreach my $entry (@email_to){
1277 my ($name, $address) = parse_email($entry->[0]);
1278 print STDERR ".";
1279 my $commits_ref = vcs_email_shortlog($address, $file);
1280 push(@{$shortlog_buffer{$address}}, [ $file, $commits_ref ]);
1281 }
1282 print STDERR "\n";
1283}
1284
1285sub vcs_email_shortlog {
1286 my $email = shift;
1287 my ($file) = @_;
1288
1289 my $cmd = $VCS_cmds{"shortlog_cmd"};
1290 $cmd =~ s/(\$\w+)/$1/eeg; #substitute variables
1291 my @lines = &{$VCS_cmds{"execute_cmd"}}($cmd);
1292 return \@lines;
1293}
1294
1159sub vcs_assign { 1295sub vcs_assign {
1160 my ($role, $divisor, @lines) = @_; 1296 my ($role, $divisor, @lines) = @_;
1161 1297
@@ -1236,7 +1372,7 @@ sub vcs_file_blame {
1236 my @commit_signers = (); 1372 my @commit_signers = ();
1237 1373
1238 my $cmd = $VCS_cmds{"find_commit_signers_cmd"}; 1374 my $cmd = $VCS_cmds{"find_commit_signers_cmd"};
1239 $cmd =~ s/(\$\w+)/$1/eeg; #interpolate $cmd 1375 $cmd =~ s/(\$\w+)/$1/eeg; #substitute variables in $cmd
1240 1376
1241 ($commit_count, @commit_signers) = vcs_find_signers($cmd); 1377 ($commit_count, @commit_signers) = vcs_find_signers($cmd);
1242 1378