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