Browse Source

git-svn: factor out _collapse_dotdot function

The SVN API functions will not accept ../foo but their canonicalization
functions will not collapse it.  So we'll have to do it ourselves.

_collapse_dotdot() works better than the existing regex did.

This will be used shortly when canonicalize_path() starts using the
SVN API.

[ew: commit title]

Signed-off-by: Eric Wong <normalperson@yhbt.net>
maint
Michael G. Schwern 12 years ago committed by Eric Wong
parent
commit
280ad88aa0
  1. 14
      perl/Git/SVN/Utils.pm
  2. 23
      t/Git-SVN/Utils/collapse_dotdot.t

14
perl/Git/SVN/Utils.pm

@ -72,6 +72,18 @@ API as a file path. @@ -72,6 +72,18 @@ API as a file path.

=cut

# Turn foo/../bar into bar
sub _collapse_dotdot {
my $path = shift;

1 while $path =~ s{/[^/]+/+\.\.}{};
1 while $path =~ s{[^/]+/+\.\./}{};
1 while $path =~ s{[^/]+/+\.\.}{};

return $path;
}


sub canonicalize_path {
my ($path) = @_;
my $dot_slash_added = 0;
@ -83,7 +95,7 @@ sub canonicalize_path { @@ -83,7 +95,7 @@ sub canonicalize_path {
# good reason), so let's do this manually.
$path =~ s#/+#/#g;
$path =~ s#/\.(?:/|$)#/#g;
$path =~ s#/[^/]+/\.\.##g;
$path = _collapse_dotdot($path);
$path =~ s#/$##g;
$path =~ s#^\./## if $dot_slash_added;
$path =~ s#^/##;

23
t/Git-SVN/Utils/collapse_dotdot.t

@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
#!/usr/bin/env perl

use strict;
use warnings;

use Test::More 'no_plan';

use Git::SVN::Utils;
my $collapse_dotdot = \&Git::SVN::Utils::_collapse_dotdot;

my %tests = (
"foo/bar/baz" => "foo/bar/baz",
".." => "..",
"foo/.." => "",
"/foo/bar/../../baz" => "/baz",
"deeply/.././deeply/nested" => "./deeply/nested",
);

for my $arg (keys %tests) {
my $want = $tests{$arg};

is $collapse_dotdot->($arg), $want, "_collapse_dotdot('$arg') => $want";
}
Loading…
Cancel
Save