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"
>> '
>>