Skip to contentSkip to conversation

git-svn: improve repository URL matching when following parents

PATCH In review Eric Wong 1 participant 2 messages Jun 15, 2016

lore
Share & tools
lore

Eric Wong

author
#0 lore raw

PATCH 1/1 git-svn: improve repository URL matching when following parents

Warning! This patch isn't heavily-tested against remote servers, it only helped me limp by on a server I was having trouble with tonight. I was barely awake when working on this and have been living in a different timezone for more than a week, so don't trust it too much unless you're already having difficulty with some servers.

This way we can avoid the spawning of a new SVN::Ra session by reusing the existing one.

The most problematic issue is that some svn servers disallow too many connections from a single IP, so this will allow git-svn to fetch from those repositories with a higher success rate by using fewer connections.

This sometimes showed up as a new (and redundant) [svn-remote "$parent_refname"] entry in $GIT_DIR/svn/.metadata.

---

Note: there are still cases where git-svn can open more than one connection to the SVN server, which can make some SVN setups/administrators unhappy. Unfortunately, I'm pretty sure I won't have time to properly fix all of these in the next few days.

For now, if you get "connection closed unexpectedly" messages while fetching (and following parents), just restart git-svn and it'll pick up where it left off.

 git-svn.perl |    7 ++++++-
 1 files changed, 6 insertions(+), 1 deletions(-)
git-svn.perl +6 -1
index 75e97cc..7ba8c8f 100755
@@ -2226,7 +2226,12 @@ sub find_parent_branch {
 		# just grow a tail if we're not unique enough :x
 		$ref_id .= '-' while find_ref($ref_id);
 		print STDERR "Initializing parent: $ref_id\n";
-		$gs = Git::SVN->init($new_url, '', $ref_id, $ref_id, 1);
+		my ($u, $p) = ($new_url, '');
+		if ($u =~ s#^\Q$url\E(/|$)##) {
+			$p = $u;
+			$u = $url;
+		}
+		$gs = Git::SVN->init($u, $p, $self->{repo_id}, $ref_id, 1);
 	}
 	my ($r0, $parent) = $gs->find_rev_before($r, 1);
 	if (!defined $r0 || !defined $parent) {
Signature · 1 line
Eric Wong
author
#1 lore raw
Quoted 6 lines · Eric Wong

Warning! This patch isn't heavily-tested against remote servers, it only helped me limp by on a server I was having trouble with tonight. I was barely awake when working on this and have been living in a different timezone for more than a week, so don't trust it too much unless you're already having difficulty with some servers.

Warning lifted, please apply to master.

Quoted 11 lines

This way we can avoid the spawning of a new SVN::Ra session by reusing the existing one.

The most problematic issue is that some svn servers disallow too many connections from a single IP, so this will allow git-svn to fetch from those repositories with a higher success rate by using fewer connections.

This sometimes showed up as a new (and redundant) [svn-remote "$parent_refname"] entry in $GIT_DIR/svn/.metadata.

Quoted 8 lines

---

Note: there are still cases where git-svn can open more than one connection to the SVN server, which can make some SVN setups/administrators unhappy. Unfortunately, I'm pretty sure I won't have time to properly fix all of these in the next few days.

It may be a while before I have time to fix this. If anybody else is willing to step up, please do.

Some notes:

Most of this is related to svn:// (and possibly svn+ssh://) sessions, and definitely doesn't apply to file:// servers.

I couldn't find an explicit way to close the socket using the SVN API. However, the socket does seem to get closed when the refcount of the SVN::Ra object hits zero.

It seems only one SVN::Ra can be active at a time. Even though it's possible to hold multiple sockets open to an SVN server within the same process (with svn://), the SVN library code doesn't work well with multiple sessions active.

Quoted 25 lines

For now, if you get "connection closed unexpectedly" messages while fetching (and following parents), just restart git-svn and it'll pick up where it left off.

 git-svn.perl |    7 ++++++-
 1 files changed, 6 insertions(+), 1 deletions(-)
git-svn.perl +6 -1
index 75e97cc..7ba8c8f 100755
@@ -2226,7 +2226,12 @@ sub find_parent_branch {
 		# just grow a tail if we're not unique enough :x
 		$ref_id .= '-' while find_ref($ref_id);
 		print STDERR "Initializing parent: $ref_id\n";
-		$gs = Git::SVN->init($new_url, '', $ref_id, $ref_id, 1);
+		my ($u, $p) = ($new_url, '');
+		if ($u =~ s#^\Q$url\E(/|$)##) {
+			$p = $u;
+			$u = $url;
+		}
+		$gs = Git::SVN->init($u, $p, $self->{repo_id}, $ref_id, 1);
 	}
 	my ($r0, $parent) = $gs->find_rev_before($r, 1);
 	if (!defined $r0 || !defined $parent) {
Signature · 1 line
Eric Wong