git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andrej Manduch <amanduch@gmail.com>
To: Eric Wong <normalperson@yhbt.net>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] git-svn: doublecheck if really file or dir
Date: Sun, 03 Aug 2014 14:22:34 +0200	[thread overview]
Message-ID: <53DE298A.9090505@gmail.com> (raw)
In-Reply-To: <20140803024520.GA12880@dcvr.yhbt.net>

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);


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 12:23 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-18  4:20 [PATCH] git-svn: doublecheck if really file or dir 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 [this message]
     [not found] <53DE31E8.3070405@gmail.com>
2014-08-03 13:12 ` Andrej Manduch
2014-08-04  4:02   ` Eric Wong
  -- 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=53DE298A.9090505@gmail.com \
    --to=amanduch@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=normalperson@yhbt.net \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).