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: [email protected]
For additional commands, e-mail: [email protected]