git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] "git svn clone" fails when tags have illegal url characters in them.

From
JSJerry Seutter <jseutter@gmail.com>
Date
Dec 12, 2008, 22:46 UTC
Message-ID
<2c8d48d70812121446m7539a054p86588488d77302f4@mail.gmail.com>

Found a repository with a tag that had a hash (#) mark in the tag name. The svn repository was available via WebDAV. "git svn clone <url>" would generate an invalid url when trying to fetch the tag, causing a server 400 result on the other end of the connection.

The fix is to escape the url correctly. This is a quick and dirty hack that copies two functions from earlier in the file - only the last line modified in the commit is important.

Signed-off-by: Jerry Seutter <jseutter@gmail.com>
---
 git-svn.perl |   21 ++++++++++++++++++++-
 1 files changed, 20 insertions(+), 1 deletions(-)
diff --git a/git-svn.perl b/git-svn.perl
index 2c206e9..6b9e010 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -2213,9 +2213,28 @@ sub metadata_url {
 	   (length $self->{path} ? '/' . $self->{path} : '');
 }

+sub junk_escape_uri_only {
+	my ($uri) = @_;
+	my @tmp;
+	foreach (split m{/}, $uri) {
+		s/([^~\w.%+-]|%(?![a-fA-F0-9]{2}))/sprintf("%%%02X",ord($1))/eg;
+		push @tmp, $_;
+	}
+	join('/', @tmp);
+}
+
+sub junk_escape_url {
+	my ($url) = @_;
+	if ($url =~ m#^([^:]+)://([^/]*)(.*)$#) {
+		my ($scheme, $domain, $uri) = ($1, $2, junk_escape_uri_only($3));
+		$url = "$scheme://$domain$uri";
+	}
+	$url;
+}
+
 sub full_url {
 	my ($self) = @_;
-	$self->{url} . (length $self->{path} ? '/' . $self->{path} : '');
+	junk_escape_url($self->{url} . (length $self->{path} ? '/' .
$self->{path} : ''));
 }
-- 
1.6.1.rc2.20.gde0d.dirty
Message 1 of 1 in “"git svn clone" fails when tags have illegal url characters in them.”
  1. "git svn clone" fails when tags have illegal url characters in them.Jerry Seutter, Dec 12, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.