summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Ogilvie <mmogilvi_git@miniinfo.net>2012-10-13 23:42:25 -0600
committerJunio C Hamano <gitster@pobox.com>2012-10-16 16:17:50 -0700
commit1899cbc5b2e2cb3e7c98cceed818d8adfb242ec2 (patch)
treefe322f3fee9e706b7f831f14680dd01db087f169
parent2c3af7e748206f385c85d35b902bce522107360b (diff)
downloadgit-1899cbc5b2e2cb3e7c98cceed818d8adfb242ec2.tar.gz
cvsserver: cleanup extra slashes in filename arguments
Signed-off-by: Matthew Ogilvie <mmogilvi_git@miniinfo.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rwxr-xr-xgit-cvsserver.perl28
1 files changed, 28 insertions, 0 deletions
diff --git a/git-cvsserver.perl b/git-cvsserver.perl
index dca0ed62fc..1d929dfacb 100755
--- a/git-cvsserver.perl
+++ b/git-cvsserver.perl
@@ -2309,6 +2309,9 @@ sub filenamesplit
return ( $filepart, $dirpart );
}
+# Cleanup various junk in filename (try to canonicalize it), and
+# add prependdir to accomodate running CVS client from a
+# subdirectory (so the output is relative to top directory of the project).
sub filecleanup
{
my $filename = shift;
@@ -2320,11 +2323,36 @@ sub filecleanup
return undef;
}
+ if($filename eq ".")
+ {
+ $filename="";
+ }
$filename =~ s/^\.\///g;
+ $filename =~ s%/+%/%g;
$filename = $state->{prependdir} . $filename;
+ $filename =~ s%/$%%;
return $filename;
}
+# Remove prependdir from the path, so that is is relative to the directory
+# the CVS client was started from, rather than the top of the project.
+# Essentially the inverse of filecleanup().
+sub remove_prependdir
+{
+ my($path) = @_;
+ if(defined($state->{prependdir}) && $state->{prependdir} ne "")
+ {
+ my($pre)=$state->{prependdir};
+ $pre=~s%/$%%;
+ if(!($path=~s%^\Q$pre\E/?%%))
+ {
+ $log->fatal("internal error missing prependdir");
+ die("internal error missing prependdir");
+ }
+ }
+ return $path;
+}
+
sub validateGitDir
{
if( !defined($state->{CVSROOT}) )