Subversion's svn_dirent_canonicalize() and svn_path_canonicalize()
APIs keep a leading slash in the return value if one was present on
the argument, which can be useful since it allows relative and
absolute paths to be distinguished.

When git-svn's canonicalize_path() learned to use these functions if
available, its semantics changed in the corresponding way.  Some new
callers rely on the leading slash --- for example, if the slash is
stripped out then _canonicalize_url_ourselves() will transform
"proto://host/path/to/resource" to "proto://hostpath/to/resource".

Unfortunately the fallback _canonicalize_path_ourselves(), used when
the appropriate SVN APIs are not usable, still follows the old
semantics, so if that code path is exercised then it breaks.  Fix it
to follow the new convention.

Noticed by forcing the fallback on and running tests.  Without this
patch, t9101.4 fails:

 Bad URL passed to RA layer: Unable to open an ra_local session to \
 URL: Local URL 'file://homejrnsrcgit-scratch/t/trash%20directory.\
 t9101-git-svn-props/svnrepo' contains unsupported hostname at \
 /home/jrn/src/git-scratch/perl/blib/lib/Git/ line 148

With it, the git-svn tests pass again.

Signed-off-by: Jonathan Nieder <>
Hi Eric,

Michael G Schwern wrote:
> On 2012.7.28 6:55 AM, Jonathan Nieder wrote:

>> When would this "else" case trip?
> When svn_path_canonicalize() does not exist in the SVN API, presumably because
> their SVN is too old.

I accidentally tested this "else" branch by making the other cases
false.  t9101.4 failed as described above, or in other words,
canonicalize_url_ourselves() stripped out a few too many slashes.  For

| sub _canonicalize_url_ourselves {
|         my ($url) = @_;
|         if ($url =~ m#^([^:]+)://([^/]*)(.*)$#) {
|                 my ($scheme, $domain, $uri) = ($1, $2, 
|                 $url = "$scheme://$domain$uri";
|         }
|         $url;
| }

When $url is http://host/path/to/resource,

        $1 = "http", $2 = "host", $3 = "/path/to/resource"
        canonicalize_path($3) = "path/to/resource" <--- (??)
        _canonicalize_url_path(ditto) = "path/to/resource"
        $url = "http://hostpath/to/resource";

How about this patch?

 perl/Git/SVN/ |    1 -
 1 file changed, 1 deletion(-)

diff --git a/perl/Git/SVN/ b/perl/Git/SVN/
index 4bb4dde8..8b8cf375 100644
--- a/perl/Git/SVN/
+++ b/perl/Git/SVN/
@@ -122,7 +122,6 @@ sub _canonicalize_path_ourselves {
        $path = _collapse_dotdot($path);
        $path =~ s#/$##g;
        $path =~ s#^\./## if $dot_slash_added;
-       $path =~ s#^/##;
        $path =~ s#^\.$##;
        return $path;

To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to
More majordomo info at

Reply via email to