git-svn: use do_switch for --follow-parent if the SVN library supports it

do_switch works with the SVN Perl bindings after r22312 in the
Subversion trunk.  Since no released version of SVN currently
supports it; we'll just autodetect it and enable its usage
when a user has a recent-enough version of SVN.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Eric Wong 2006-12-08 02:20:17 -08:00 committed by Junio C Hamano
parent bbee1d971d
commit a552db3a64

View File

@ -72,7 +72,7 @@ my ($_revision,$_stdin,$_no_ignore_ext,$_no_stop_copy,$_help,$_rmdir,$_edit,
$_username, $_config_dir, $_no_auth_cache, $_xfer_delta, $_username, $_config_dir, $_no_auth_cache, $_xfer_delta,
$_pager, $_color); $_pager, $_color);
my (@_branch_from, %tree_map, %users, %rusers, %equiv); my (@_branch_from, %tree_map, %users, %rusers, %equiv);
my ($_svn_co_url_revs, $_svn_pg_peg_revs); my ($_svn_co_url_revs, $_svn_pg_peg_revs, $_svn_can_do_switch);
my @repo_path_split_cache; my @repo_path_split_cache;
my %fc_opts = ( 'no-ignore-externals' => \$_no_ignore_ext, my %fc_opts = ( 'no-ignore-externals' => \$_no_ignore_ext,
@ -2877,6 +2877,24 @@ sub libsvn_connect {
return $ra; return $ra;
} }
sub libsvn_can_do_switch {
unless (defined $_svn_can_do_switch) {
my $pool = SVN::Pool->new;
my $rep = eval {
$SVN->do_switch(1, '', 0, $SVN->{url},
SVN::Delta::Editor->new, $pool);
};
if ($@) {
$_svn_can_do_switch = 0;
} else {
$rep->abort_report($pool);
$_svn_can_do_switch = 1;
}
$pool->clear;
}
$_svn_can_do_switch;
}
sub libsvn_dup_ra { sub libsvn_dup_ra {
my ($ra) = @_; my ($ra) = @_;
SVN::Ra->new(map { $_ => $ra->{$_} } qw/config url SVN::Ra->new(map { $_ => $ra->{$_} } qw/config url
@ -3198,12 +3216,26 @@ sub libsvn_find_parent_branch {
unlink $GIT_SVN_INDEX; unlink $GIT_SVN_INDEX;
print STDERR "Found branch parent: ($GIT_SVN) $parent\n"; print STDERR "Found branch parent: ($GIT_SVN) $parent\n";
sys(qw/git-read-tree/, $parent); sys(qw/git-read-tree/, $parent);
# I can't seem to get do_switch() to work correctly with unless (libsvn_can_do_switch()) {
# the SWIG interface (TypeError when passing switch_url...), return libsvn_fetch_full($parent, $paths, $rev,
# so we'll unconditionally bypass the delta interface here $author, $date, $msg);
# for now }
return libsvn_fetch_full($parent, $paths, $rev, # do_switch works with svn/trunk >= r22312, but that is not
$author, $date, $msg); # included with SVN 1.4.2 (the latest version at the moment),
# so we can't rely on it.
my $ra = libsvn_connect("$url/$branch_from");
my $ed = SVN::Git::Fetcher->new({c => $parent, q => $_q});
my $pool = SVN::Pool->new;
my $reporter = $ra->do_switch($rev, '', 1, $SVN->{url},
$ed, $pool);
my @lock = $SVN::Core::VERSION ge '1.2.0' ? (undef) : ();
$reporter->set_path('', $r0, 0, @lock, $pool);
$reporter->finish_report($pool);
$pool->clear;
unless ($ed->{git_commit_ok}) {
die "SVN connection failed somewhere...\n";
}
return libsvn_log_entry($rev, $author, $date, $msg, [$parent]);
} }
print STDERR "Nope, branch point not imported or unknown\n"; print STDERR "Nope, branch point not imported or unknown\n";
return undef; return undef;