Skip to content

Commit

Permalink
contacts: reduce git-blame invocations
Browse files Browse the repository at this point in the history
git-contacts invokes git-blame once for each patch hunk it encounters.
No attempt is made to consolidate invocations for multiple hunks
referencing the same file at the same revision. This can become
expensive quickly.

Reduce the number of git-blame invocations by taking advantage of the
ability to specify multiple -L ranges for a single invocation.

Without this patch, on a randomly chosen range of commits:

  % time git-contacts 25fba78^..23c339c >/dev/null
  real  0m6.142s
  user  0m5.429s
  sys   0m0.356s

With this patch:

  % time git-contacts 25fba78^..23c339c >/dev/null
  real  0m2.285s
  user  0m2.093s
  sys   0m0.165s

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 db8cae7 commit 4c70cfb
Showing 1 changed file with 5 additions and 6 deletions.
11 changes: 5 additions & 6 deletions contrib/contacts/git-contacts
Original file line number Diff line number Diff line change
Expand Up @@ -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+$/) {
Expand All @@ -78,10 +80,7 @@ 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);
}
get_blame($commits, $s, $id, $sources->{$s}{$id});
}
}
}
Expand Down

0 comments on commit 4c70cfb

Please sign in to comment.