git-svn: cache max revision in rev_db databases
Cache the maximum revision for each rev_db URL rather than looking it up each time. This saves a lot of time when rebuilding indexes on a freshly cloned repository. Signed-off-by: Sam Vilain <sam.vilain@catalyst.net.nz> Acked-by: Eric Wong <normalperson@yhbt.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
3dfab993c8
commit
40cb8f8f08
|
@ -806,6 +806,7 @@ sub working_head_info {
|
||||||
my ($head, $refs) = @_;
|
my ($head, $refs) = @_;
|
||||||
my ($fh, $ctx) = command_output_pipe('log', $head);
|
my ($fh, $ctx) = command_output_pipe('log', $head);
|
||||||
my $hash;
|
my $hash;
|
||||||
|
my %max;
|
||||||
while (<$fh>) {
|
while (<$fh>) {
|
||||||
if ( m{^commit ($::sha1)$} ) {
|
if ( m{^commit ($::sha1)$} ) {
|
||||||
unshift @$refs, $hash if $hash and $refs;
|
unshift @$refs, $hash if $hash and $refs;
|
||||||
|
@ -815,11 +816,14 @@ sub working_head_info {
|
||||||
next unless s{^\s*(git-svn-id:)}{$1};
|
next unless s{^\s*(git-svn-id:)}{$1};
|
||||||
my ($url, $rev, $uuid) = extract_metadata($_);
|
my ($url, $rev, $uuid) = extract_metadata($_);
|
||||||
if (defined $url && defined $rev) {
|
if (defined $url && defined $rev) {
|
||||||
|
next if $max{$url} and $max{$url} < $rev;
|
||||||
if (my $gs = Git::SVN->find_by_url($url)) {
|
if (my $gs = Git::SVN->find_by_url($url)) {
|
||||||
my $c = $gs->rev_db_get($rev);
|
my $c = $gs->rev_db_get($rev);
|
||||||
if ($c && $c eq $hash) {
|
if ($c && $c eq $hash) {
|
||||||
close $fh; # break the pipe
|
close $fh; # break the pipe
|
||||||
return ($url, $rev, $uuid, $gs);
|
return ($url, $rev, $uuid, $gs);
|
||||||
|
} else {
|
||||||
|
$max{$url} ||= $gs->rev_db_max;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue