aboutsummaryrefslogtreecommitdiff
path: root/git-svn.perl
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2007-11-11 23:37:42 -0800
committerJunio C Hamano <gitster@pobox.com>2008-01-07 15:18:37 -0800
commitf5530b8833bcaa423cd53d133d3de3fa0173fbf3 (patch)
tree9a62fed470b1b8f28cc5e8eb76023562e3532f4c /git-svn.perl
parent4f3d37035a7c735a3b69f962656819f4ff7e4927 (diff)
downloadgit-f5530b8833bcaa423cd53d133d3de3fa0173fbf3.tar.gz
git-f5530b8833bcaa423cd53d133d3de3fa0173fbf3.tar.xz
git-svn: support for funky branch and project names over HTTP(S)
SVN requires that paths be URI-escaped for HTTP(S) repositories. file:// and svn:// repositories do not need these rules. Additionally, accessing individual paths inside repositories (check_path() and get_log() do NOT require escapes to function and in fact it breaks things). Noticed-by: Michael J. Cohen <mjc@cruiseplanners.com> Signed-off-by: Eric Wong <normalperson@yhbt.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'git-svn.perl')
-rwxr-xr-xgit-svn.perl24
1 files changed, 22 insertions, 2 deletions
diff --git a/git-svn.perl b/git-svn.perl
index 4c779b6c6..858c5be10 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -3068,6 +3068,25 @@ BEGIN {
}
}
+sub escape_uri_only {
+ my ($uri) = @_;
+ my @tmp;
+ foreach (split m{/}, $uri) {
+ s/([^\w.-])/sprintf("%%%02X",ord($1))/eg;
+ push @tmp, $_;
+ }
+ join('/', @tmp);
+}
+
+sub escape_url {
+ my ($url) = @_;
+ if ($url =~ m#^(https?)://([^/]+)(.*)$#) {
+ my ($scheme, $domain, $uri) = ($1, $2, escape_uri_only($3));
+ $url = "$scheme://$domain$uri";
+ }
+ $url;
+}
+
sub new {
my ($class, $url) = @_;
$url =~ s!/+$!!;
@@ -3092,10 +3111,11 @@ sub new {
]);
my $config = SVN::Core::config_get_config($config_dir);
$RA = undef;
- my $self = SVN::Ra->new(url => $url, auth => $baton,
+ my $self = SVN::Ra->new(url => escape_url($url), auth => $baton,
config => $config,
pool => SVN::Pool->new,
auth_provider_callbacks => $callbacks);
+ $self->{url} = $url;
$self->{svn_path} = $url;
$self->{repos_root} = $self->get_repos_root;
$self->{svn_path} =~ s#^\Q$self->{repos_root}\E(/|$)##;
@@ -3203,7 +3223,7 @@ sub gs_do_switch {
my $full_url = $self->{url};
my $old_url = $full_url;
- $full_url .= "/$path" if length $path;
+ $full_url .= '/' . escape_uri_only($path) if length $path;
my ($ra, $reparented);
if ($old_url ne $full_url) {
if ($old_url !~ m#^svn(\+ssh)?://#) {