summaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorLibravatar Eric Sunshine <sunshine@sunshineco.com>2013-08-09 17:39:55 -0400
committerLibravatar Junio C Hamano <gitster@pobox.com>2013-08-13 09:09:01 -0700
commitdb8cae7e6035dd56970c88ac9e34bce1baa0f665 (patch)
treef4e81c8c8f0efd70dab22b2f5f4eee529c9cd032 /contrib
parentcontacts: validate hunk length earlier (diff)
downloadtgif-db8cae7e6035dd56970c88ac9e34bce1baa0f665.tar.xz
contacts: gather all blame sources prior to invoking git-blame
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>
Diffstat (limited to 'contrib')
-rwxr-xr-xcontrib/contacts/git-contacts25
1 files changed, 20 insertions, 5 deletions
diff --git a/contrib/contacts/git-contacts b/contrib/contacts/git-contacts
index 4fbb2ef85a..b4d3526a46 100755
--- a/contrib/contacts/git-contacts
+++ b/contrib/contacts/git-contacts
@@ -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$/) {
@@ -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;
}
}
}
@@ -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 = {};