All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrej Manduch <amanduch@gmail.com>
To: unlisted-recipients:; (no To-header on input)
Cc: git@vger.kernel.org
Subject: Re: [PATCH] git-svn: doublecheck if really file or dir
Date: Sun, 03 Aug 2014 15:12:10 +0200	[thread overview]
Message-ID: <53DE352A.5050505@gmail.com> (raw)
In-Reply-To: <53DE31E8.3070405@gmail.com>

On 08/03/2014 02:22 PM, Andrej Manduch wrote:
> Hi Eric,
> 
> Nice touch, It works like charm. However unfortunatelly now I think you
> introduced new bug :)
> 
> On 08/03/2014 04:45 AM, Eric Wong wrote:
>> Hi Andrej, I could not help thinking your patch was obscuring
>> another bug.  I think I have an alternative to your patch which
>> fixes both our bugs.  Can you give this a shot?  Thanks.
>>
>> --------------------------- 8< ----------------------------
>> Subject: [PATCH] git svn: info: correctly handle absolute path args
>>
>> Calling "git svn info $(pwd)" would hit:
>>   "Reading from filehandle failed at ..."
>> errors due to improper prefixing and canonicalization.
>>
>> Strip the toplevel path from absolute filesystem paths to ensure
>> downstream canonicalization routines are only exposed to paths
>> tracked in git (or SVN).
>>
>> Noticed-by: Andrej Manduch <amanduch@gmail.com>
>> Signed-off-by: Eric Wong <normalperson@yhbt.net>
>> ---
>>  git-svn.perl            | 21 +++++++++++++++------
>>  t/t9119-git-svn-info.sh | 10 ++++++++++
>>  2 files changed, 25 insertions(+), 6 deletions(-)
>>
>> diff --git a/git-svn.perl b/git-svn.perl
>> index 1f41ee1..1f9582b 100755
>> --- a/git-svn.perl
>> +++ b/git-svn.perl
>> @@ -1477,10 +1477,19 @@ sub cmd_commit_diff {
>>  	}
>>  }
>>  
>> -
>>  sub cmd_info {
>> -	my $path = canonicalize_path(defined($_[0]) ? $_[0] : ".");
>> -	my $fullpath = canonicalize_path($cmd_dir_prefix . $path);
>> +	my $path_arg = defined($_[0]) ? $_[0] : '.';
>> +	my $path = $path_arg;
>> +	if ($path =~ m!\A/!) {
>> +		my $toplevel = eval {
>> +			my @cmd = qw/rev-parse --show-toplevel/;
>> +			command_oneline(\@cmd, STDERR => 0);
>> +		};
>> +		$path =~ s!\A\Q$toplevel\E/?!!;
> I have problem with this line ^^^
> 
> Suppose your $toplevel is "/sometning" and you type in command line
> something like that: "git svn info /somethingsrc" and as you see this
> should end up with error. However "$path =~ s!\A\Q$toplevel\E/?!!;"
> will just cut "/sometning" from "/somethingsrc" and and up with same
> answer as for "svn git info src" which is not equivalent query.
> 
> Second scenario is something which worries me more: If your query look
> like this: "git svn info /something//src" it will just end up with error
> because it will set $path to "/src" witch is outside of repository.
> 
> Second scenario can be fixed with this:
> 
> diff --git a/git-svn.perl b/git-svn.perl
> index a69f0fc..00f9d01 100755
> --- a/git-svn.perl
> +++ b/git-svn.perl
> @@ -1483,7 +1483,7 @@ sub cmd_info {
>  			my @cmd = qw/rev-parse --show-toplevel/;
>  			command_oneline(\@cmd, STDERR => 0);
>  		};
> -		$path =~ s!\A\Q$toplevel\E/?!!;
> +		$path =~ s!\A\Q$toplevel\E/*!!;
>  		$path = canonicalize_path($path);
>  	} else {
>  		$path = canonicalize_path($cmd_dir_prefix . $path);
> 

Actualy this will be even better:


Signed-off-by: Andrej Manduch <amanduch@gmail.com>
---
 git-svn.perl | 1 +
 1 file changed, 1 insertion(+)

diff --git a/git-svn.perl b/git-svn.perl
index a69f0fc..58df866 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -1483,6 +1483,7 @@ sub cmd_info {
 			my @cmd = qw/rev-parse --show-toplevel/;
 			command_oneline(\@cmd, STDERR => 0);
 		};
+		$path = canonicalize_path($path);
 		$path =~ s!\A\Q$toplevel\E/?!!;
 		$path = canonicalize_path($path);
 	} else {
-- 
2.0.0.GIT

Because this will have not problem with really weird query like: "git
svn info /media/../media/something//src"

> 
> However I'm not sure if this will work on windows (where slashes are in
> different orientation).
> 
> 
> On 08/03/2014 04:45 AM, Eric Wong wrote:
>> +		$path = canonicalize_path($path);
>> +	} else {
>> +		$path = canonicalize_path($cmd_dir_prefix . $path);
>> +	}
>>  	if (exists $_[1]) {
>>  		die "Too many arguments specified\n";
>>  	}
>> @@ -1501,14 +1510,14 @@ sub cmd_info {
>>  	# canonicalize_path() will return "" to make libsvn 1.5.x happy,
>>  	$path = "." if $path eq "";
>>  
>> -	my $full_url = canonicalize_url( add_path_to_url( $url, $fullpath ) );
>> +	my $full_url = canonicalize_url( add_path_to_url( $url, $path ) );
>>  
>>  	if ($_url) {
>>  		print "$full_url\n";
>>  		return;
>>  	}
>>  
>> -	my $result = "Path: $path\n";
>> +	my $result = "Path: $path_arg\n";
>>  	$result .= "Name: " . basename($path) . "\n" if $file_type ne "dir";
>>  	$result .= "URL: $full_url\n";
>>  
>> @@ -1539,7 +1548,7 @@ sub cmd_info {
>>  	}
>>  
>>  	my ($lc_author, $lc_rev, $lc_date_utc);
>> -	my @args = Git::SVN::Log::git_svn_log_cmd($rev, $rev, "--", $fullpath);
>> +	my @args = Git::SVN::Log::git_svn_log_cmd($rev, $rev, "--", $path);
>>  	my $log = command_output_pipe(@args);
>>  	my $esc_color = qr/(?:\033\[(?:(?:\d+;)*\d*)?m)*/;
>>  	while (<$log>) {
>> diff --git a/t/t9119-git-svn-info.sh b/t/t9119-git-svn-info.sh
>> index ff19695..4f6e669 100755
>> --- a/t/t9119-git-svn-info.sh
>> +++ b/t/t9119-git-svn-info.sh
>> @@ -74,6 +74,16 @@ test_expect_success 'info .' "
>>  	test_cmp_info expected.info-dot actual.info-dot
>>  	"
>>  
>> +test_expect_success 'info $(pwd)' '
>> +	(cd svnwc; svn info "$(pwd)") >expected.info-pwd &&
>> +	(cd gitwc; git svn info "$(pwd)") >actual.info-pwd &&
>> +	grep -v ^Path: <expected.info-pwd >expected.info-np &&
>> +	grep -v ^Path: <actual.info-pwd >actual.info-np &&
>> +	test_cmp_info expected.info-np actual.info-np &&
>> +	test "$(sed -ne \"/^Path:/ s!/svnwc!!\" <expected.info-pwd)" = \
>> +	     "$(sed -ne \"/^Path:/ s!/gitwc!!\" <actual.info-pwd)"
>> +	'
>> +
>>  test_expect_success 'info --url .' '
>>  	test "$(cd gitwc; git svn info --url .)" = "$quoted_svnrepo"
>>  	'
>>

       reply	other threads:[~2014-08-03 13:12 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <53DE31E8.3070405@gmail.com>
2014-08-03 13:12 ` Andrej Manduch [this message]
2014-08-04  4:02   ` [PATCH] git-svn: doublecheck if really file or dir Eric Wong
2014-07-18  4:20 Andrej Manduch
2014-07-23 22:04 ` Eric Wong
2014-07-27  2:46   ` Andrej Manduch
2014-08-03  2:45     ` Eric Wong
2014-08-03 12:22       ` Andrej Manduch
  -- strict thread matches above, loose matches on Subject: below --
2014-07-18  4:05 Andrej Manduch
2014-07-18  4:22 ` Andrej Manduch

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=53DE352A.5050505@gmail.com \
    --to=amanduch@gmail.com \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.