[PATCH] "git svn clone" fails when tags have illegal url characters in them.
- From
- Jerry 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