diff options
author | Matthew Ogilvie <mmogilvi_git@miniinfo.net> | 2012-10-13 23:42:25 -0600 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-10-16 16:17:50 -0700 |
commit | 1899cbc5b2e2cb3e7c98cceed818d8adfb242ec2 (patch) | |
tree | fe322f3fee9e706b7f831f14680dd01db087f169 | |
parent | 2c3af7e748206f385c85d35b902bce522107360b (diff) | |
download | git-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-x | git-cvsserver.perl | 28 |
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}) ) |