-sub revisions_eq {
- my ($path, $r0, $r1) = @_;
- return 1 if $r0 == $r1;
- my $nr = 0;
- # should be OK to use Pool here (r1 - r0) should be small
- $SVN->get_log([$path], $r0, $r1, 0, 0, 1, sub {$nr++});
- return 0 if ($nr > 1);
- return 1;
-}
-
-sub libsvn_find_parent_branch {
- my ($paths, $rev, $author, $date, $log) = @_;
- my $svn_path = '/'.$SVN->{svn_path};
-
- # look for a parent from another branch:
- my $i = $paths->{$svn_path} or return;
- my $branch_from = $i->copyfrom_path or return;
- my $r = $i->copyfrom_rev;
- print STDERR "Found possible branch point: ",
- "$branch_from => $svn_path, $r\n";
- $branch_from =~ s#^/##;
- my $l_map = {};
- read_url_paths_all($l_map, '', "$GIT_DIR/svn");
- my $url = $SVN->{repos_root};
- defined $l_map->{$url} or return;
- my $id = $l_map->{$url}->{$branch_from};
- if (!defined $id && $_follow_parent) {
- print STDERR "Following parent: $branch_from\@$r\n";
- # auto create a new branch and follow it
- $id = basename($branch_from);
- $id .= '@'.$r if -r "$GIT_DIR/svn/$id";
- while (-r "$GIT_DIR/svn/$id") {
- # just grow a tail if we're not unique enough :x
- $id .= '-';
- }
- }
- return unless defined $id;
-
- my ($r0, $parent) = find_rev_before($r,$id,1);
- if ($_follow_parent && (!defined $r0 || !defined $parent)) {
- defined(my $pid = fork) or croak $!;
- if (!$pid) {
- $GIT_SVN = $ENV{GIT_SVN_ID} = $id;
- init_vars();
- $SVN_URL = "$url/$branch_from";
- $SVN = undef;
- setup_git_svn();
- # we can't assume SVN_URL exists at r+1:
- $_revision = "0:$r";
- fetch_lib();
- exit 0;
- }
- waitpid $pid, 0;
- croak $? if $?;
- ($r0, $parent) = find_rev_before($r,$id,1);
- }
- return unless (defined $r0 && defined $parent);
- if (revisions_eq($branch_from, $r0, $r)) {
- unlink $GIT_SVN_INDEX;
- print STDERR "Found branch parent: ($GIT_SVN) $parent\n";
- command_noisy('read-tree', $parent);
- unless ($SVN->can_do_switch) {
- return _libsvn_new_tree($paths, $rev, $author, $date,
- $log, [$parent]);
- }
- # do_switch works with svn/trunk >= r22312, but that is not
- # included with SVN 1.4.2 (the latest version at the moment),
- # so we can't rely on it.
- my $ra = Git::SVN::Ra->new("$url/$branch_from");
- my $ed = SVN::Git::Fetcher->new({c => $parent, q => $_q });
- $ra->gs_do_switch($r0, $rev, '', 1, $SVN->{url}, $ed) or
- die "SVN connection failed somewhere...\n";
- return libsvn_log_entry($rev, $author, $date, $log, [$parent]);
- }
- print STDERR "Nope, branch point not imported or unknown\n";
- return undef;
-}
-
-sub _libsvn_new_tree {
- my ($paths, $rev, $author, $date, $log, $parents) = @_;
- my $ed = SVN::Git::Fetcher->new({q => $_q});
- unless ($SVN->gs_do_update($rev, $rev, '', 1, $ed)) {
- die "SVN connection failed somewhere...\n";
- }
- libsvn_log_entry($rev, $author, $date, $log, $parents, $ed);
-}
-