Skip to content

Commit

Permalink
contacts: gather all blame sources prior to invoking git-blame
Browse files Browse the repository at this point in the history
git-contacts invokes git-blame immediately upon encountering a patch
hunk. No attempt is made to consolidate invocations for multiple hunks
referencing the same file at the same revision. This can become
expensive quickly.

Any effort to reduce the number of times git-blame is run will need to
to know in advance which line ranges to blame per file per revision.
Make this information available by collecting all sources as a distinct
step from invoking git-blame.  A subsequent patch will utilize the
information to optimize git-blame invocations.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Eric Sunshine authored and Junio C Hamano committed Aug 13, 2013
1 parent 9ae9ca1 commit db8cae7
Showing 1 changed file with 20 additions and 5 deletions.
25 changes: 20 additions & 5 deletions contrib/contacts/git-contacts
Original file line number Diff line number Diff line change
Expand Up @@ -74,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$/) {
Expand All @@ -89,7 +101,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;
}
}
}
Expand Down Expand Up @@ -162,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 = {};
Expand Down

0 comments on commit db8cae7

Please sign in to comment.