summaryrefslogtreecommitdiff
path: root/perl/Git/SVN/Utils.pm
diff options
context:
space:
mode:
authorLibravatar Michael G. Schwern <schwern@pobox.com>2012-07-28 02:38:29 -0700
committerLibravatar Eric Wong <normalperson@yhbt.net>2012-08-02 21:44:04 +0000
commitca475a61f8c07d475c505bf64d219f7e9d61e728 (patch)
treeb204f8e670d44dec484bd7f6af427e2fd87afc5d /perl/Git/SVN/Utils.pm
parentgit-svn: factor out _collapse_dotdot function (diff)
downloadtgif-ca475a61f8c07d475c505bf64d219f7e9d61e728.tar.xz
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>
Diffstat (limited to 'perl/Git/SVN/Utils.pm')
-rw-r--r--perl/Git/SVN/Utils.pm32
1 files changed, 32 insertions, 0 deletions
diff --git a/perl/Git/SVN/Utils.pm b/perl/Git/SVN/Utils.pm
index 4925410dd1..4005da9d7d 100644
--- a/perl/Git/SVN/Utils.pm
+++ b/perl/Git/SVN/Utils.pm
@@ -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;