path: root/perl/Git
diff options
authorJonathan Nieder <>2012-10-14 11:45:21 (GMT)
committerEric Wong <>2013-01-17 23:28:12 (GMT)
commit9012f571b46d882dbaed3f31ab59a30d187b2d05 (patch)
treee9eef2b46a759b35334e0fdbb40bd04dc6fda070 /perl/Git
parent47263f5875cc16055e8d5ff3d000f3d41434fcf6 (diff)
git svn: do not overescape URLs (fallback case)
Subversion's canonical URLs are intended to make URL comparison easy and therefore have strict rules about what characters are special enough to urlencode and what characters should be left alone. When in the fallback codepath because unable to use libsvn's own canonicalization function for some reason, escape special characters in URIs according to the svn_uri__char_validity[] table in subversion/libsvn_subr/path.c (r935829). The libsvn versions that trigger this code path are not likely to be strict enough to care, but it's nicer to be consistent. Noticed by using SVN 1.6.17 perl bindings, which do not provide SVN::_Core::svn_uri_canonicalize (triggering the fallback code), with libsvn 1.7.5, whose do_switch is fussy enough to care: Committing to file:///home/jrn/src/git/t/trash%20directory.\ t9118-git-svn-funky-branch-names/svnrepo/pr%20ject/branches\ /more%20fun%20plugin%21 ... svn: E235000: In file '[...]/subversion/libsvn_subr/dirent_uri.c' \ line 2291: assertion failed (svn_uri_is_canonical(url, pool)) error: git-svn died of signal 6 not ok - 3 test dcommit to funky branch After this change, the '!' in 'more%20fun%20plugin!' is not urlencoded and t9118 passes again. Signed-off-by: Jonathan Nieder <> Signed-off-by: Eric Wong <>
Diffstat (limited to 'perl/Git')
1 files changed, 1 insertions, 1 deletions
diff --git a/perl/Git/SVN/ b/perl/Git/SVN/
index 8b8cf37..3d1a093 100644
--- a/perl/Git/SVN/
+++ b/perl/Git/SVN/
@@ -155,7 +155,7 @@ sub _canonicalize_url_path {
my @parts;
foreach my $part (split m{/+}, $uri_path) {
- $part =~ s/([^~\w.%+-]|%(?![a-fA-F0-9]{2}))/sprintf("%%%02X",ord($1))/eg;
+ $part =~ s/([^!\$%&'()*+,.\/\w:=\@_`~-]|%(?![a-fA-F0-9]{2}))/sprintf("%%%02X",ord($1))/eg;
push @parts, $part;