Re: [PATCH] git-svn: doublecheck if really file or dir

Subsystems: the rest

2 messages, 2 authors, 2016-06-15 · open the first message on its own page

Re: [PATCH] git-svn: doublecheck if really file or dir

From: Andrej Manduch <hidden>
Date: 2016-06-15 23:02:07

On 08/03/2014 02:22 PM, Andrej Manduch wrote:
quoted hunk
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:
quoted
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 [off-list ref]
Signed-off-by: Eric Wong <redacted>
---
 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 <redacted>
---
 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"
>>  	'
>>

Re: [PATCH] git-svn: doublecheck if really file or dir

From: Eric Wong <hidden>
Date: 2016-06-15 23:02:07

Andrej Manduch [off-list ref] wrote:
On 08/03/2014 02:22 PM, Andrej Manduch wrote:
quoted
Nice touch, It works like charm. However unfortunatelly now I think you
introduced new bug :)
Good catch!
quoted
On 08/03/2014 04:45 AM, Eric Wong wrote:
quoted
 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:
Actualy this will be even better:
Thanks Andrej.  I'll queue that on top of mine.
Can you turn that into a proper commit message with Subject?
Thanks.
(The English-generating part of my brain is too tired)
quoted hunk
Signed-off-by: Andrej Manduch <redacted>
--- 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 {
Because this will have not problem with really weird query like: "git
svn info /media/../media/something//src"
I've also started working on the following test cases,
will squash:
diff --git a/t/t9119-git-svn-info.sh b/t/t9119-git-svn-info.sh
index 4f6e669..f16f323 100755
--- a/t/t9119-git-svn-info.sh
+++ b/t/t9119-git-svn-info.sh
@@ -84,6 +84,26 @@ test_expect_success 'info $(pwd)' '
 	     "$(sed -ne \"/^Path:/ s!/gitwc!!\" <actual.info-pwd)"
 	'
 
+test_expect_success 'info $(pwd)/../___wc' '
+	(cd svnwc; svn info "$(pwd)/../svnwc") >expected.info-pwd &&
+	(cd gitwc; git svn info "$(pwd)/../gitwc") >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 $(pwd)/../___wc//file' '
+	(cd svnwc; svn info "$(pwd)/../svnwc//file") >expected.info-pwd &&
+	(cd gitwc; git svn info "$(pwd)/../gitwc//file") >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"
 	'
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help