info-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Unix/Windows CR/LF Problems


From: Robert Kirkbride
Subject: Re: Unix/Windows CR/LF Problems
Date: Tue, 11 Dec 2001 14:46:11 +0000

Thanks for all the info!

The thing is I need the files to remain in CR/LF if created with them.
The Visual Studio workspace files are text files. If they are converted to Unix type then Visual Studio will not read them.

I was hoping that CVS would just not touch the CR/LF. ie. if it has a CR/LF then leave as is, and if it has just a LF then just leave it.

Rob

On 2001.12.11 14:24 Antonio Bemfica wrote:
I've had some of the same problems - I know now that line endings are
something to be very careful about (I enforce them with commitinfo
now).

Here are a few scripts I used to clean up my code (some files had lone
LF
endings, of all thing...) - modify them to suit your needs. I
initially
attempted to clean up the actual ,v files in the repository - in
theory it
should work, but in my case it caused some problems - I ended up
cleaning
up my working copy and commiting them back.

# this will print the filename of file with CR line endings (bad!)
perl -npi -e 'if (/\r(?!\n)/) { print STDOUT "$ARGV\n"; }'
bad_newlines.txt

# this will pipe the filename of file with CR line endings to another
perl
# script to replace them with NL
find ./medcon -name "*.java" -print | xargs \
perl -npi -e 'if (/\r(?!\n)/) { print STDOUT "$ARGV\n"; }' | uniq | \
xargs perl -npi -e 's/\r(?!\n)/\n/g'

# this will replace DOS line endings with UNIX - you could also use
dos2unix
find ./medcon -name "*.java" -print | xargs \
perl -npi -e 's/\r\n/\n/g'

I have also attached commit_prep.pl, a file which I call from
commitinfo:

DEFAULT /green/cvsuser/CVSROOT/commit_prep.pl -r

I got commit_prep.pl from this very list - the authors may have a more
recent version.

Good luck

Antonio



On Tue, 11 Dec 2001, Robert Kirkbride wrote:

> I'm not sure if this is a WinCVS question or CVS in general.
>
> We've got some source files that are updated under Linux (1.11p1)
and
> under Windows.
> This seems to work ok but sometimes once when they are checked out
> within Windows the lines are double spaced in Visual Studio (and it
> produces a warning). In fact, they have a CR/CR/LF sequence instead
of
> just CR/LF or CR.
>
> Am I wrong in expected this to work ok?
>
> Rob Kirkbride


#!/usr/local/bin/perl
#
# Developed using perl, version 5.004_04 built for sun4-solaris
#
# Perl filter to handle pre-commit checking of files.  This program
# records the last directory where commits will be taking place for
# use by the log_accum.pl script.  It also checks the end of line
# termination for files with particular extensions to ensure there
# is no ctrl-M.  If any file with checked extensions
# has any line ending in ctrl-M, the entire commit is rejected.
#
# Add a line to your CVSROOT/commitinfo file something like:
# DEFAULT /cvs_repository/CVSROOT/commit_prep.pl -r
#
# Copyright 2001 David Martin http://www.scm-professionals.com
#
# Adapted from contrib directory sources by:
# David Hampton <address@hidden> and Greg A. Woods <address@hidden>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
#
#       Configurable options
#

# Constants
#
$LAST_FILE     = "/tmp/#cvs.lastdir"; # must match name in
log_accum.pl
$ENTRIES       = "CVS/Entries";

#$CrLog = "%s is a text file and contains one or more ctrl-Ms.\nPlease
remove ctrl-Ms and commit again!\n";
$CrLog = "%s contains one or more ctrl-Ms.\nPlease remove ctrl-Ms and
commit again!\n";

#       Subroutines
#

sub write_line {
    local($filename, $line) = @_;
    open(FILE, ">$filename") || die("Cannot open $filename, stopped");
    print(FILE $line, "\n");
    close(FILE);
}

sub check_line_termination {
    local($i);
    local($filename, $cvsversion) = @_;

    open(FILE, "<$filename") || return(0);

    if ($debug != 0) {
        print STDERR sprintf("file = %s, version = %d.\n", $filename,
$cvsversion{$filename});
    }

    @all_lines = ();
    for ($i = 0; <FILE>; $i++) {
        chomp;
        push(@all_lines, $_);
    }

    if (grep(/$/, @all_lines)) {
        print STDERR sprintf($CrLog, $filename);
        return(1);
    }

    return(0);
}

#
# Main Body #

$id = getpgrp();              # You *must* use a shell that does
setpgrp()!

# Record the directory for later use by the log_accumulate stript.
#
$record_directory = 0;

# parse command line arguments
#
while (@ARGV) {
    $arg = shift @ARGV;

    if ($arg eq '-d') {
        $debug = 1;
        print STDERR "Debug turned on...\n";
    } elsif ($arg eq '-r') {
        $record_directory = 1;
    } else {
        push(@files, $arg);
    }
}

$directory = shift @files;

if ($debug != 0) {
    print STDERR "dir   - ", $directory, "\n";
    print STDERR "files - ", join(":", @files), "\n";
}

# Suck in the CVS/Entries file
#
open(ENTRIES, $ENTRIES) || die("Cannot open $ENTRIES.\n");
while (<ENTRIES>) {
    local($filename, $version) = split('/', substr($_, 1));
    $cvsversion{$filename} = $version;
}

# Now check each file name passed in, except for dot files.  Dot files
# are considered to be administrative files by this script.
#
$failed = 0;
foreach $arg (@files) {
  if (index($arg, ".") == 0) {
    next;
  }
#  $result = `/usr/bin/file $arg`;
#  if ($debug != 0) {
#    print STDERR $result, "\n";
#  }
#  if ( ( $result =~ /:.*text/ ) ||
#       ( $result =~ /:.*script/ ) ) {
   if ( ( $arg =~ /akefile$/ ) ||
        ( $arg =~ /.java$/ ) ||
        ( $arg =~ /.jhtml$/ ) ||
        ( $arg =~ /.html$/ ) ||
        ( $arg =~ /.txt$/ ) ||
        ( $arg =~ /.sql$/ ) ||
        ( $arg =~ /.jsp$/ ) ||
        ( $arg =~ /.shtml$/ ) ||
        ( $arg =~ /.default$/ ) ||
        ( $arg =~ /.mk$/ ) ||
        ( $arg =~ /.env$/ ) ||
        ( $arg =~ /.dtd$/ ) ||
        ( $arg =~ /.ini$/ ) ||
        ( $arg =~ /.jj$/ ) ||
        ( $arg =~ /.pl$/ ) ||
        ( $arg =~ /.policy$/ ) ||
        ( $arg =~ /.properties$/ ) ||
        ( $arg =~ /.sh$/ ) ||
        ( $arg =~ /.xml$/ ) ) {
    if ($debug != 0) {
      print STDERR "Checking for line termination for file ", $arg,
"\n";
    }
    $failed += &check_line_termination($arg);
  }
}
if ($failed) {
  print STDERR "\n";
  exit(1);
}

# Record this directory as the last one checked.  This will be used
# by the log_accumulate script to determine when it is processing
# the final directory of a multi-directory commit.
#
if ($record_directory != 0) {
    &write_line("$LAST_FILE.$id", $directory);
}
exit(0);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]