contacts: gather all blame sources prior to invoking git-blame
[gitweb.git] / contrib / contacts / git-contacts
index d80f7d1b6e6928dc7d24a56720caf13220f95236..b4d3526a4666bb737db56f64771fcddf3e7afca7 100755 (executable)
@@ -60,8 +60,6 @@ sub import_commits {
 
 sub get_blame {
        my ($commits, $source, $start, $len, $from) = @_;
-       $len = 1 unless defined($len);
-       return if $len == 0;
        open my $f, '-|',
                qw(git blame --porcelain -C), '-L', "$start,+$len",
                '--since', $since, "$from^", '--', $source or die;
@@ -76,8 +74,20 @@ sub get_blame {
        close $f;
 }
 
+sub blame_sources {
+       my ($sources, $commits) = @_;
+       for my $s (keys %$sources) {
+               for my $id (keys %{$sources->{$s}}) {
+                       for my $range (@{$sources->{$s}{$id}}) {
+                               get_blame($commits, $s,
+                                         $range->[0], $range->[1], $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$/) {
@@ -90,7 +100,8 @@ sub scan_patches {
                } elsif (/^--- /) {
                        die "Cannot parse hunk source: $_\n";
                } elsif (/^@@ -(\d+)(?:,(\d+))?/ && $source) {
-                       get_blame($commits, $source, $1, $2, $id);
+                       my $len = defined($2) ? $2 : 1;
+                       push @{$sources->{$source}{$id}}, [$1, $len] if $len;
                }
        }
 }
@@ -163,13 +174,16 @@ 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 %commits;
+blame_sources(\%sources, \%commits);
 import_commits(\%commits);
 
 my $contacts = {};