+sub vcs_interactive_menu {
+ my $list_ref = shift;
+ my @list = @$list_ref;
+
+ return if (!vcs_exists());
+
+ my %selected;
+ my %shortlog;
+ my $input;
+ my $count = 0;
+
+ #select maintainers by default
+ foreach my $entry (@list){
+ my $role = $entry->[1];
+ $selected{$count} = ($role =~ /maintainer:|supporter:/);
+ $count++;
+ }
+
+ #menu loop
+ do {
+ my $count = 0;
+ foreach my $entry (@list){
+ my $email = $entry->[0];
+ my $role = $entry->[1];
+ if ($selected{$count}){
+ print STDERR "* ";
+ } else {
+ print STDERR " ";
+ }
+ print STDERR "$count: $email,\t\t $role";
+ print STDERR "\n";
+ if ($shortlog{$count}){
+ my $entries_ref = vcs_get_shortlog($email);
+ foreach my $entry_ref (@{$entries_ref}){
+ my $filename = @{$entry_ref}[0];
+ my @shortlog = @{@{$entry_ref}[1]};
+ print STDERR "\tshortlog for $filename (authored commits: " . @shortlog . ").\n";
+ foreach my $commit (@shortlog){
+ print STDERR "\t $commit\n";
+ }
+ print STDERR "\n";
+ }
+ }
+ $count++;
+ }
+ print STDERR "\n";
+ print STDERR "Choose whom to cc by entering a commaseperated list of numbers and hitting enter.\n";
+ print STDERR "To show a short list of commits, precede the number by a '?',\n";
+ print STDERR "A blank line indicates that you are satisfied with your choice.\n";
+ $input = <STDIN>;
+ chomp($input);
+
+ my @wish = split(/[, ]+/,$input);
+ foreach my $nr (@wish){
+ my $logtoggle = 0;
+ if ($nr =~ /\?/){
+ $nr =~ s/\?//;
+ $logtoggle = 1;
+ }
+
+ #skip out of bounds numbers
+ next unless ($nr <= $count && $nr >= 0);
+
+ if ($logtoggle){
+ $shortlog{$nr} = !$shortlog{$nr};
+ } else {
+ $selected{$nr} = !$selected{$nr};
+
+ #switch shortlog on if an entry get's selected
+ if ($selected{$nr}){
+ $shortlog{$nr}=1;
+ }
+ }
+ };
+ } while(length($input) > 0);
+
+ #drop not selected entries
+ $count = 0;
+ my @new_emailto;
+ foreach my $entry (@list){
+ if ($selected{$count}){
+ push(@new_emailto,$list[$count]);
+ print STDERR "$count: ";
+ print STDERR $email_to[$count]->[0];
+ print STDERR ",\t\t ";
+ print STDERR $email_to[$count]->[1];
+ print STDERR "\n";
+ }
+ $count++;
+ }
+ return \@new_emailto;
+}
+
+sub vcs_get_shortlog {
+ my $arg = shift;
+ my ($name, $address) = parse_email($arg);
+ return $shortlog_buffer{$address};
+}
+
+sub vcs_file_shortlogs {
+ my ($file) = @_;
+ print STDERR "shortlog processing $file:";
+ foreach my $entry (@email_to){
+ my ($name, $address) = parse_email($entry->[0]);
+ print STDERR ".";
+ my $commits_ref = vcs_email_shortlog($address, $file);
+ push(@{$shortlog_buffer{$address}}, [ $file, $commits_ref ]);
+ }
+ print STDERR "\n";
+}
+
+sub vcs_email_shortlog {
+ my $email = shift;
+ my ($file) = @_;
+
+ my $cmd = $VCS_cmds{"shortlog_cmd"};
+ $cmd =~ s/(\$\w+)/$1/eeg; #substitute variables
+ my @lines = &{$VCS_cmds{"execute_cmd"}}($cmd);
+ return \@lines;
+}
+