git-svn: add join_paths() to safely concatenate paths
Otherwise you might wind up with things like... my $path1 = undef; my $path2 = 'foo'; my $path = $path1 . '/' . $path2; creating '/foo'. Or this... my $path1 = 'foo/'; my $path2 = 'bar'; my $path = $path1 . '/' . $path2; creating 'foo//bar'. Could have used File::Spec, but I'm shying away from it due to SVN 1.7's pickiness about paths. Felt it would be better to have our own we can control completely. [ew: commit title] Signed-off-by: Eric Wong <normalperson@yhbt.net>
This commit is contained in:

committed by
Eric Wong

parent
280ad88aa0
commit
ca475a61f8
@ -12,6 +12,7 @@ our @EXPORT_OK = qw(
|
||||
can_compress
|
||||
canonicalize_path
|
||||
canonicalize_url
|
||||
join_paths
|
||||
);
|
||||
|
||||
|
||||
@ -134,4 +135,35 @@ sub _canonicalize_url_ourselves {
|
||||
}
|
||||
|
||||
|
||||
=head3 join_paths
|
||||
|
||||
my $new_path = join_paths(@paths);
|
||||
|
||||
Appends @paths together into a single path. Any empty paths are ignored.
|
||||
|
||||
=cut
|
||||
|
||||
sub join_paths {
|
||||
my @paths = @_;
|
||||
|
||||
@paths = grep { defined $_ && length $_ } @paths;
|
||||
|
||||
return '' unless @paths;
|
||||
return $paths[0] if @paths == 1;
|
||||
|
||||
my $new_path = shift @paths;
|
||||
$new_path =~ s{/+$}{};
|
||||
|
||||
my $last_path = pop @paths;
|
||||
$last_path =~ s{^/+}{};
|
||||
|
||||
for my $path (@paths) {
|
||||
$path =~ s{^/+}{};
|
||||
$path =~ s{/+$}{};
|
||||
$new_path .= "/$path";
|
||||
}
|
||||
|
||||
return $new_path .= "/$last_path";
|
||||
}
|
||||
|
||||
1;
|
||||
|
Reference in New Issue
Block a user