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>
This commit is contained in:

committed by
Eric Wong

parent
82009f3048
commit
280ad88aa0
@ -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 {
|
||||
# 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#^/##;
|
||||
|
Reference in New Issue
Block a user