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

Re: [PATCH] Don't try and percent-escape existing percent escapes in git-svn URIs

From
Kevin Ballard <kevin@sb.org>
Date
Mar 9, 2008, 12:29 UTC
Message-ID
<0FE6BDE6-961E-4671-B9EC-EFA25389DF54@sb.org>
In-Reply-To
<20080309091240.GA17484@mayonaise>
On Mar 9, 2008, at 5:12 AM, Eric Wong wrote:
Show 8 quoted lines
> Kevin Ballard <kevin@sb.org> wrote:
>> git-svn: project names are percent-escaped ever since f5530b.
>> Unfortunately this breaks the scenario where the user hands git-svn
>> an already-escaped URI. Fix the regexp to skip over what looks like
>> existing percent escapes, and test this scenario.
>
> What happens when something that _looks_ like a percent escape is
> actually a part of the URL and not really an escape?

Have you ever seen a URL like that? I haven't. However, what is fairly common is for URLs to contain spaces, and such URLs are always stored already-escaped.

The standard situation that triggers this issue is pulling a URL from `svn info`. Such a URL is already escaped, which means you can't feed it into `git svn clone` directly, you have to de-escape it first. This is a problem. Here's an example:

http://macromates.com/svn/Bundles/trunk/Bundles/Ruby%20on%20Rails.tmbundle
I tried cloning that and it failed, because it turned that into
http://macromates.com/svn/Bundles/trunk/Bundles/Ruby%2520on%2520Rails.tmbundle

However, my friend who was still on v1.5.3.7 cloned that no problem, since that was before the escaping code.

-Kevin
Show 68 quoted lines
>
>> Signed-off-by: Kevin Ballard <kevin@sb.org>
>> ---
>> git-svn.perl                                  |    2 +-
>> t/t9120-git-svn-clone-with-percent-escapes.sh |   31 +++++++++++++++ 
>> ++++++++++
>> 2 files changed, 32 insertions(+), 1 deletions(-)
>> create mode 100755 t/t9120-git-svn-clone-with-percent-escapes.sh
>>
>> diff --git a/git-svn.perl b/git-svn.perl
>> index 9e2faf9..cec664f 100755
>> --- a/git-svn.perl
>> +++ b/git-svn.perl
>> @@ -3658,7 +3658,7 @@ sub escape_uri_only {
>> 	my ($uri) = @_;
>> 	my @tmp;
>> 	foreach (split m{/}, $uri) {
>> -		s/([^\w.-])/sprintf("%%%02X",ord($1))/eg;
>> +		s/([^\w.%-]|%(?![a-fA-F0-9]{2}))/sprintf("%%%02X",ord($1))/eg;
>> 		push @tmp, $_;
>> 	}
>> 	join('/', @tmp);
>> diff --git a/t/t9120-git-svn-clone-with-percent-escapes.sh b/t/ 
>> t9120-git-svn-clone-with-percent-escapes.sh
>> new file mode 100755
>> index 0000000..9a4eabe
>> --- /dev/null
>> +++ b/t/t9120-git-svn-clone-with-percent-escapes.sh
>> @@ -0,0 +1,31 @@
>> +#!/bin/sh
>> +#
>> +# Copyright (c) 2008 Kevin Ballard
>> +#
>> +
>> +test_description='git-svn clone with percent escapes'
>> +. ./lib-git-svn.sh
>> +
>> +test_expect_success 'setup svnrepo' "
>> +	mkdir project project/trunk project/branches project/tags &&
>> +	echo foo > project/trunk/foo &&
>> +	svn import -m '$test_description' project '$svnrepo/pr ject' &&
>> +	rm -rf project &&
>> +	start_httpd
>> +"
>> +
>> +if test "$SVN_HTTPD_PORT" = ""
>> +then
>> +	test_expect_failure 'test clone with percent escapes - needs  
>> SVN_HTTPD_PORT set' 'false'
>> +else
>> +	test_expect_success 'test clone with percent escapes' '
>> +		git svn clone "$svnrepo/pr%20ject" clone &&
>> +		cd clone &&
>> +			git rev-parse refs/remotes/git-svn &&
>> +		cd ..
>> +	'
>> +fi
>> +
>> +stop_httpd
>> +
>> +test_done
>> -- 
>> 1.5.4.3.487.g1eab2.dirty
>>
>
> -- 
> Eric Wong
>
-- 
Kevin Ballard
http://kevin.sb.org
kevin@sb.org
http://www.tildesoft.com
Previous: Eric WongNext: Eric Wong
Message 3 of 4 in “Don't try and percent-escape existing percent escapes in git-svn URIs”
  1. Don't try and percent-escape existing percent escapes in git-svn URIsKevin Ballard, Mar 8, 2008
  2. Eric WongMar 9, 2008
  3. Kevin BallardMar 9, 2008
  4. Eric WongMar 10, 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.