[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: windows filenames
From: |
Paul Gelderblom \(ptok\) |
Subject: |
Re: windows filenames |
Date: |
Sun, 7 Mar 2004 23:55:53 +0100 |
address@hidden wrote:
> My question is: How can I set up CVS server to deny adding of a file to a
> folder in repository when there is a file with "the same name from windows
> point of view" ?
I could not find a script doing this; but I had some perl scripts for other
commitinfo tasks lying around.
I now adopted one, to perform this specific task.
I briefly tested it, but it is obviously a version 0.1. Comments
appreciated. YMMV.
Perl script follows below, eable it by putting something like
ALL perl /home/paulg/CVSAdmin/bin/checkCase.pl
in your CVSROOT/commitinfo
Is this useful for the contrib folder?
Paul Gelderblom.
----------------------------------------------------------------------------
---------------
#!/usr/bin/perl
# checkCase.pl
# P. Gelderblom, Mar 2004
#
# usage : perl checkCase.pl dirname file1 file2 file3 ...
# checks if a file with the same name but different capitalisation
# exists in this repository directory. If so, deny the commit.
#
# this is useful if the repository has DOS/Windows clients, since they
# cannot distinguish files based on capitalisation only.
# ----------------------------------------------
#
# This script is to be called from the $CVSROOT/CVSROOT/commitinfo file
# This means that it will be invoked during a cvs commit, *before*
# cvs actually does the commit.
#
# The CVS server will pass a directory and a set of filenames.
#
# When the script finds an illegal commit it will do an "exit 1"
#
# ---------------------------------------------
use strict;
my ($dir,@files)address@hidden;
my $cvsroot = $ENV{"CVSROOT"} || die " checkCase : panic: CVSROOT not set!";
my $first=1;
my %existingFiles=();
my $exitvalue=0;
my $debug =0 ;
sub printd($)
{
print STDERR @_[0] if $debug;
}
printd "checkCase: dir= $dir\n";
printd "checkCase: files= @files\n";
# check all the inputfiles
foreach my $file (@files)
{
# skip the check for existing files. We can't change the past...
next if ((-f "$dir/$file,v") || (-f "$dir/Attic/$file,v"));
# Get filenames in the repos into %existingFiles
GetExistingFilenames();
# check if a similar filename exists
if (exists $existingFiles{lc $file})
{
print STDERR "checkCase error: you are trying to commit $file but
".$existingFiles{lc $file}." already exists. \n";
$exitvalue=1;
}
else
{
# additional check: do not allow an "add" of two files with similar
names
foreach my $file2 (@files)
{
if((lc $file eq lc $file2) && ($file gt $file2) ) # the second check
would normally be "ne" but this way each pair is reported only once.
{
print STDERR "checkCase error: you are trying to commit $file and
$file2 at the same time \n";
$exitvalue=1;
}
}
}
}
# print some additional info at the end.
print " --> Filenames differing by case only are forbidden on this
repository.\n" if ($exitvalue);
exit $exitvalue;
# endo of script... subs follow
# create a hash existingFiles with existing files;
# key= lowcase version of filename,
# value=true filename including path
sub GetExistingFilenames
{
# execute this only once
if ($first)
{
$first=0;
# do a dir of the repo dir and the attic
foreach my $rcsFile (glob ("$dir/*,v") , glob("$dir/Attic/*,v"))
{
#remove ,v extension
$rcsFile=~s/,v//;
# build key: bare filename transformed to lowercase
my $key=$rcsFile;
$key=~s/$dir\///;
$key=~s/Attic\///;
$key=lc $key;
# remove cvsroot from the value (make log msg more readible)
$rcsFile=~s#^$cvsroot/*##;
$existingFiles{$key}=$rcsFile;
}
printd "checkCase: existing = " . join("|",%existingFiles). "\n";;
}
}