Hi Giulio,

On Wed, Sep 8, 2010 at 10:25 AM, Giulio Troccoli  wrote:
> I am writing a pre-commit hook script in perl. One of the requirement is that 
> all files (luckily they are all text files) have the svn:eol-style property 
> set to LF and the actual eol is indeed LF. If that's not the case I will 
> reject the commit and direct the user to a page on our intranet to explain 
> what to do to fix it.
>
> My problem is how to detect whether the eol is LF and nothing else. I'm 
> developing on Linux (Centos 5) and Perl 5.10. Subversion is 1.6.9, if it 
> matters.
>
> I thought about using the dos2unix utility (we only use Windows or Linux) and 
> then check that the file hasn't changed, but it seems a lot of processing.
>
> My second idea was to use a regular expression to check each line of each 
> file. This way at least I would stop as soon as I find an eol that is not LF, 
> saving some processing. I still need to svn cat each file into an array I 
> think.
>

You need to use svnlook cat, but there is no need to read all its
output into memory. You can process it line-by-line.
Here's an outline (completely untested)

#!/usr/bin/perl -w
use strict;

my ($REPOS, $TXN) = @ARGV;

my $crlf = 0;

... determine the list of files
my @files = `svnlook changed -t $TXN $REPOS`;
chomp @files; # remove the newline at the end
s/^U\s+// for @files; # remove the leading U

FILE:
foreach my $file (@files) {
  open (SVN, "svnlook cat $file |") or die "open pipe failed: $!"
  while (<SVN>) # read from the pipe, one line at a time
  {
    chomp; # cut the platform-specific line end. On Unix, this drops
the \n but keeps the \r
    if ( /^M$/ ) { # last character is a \r (a.k.a. Control-M)
      $crlf = 1; last FILE;
    }
  }
  close(SVN) or die "close pipe failed: $!" # it is very important to
check the close on pipes
}

if ($crlf)
{
  die "$file contains DOS line endings";
}


-- 
Life is complex, with real and imaginary parts.
"Ok, it boots. Which means it must be bug-free and perfect. " -- Linus Torvalds
"People disagree with me. I just ignore them." -- Linus Torvalds

Reply via email to