From 1899cbc5b2e2cb3e7c98cceed818d8adfb242ec2 Mon Sep 17 00:00:00 2001 From: Matthew Ogilvie Date: Sat, 13 Oct 2012 23:42:25 -0600 Subject: [PATCH] cvsserver: cleanup extra slashes in filename arguments Signed-off-by: Matthew Ogilvie Signed-off-by: Junio C Hamano --- git-cvsserver.perl | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/git-cvsserver.perl b/git-cvsserver.perl index dca0ed62f..1d929dfac 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}) ) -- 2.26.2