Author: kkolinko
Date: Wed Feb 15 01:39:55 2012
New Revision: 1244302

URL: http://svn.apache.org/viewvc?rev=1244302&view=rev
Log:
Implement check for correct end-of-line characters in the source files.
I plan to add it as a separate task in Gump.
Running it on Windows currently shows 11 problem files.

Added:
    tomcat/trunk/java/org/apache/tomcat/buildutil/CheckEol.java   (with props)
Modified:
    tomcat/trunk/build.xml

Modified: tomcat/trunk/build.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/build.xml?rev=1244302&r1=1244301&r2=1244302&view=diff
==============================================================================
--- tomcat/trunk/build.xml (original)
+++ tomcat/trunk/build.xml Wed Feb 15 01:39:55 2012
@@ -482,6 +482,30 @@
     </checkstyle>
   </target>
 
+  <target name="validate-eoln" depends="compile"
+    description="Validate that the source files have correct line ends">
+    <taskdef name="checkeol"
+             classname="org.apache.tomcat.buildutil.CheckEol"
+             classpath="${tomcat.classes}" />
+
+    <checkeol>
+      <fileset dir="." >
+        <patternset refid="text.files" />
+        <include name="**/*.bat"/>
+        <include name="**/*.sh"/>
+        <exclude name=".*/**"/>
+        <exclude name="output/**"/>
+        <exclude name="modules/**"/>
+        <!-- Exclude these else Gump runs validate on them -->
+        <exclude name="**/org/apache/tomcat/dbcp/**"/>
+        <exclude name="**/tomcat-deps/**"/>
+      </fileset>
+      <fileset dir="modules/jdbc-pool" >
+        <patternset refid="text.files" />
+      </fileset>
+    </checkeol>
+  </target>
+
   <target name="compile-prepare">
     <!-- Add the builtin catalina.properties -->
     <copy todir="java/org/apache/catalina/startup"

Added: tomcat/trunk/java/org/apache/tomcat/buildutil/CheckEol.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/buildutil/CheckEol.java?rev=1244302&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/buildutil/CheckEol.java (added)
+++ tomcat/trunk/java/org/apache/tomcat/buildutil/CheckEol.java Wed Feb 15 
01:39:55 2012
@@ -0,0 +1,167 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package org.apache.tomcat.buildutil;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.FileSet;
+
+/**
+ * Ant task that checks that all the files in the given fileset have 
end-of-line
+ * delimiters that are appropriate for the current OS.
+ *
+ * <p>
+ * The goal is to check whether we have problems with svn:eol-style property
+ * when files are committed on one OS and then checked on another one.
+ */
+public class CheckEol extends Task {
+
+    private static final String eoln = System.getProperty("line.separator");
+
+    /** The files to be checked */
+    private final List<FileSet> filesets = new LinkedList<FileSet>();
+
+    /**
+     * Sets the files to be checked
+     *
+     * @param fs The fileset to be checked.
+     */
+    public void addFileset( FileSet fs ) {
+        filesets.add( fs );
+    }
+
+    /**
+     * Perform the check
+     *
+     * @throws BuildException if an error occurs during execution of
+     *    this task.
+     */
+    @Override
+    public void execute() throws BuildException {
+
+        Mode mode = null;
+        if ("\n".equals(eoln)) {
+            mode = Mode.LF;
+        } else if ("\r\n".equals(eoln)) {
+            mode = Mode.CRLF;
+        } else {
+            log("Line ends check skipped, because OS line ends setting is 
neither LF nor CRLF.",
+                    Project.MSG_VERBOSE);
+            return;
+        }
+
+        int count = 0;
+
+        List<CheckFailure> errors = new ArrayList<CheckFailure>();
+
+        // Step through each file and check.
+        for (FileSet fs : filesets) {
+            DirectoryScanner ds = fs.getDirectoryScanner(getProject());
+            File basedir = ds.getBasedir();
+            String[] files = ds.getIncludedFiles();
+            if (files.length > 0) {
+                log("Checking line ends in " + files.length + " file(s)");
+                for (int i = 0; i < files.length; i++) {
+                    File file = new File(basedir, files[i]);
+                    log("Checking file '" + file + "' for correct line ends",
+                            Project.MSG_DEBUG);
+                    try {
+                        check(file, errors, mode);
+                    } catch (IOException e) {
+                        throw new BuildException("Could not check file '"
+                                + file.getAbsolutePath() + "'", e);
+                    }
+                    count++;
+                }
+            }
+        }
+        if (count > 0) {
+            log("Done line ends check in " + count + " file(s), "
+                    + errors.size() + " error(s) found.");
+        }
+        if (errors.size() > 0) {
+            String message = "The following files have wrong line ends: "
+                    + errors;
+            // We need to explicitly write the message to the log, because
+            // long BuildException messages may be trimmed. E.g. I observed
+            // this problem with Eclipse IDE 3.7.
+            log(message, Project.MSG_ERR);
+            throw new BuildException(message);
+        }
+    }
+
+    private static enum Mode {
+        LF, CRLF
+    }
+
+    private static class CheckFailure {
+        private final File file;
+        private final int line;
+        private final String value;
+
+        public CheckFailure(File file, int line, String value) {
+            this.file = file;
+            this.line = line;
+            this.value = value;
+        }
+
+        @Override
+        public String toString() {
+            return eoln + file + ": uses " + value + " on line " + line;
+        }
+    }
+
+    private void check(File file, List<CheckFailure> errors, Mode mode)
+            throws IOException {
+        BufferedInputStream is = new BufferedInputStream(new FileInputStream(
+                file));
+        try {
+            int line = 1;
+            int prev = -1;
+            int ch;
+            while ((ch = is.read()) != -1) {
+                if (ch == '\n') {
+                    if (mode == Mode.LF && prev == '\r') {
+                        errors.add(new CheckFailure(file, line, "CRLF"));
+                        return;
+                    } else if (mode == Mode.CRLF && prev != '\r') {
+                        errors.add(new CheckFailure(file, line, "LF"));
+                        return;
+                    }
+                    line++;
+                } else if (prev == '\r') {
+                    errors.add(new CheckFailure(file, line, "CR"));
+                    return;
+                }
+                prev = ch;
+            }
+        } finally {
+            is.close();
+        }
+    }
+}

Propchange: tomcat/trunk/java/org/apache/tomcat/buildutil/CheckEol.java
------------------------------------------------------------------------------
    svn:eol-style = native



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to