Skip to content

Commit b8fee3a

Browse files
Eric Wonggitster
authored andcommitted
git-svn: fix ls-tree usage with dash-prefixed paths
To find the blob object name given a tree and pathname, we were incorrectly calling "git ls-tree" with a "--" argument followed by the pathname of the file we wanted to get. git ls-tree <TREE> -- --dashed/path/name.c Unlike many command-line interfaces, the "--" alone does not symbolize the end of non-option arguments on the command-line. ls-tree interprets the "--" as a prefix to match against, thus the entire contents of the --dashed/* hierarchy would be returned because the "--" matches "--dashed" and every path under it. Thanks to Anton Gyllenberg for pointing me toward the Twisted repository as a real-world example of this case. Signed-off-by: Eric Wong <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 9d51564 commit b8fee3a

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

git-svn.perl

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3384,15 +3384,18 @@ sub delete_entry {
33843384
return undef if ($gpath eq '');
33853385

33863386
# remove entire directories.
3387-
if (command('ls-tree', $self->{c}, '--', $gpath) =~ /^040000 tree/) {
3387+
my ($tree) = (command('ls-tree', '-z', $self->{c}, "./$gpath")
3388+
=~ /\A040000 tree ([a-f\d]{40})\t\Q$gpath\E\0/);
3389+
if ($tree) {
33883390
my ($ls, $ctx) = command_output_pipe(qw/ls-tree
33893391
-r --name-only -z/,
3390-
$self->{c}, '--', $gpath);
3392+
$tree);
33913393
local $/ = "\0";
33923394
while (<$ls>) {
33933395
chomp;
3394-
$self->{gii}->remove($_);
3395-
print "\tD\t$_\n" unless $::_q;
3396+
my $rmpath = "$gpath/$_";
3397+
$self->{gii}->remove($rmpath);
3398+
print "\tD\t$rmpath\n" unless $::_q;
33963399
}
33973400
print "\tD\t$gpath/\n" unless $::_q;
33983401
command_close_pipe($ls, $ctx);
@@ -3411,8 +3414,8 @@ sub open_file {
34113414
goto out if is_path_ignored($path);
34123415

34133416
my $gpath = $self->git_path($path);
3414-
($mode, $blob) = (command('ls-tree', $self->{c}, '--', $gpath)
3415-
=~ /^(\d{6}) blob ([a-f\d]{40})\t/);
3417+
($mode, $blob) = (command('ls-tree', '-z', $self->{c}, "./$gpath")
3418+
=~ /\A(\d{6}) blob ([a-f\d]{40})\t\Q$gpath\E\0/);
34163419
unless (defined $mode && defined $blob) {
34173420
die "$path was not found in commit $self->{c} (r$rev)\n";
34183421
}

0 commit comments

Comments
 (0)