git-svn: fix "Malformed network data" with svn:// servers
We have a workaround for the reparent function not working correctly on the SVN native protocol servers. This workaround opens a new connection (SVN::Ra object) to the new URL/directory. Since libsvn appears limited to only supporting one connection at a time, this workaround invalidates the Git::SVN::Ra object that is $self inside gs_fetch_loop_common(). So we need to restart that connection once all the fetching is done for each loop iteration to be able to run get_log() successfully. Signed-off-by: Eric Wong <normalperson@yhbt.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
ee834cf0c7
commit
a51cdb0c04
14
git-svn.perl
14
git-svn.perl
@ -3013,7 +3013,7 @@ package Git::SVN::Ra;
|
|||||||
use vars qw/@ISA $config_dir $_log_window_size/;
|
use vars qw/@ISA $config_dir $_log_window_size/;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
my ($can_do_switch, %ignored_err, $RA);
|
my ($ra_invalid, $can_do_switch, %ignored_err, $RA);
|
||||||
|
|
||||||
BEGIN {
|
BEGIN {
|
||||||
# enforce temporary pool usage for some simple functions
|
# enforce temporary pool usage for some simple functions
|
||||||
@ -3174,7 +3174,11 @@ sub gs_do_switch {
|
|||||||
$self->{url} = $full_url;
|
$self->{url} = $full_url;
|
||||||
$reparented = 1;
|
$reparented = 1;
|
||||||
} else {
|
} else {
|
||||||
|
$_[0] = undef;
|
||||||
|
$self = undef;
|
||||||
|
$RA = undef;
|
||||||
$ra = Git::SVN::Ra->new($full_url);
|
$ra = Git::SVN::Ra->new($full_url);
|
||||||
|
$ra_invalid = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$ra ||= $self;
|
$ra ||= $self;
|
||||||
@ -3234,6 +3238,7 @@ sub gs_fetch_loop_common {
|
|||||||
my $inc = $_log_window_size;
|
my $inc = $_log_window_size;
|
||||||
my ($min, $max) = ($base, $head < $base + $inc ? $head : $base + $inc);
|
my ($min, $max) = ($base, $head < $base + $inc ? $head : $base + $inc);
|
||||||
my $longest_path = longest_common_path($gsv, $globs);
|
my $longest_path = longest_common_path($gsv, $globs);
|
||||||
|
my $ra_url = $self->{url};
|
||||||
while (1) {
|
while (1) {
|
||||||
my %revs;
|
my %revs;
|
||||||
my $err;
|
my $err;
|
||||||
@ -3295,6 +3300,13 @@ sub gs_fetch_loop_common {
|
|||||||
"$g->{t}-maxRev";
|
"$g->{t}-maxRev";
|
||||||
Git::SVN::tmp_config($k, $r);
|
Git::SVN::tmp_config($k, $r);
|
||||||
}
|
}
|
||||||
|
if ($ra_invalid) {
|
||||||
|
$_[0] = undef;
|
||||||
|
$self = undef;
|
||||||
|
$RA = undef;
|
||||||
|
$self = Git::SVN::Ra->new($ra_url);
|
||||||
|
$ra_invalid = undef;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
# pre-fill the .rev_db since it'll eventually get filled in
|
# pre-fill the .rev_db since it'll eventually get filled in
|
||||||
# with '0' x40 if something new gets committed
|
# with '0' x40 if something new gets committed
|
||||||
|
Loading…
Reference in New Issue
Block a user