Eric Sunshine <[email protected]> writes:
> 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 25fba78d36be6297^..23c339c0f262aad2 >/dev/null
> real 0m6.142s
> user 0m5.429s
> sys 0m0.356s
>
> With this patch:
>
> % time git-contacts 25fba78d36be6297^..23c339c0f262aad2 >/dev/null
> real 0m2.285s
> user 0m2.093s
> sys 0m0.165s
>
> Signed-off-by: Eric Sunshine <[email protected]>
Nice. Will queue.
> ---
> contrib/contacts/git-contacts | 11 +++++------
> 1 file changed, 5 insertions(+), 6 deletions(-)
>
> diff --git a/contrib/contacts/git-contacts b/contrib/contacts/git-contacts
> index b4d3526..fb6429b 100755
> --- a/contrib/contacts/git-contacts
> +++ b/contrib/contacts/git-contacts
> @@ -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+$/) {
> @@ -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});
> }
> }
> }
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html