You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by wr...@apache.org on 2002/02/21 06:36:44 UTC

cvs commit: apr/build lineends.pl

wrowe       02/02/20 21:36:44

  Added:       build    lineends.pl
  Log:
    Ok... couldn't have gone so far without this script, so here it is.
  
    In fact, the Win32 .zip packages have been nothing more than lineends.pl
    converted Unix tarballs for several revisions now, although I regularly
    check out on Win32, expand the .html docs, and then diff to the tar
    converted package - to prove they are identical.
  
    Your results may vary, all reservations righted, void if detached.
  
  Revision  Changes    Path
  1.1                  apr/build/lineends.pl
  
  Index: lineends.pl
  ===================================================================
  #!/usr/local/bin/perl
  #
  #  Heuristically converts line endings to the current OS's preferred format
  #  
  #  All existing line endings must be identical (e.g. lf's only, or even
  #  the accedental cr.cr.lf sequence.)  If some lines end lf, and others as
  #  cr.lf, the file is presumed binary.  If the cr character appears anywhere
  #  except prefixed to an lf, the file is presumed binary.  If there is no 
  #  change in the resulting file size, or the file is binary, the conversion 
  #  is discarded.
  #  
  #  Todo: Handle NULL stdin characters gracefully.
  #
  
  use IO::File;
  use File::Find;
  
  # The ignore list is '-' seperated, with this leading hyphen and
  # trailing hyphens in ever concatinated list below.
  $ignore = "-";
  
  # Image formats
  $ignore .= "gif-jpg-jpeg-png-ico-bmp-";
  
  # Archive formats
  $ignore .= "tar-gz-z-zip-jar-war-";
  
  # Many document formats
  $ignore .= "eps-psd-pdf-ai-";
  
  # Some encodings
  $ignore .= "ucs2-ucs4-";
  
  # Some binary objects
  $ignore .= "class-so-dll-exe-obj-";
  
  # Some build env files in NW/Win32
  $ignore .= "mcp-xdc-ncb-opt-pdb-ilk-sbr-";
  
  $preservedate = 1;
  
  $forceending = 0;
  
  $givenpaths = 0;
  
  $notnative = 0;
  
  while (defined @ARGV[0]) {
      if (@ARGV[0] eq '--touch') {
          $preservedate = 0;
      }
      elsif (@ARGV[0] eq '--nocr') {
          $notnative = -1;
      }
      elsif (@ARGV[0] eq '--cr') {
          $notnative = 1;
      }
      elsif (@ARGV[0] eq '--force') {
          $forceending = 1;
      }
      elsif (@ARGV[0] eq '--FORCE') {
          $forceending = 2;
      }
      elsif (@ARGV[0] =~ m/^-/) {
          die "What is " . @ARGV[0] . " supposed to mean?\n\n" 
  	  . "Syntax:\t$0 [option()s] [path(s)]\n\n" . <<'OUTCH'
  Where:	paths specifies the top level directory to convert (default of '.')
  	options are;
  
  	  --cr     keep/add one ^M
  	  --nocr   remove ^M's
  	  --touch  the datestamp (default: keeps date/attribs)
  	  --force  mismatched corrections (unbalanced ^M's)
  	  --FORCE  all files regardless of file name!
  
  OUTCH
      }
      else {
          find(\&totxt, @ARGV[0]);
  	print "scanned " . @ARGV[0] . "\n";
  	$givenpaths = 1;
      }
      shift @ARGV;
  }
  
  if (!$givenpaths) {
      find(\&totxt, '.');
      print "did .\n";
  }
  
  sub totxt {
          $oname = $_;
  	$tname = '.#' . $_;
          if (!-f) {
              return;
          }
  	@exts = split /\./;
  	if ($forceending < 2) {
              while ($#exts && ($ext = pop(@exts))) {
                  if ($ignore =~ m|-$ext-|i) {
                      return;
                  }
  	    }
          }
  	@ostat = stat($oname);
          $srcfl = new IO::File $oname, "r" or die;
  	$dstfl = new IO::File $tname, "w" or die;
          binmode $srcfl; 
  	if ($notnative) {
              binmode $dstfl;
  	} 
  	undef $t;
          while (<$srcfl>) { 
              if (s/(\r*)\n$/\n/) {
  		$n = length $1;
  		if (!defined $t) { 
  		    $t = $n; 
  		}
  		if (!$forceending && (($n != $t) || m/\r/)) {
  		    print "mismatch in " .$oname. ":" .$n. " expected " .$t. "\n";
  		    undef $t;
  		    last;
  		}
  	        elsif ($notnative > 0) {
                      s/\n$/\r\n/; 
                  }
              }
  	    print $dstfl $_; 
  	}
  	if (defined $t && (tell $srcfl == tell $dstfl)) {
  	    undef $t;
  	}
  	undef $srcfl;
  	undef $dstfl;
  	if (defined $t) {
              unlink $oname or die;
              rename $tname, $oname or die;
              @anames = ($oname);
              if ($preservedate) {
                  utime $ostat[9], $ostat[9], @anames;
              }
              chmod $ostat[2] & 07777, @anames;
              chown $ostat[5], $ostat[6], @anames;
              print "Converted file " . $oname . " to text in " . $File::Find::dir . "\n"; 
  	}
  	else {
  	    unlink $tname or die;
  	}
  }