Merge branch 'jx/clean-interactive'
[gitweb.git] / contrib / contacts / git-contacts
index 4fbb2ef85a76743780cfa1f81d0f9cdc75362e63..428cc1a9a1367e36c2739cb226a0ffdd2704ce82 100755 (executable)
@@ -59,9 +59,11 @@ sub import_commits {
 }
 
 sub get_blame {
-       my ($commits, $source, $start, $len, $from) = @_;
+       my ($commits, $source, $from, $ranges) = @_;
+       return unless @$ranges;
        open my $f, '-|',
-               qw(git blame --porcelain -C), '-L', "$start,+$len",
+               qw(git blame --porcelain -C),
+               map({"-L$_->[0],+$_->[1]"} @$ranges),
                '--since', $since, "$from^", '--', $source or die;
        while (<$f>) {
                if (/^([0-9a-f]{40}) \d+ \d+ \d+$/) {
@@ -74,8 +76,17 @@ sub get_blame {
        close $f;
 }
 
+sub blame_sources {
+       my ($sources, $commits) = @_;
+       for my $s (keys %$sources) {
+               for my $id (keys %{$sources->{$s}}) {
+                       get_blame($commits, $s, $id, $sources->{$s}{$id});
+               }
+       }
+}
+
 sub scan_patches {
-       my ($commits, $id, $f) = @_;
+       my ($sources, $id, $f) = @_;
        my $source;
        while (<$f>) {
                if (/^From ([0-9a-f]{40}) Mon Sep 17 00:00:00 2001$/) {
@@ -89,7 +100,7 @@ sub scan_patches {
                        die "Cannot parse hunk source: $_\n";
                } elsif (/^@@ -(\d+)(?:,(\d+))?/ && $source) {
                        my $len = defined($2) ? $2 : 1;
-                       get_blame($commits, $source, $1, $len, $id) if $len;
+                       push @{$sources->{$source}{$id}}, [$1, $len] if $len;
                }
        }
 }
@@ -162,13 +173,20 @@ for (@ARGV) {
        }
 }
 
-my %commits;
+my %sources;
 for (@files) {
-       scan_patch_file(\%commits, $_);
+       scan_patch_file(\%sources, $_);
 }
 if (@rev_args) {
-       scan_rev_args(\%commits, \@rev_args)
+       scan_rev_args(\%sources, \@rev_args)
 }
+
+my $toplevel = `git rev-parse --show-toplevel`;
+chomp $toplevel;
+chdir($toplevel) or die "chdir failure: $toplevel: $!\n";
+
+my %commits;
+blame_sources(\%sources, \%commits);
 import_commits(\%commits);
 
 my $contacts = {};