From c586763a6c04601f4b33cdeb103ef249ff3a5f4d Mon Sep 17 00:00:00 2001
From: neil_a_wilson <neil_a_wilson@localhost>
Date: Mon, 29 Jan 2007 16:31:54 +0000
Subject: [PATCH] Add a new Ant task that can be used to ensure that new files marked for addition to the Subversion repository have the "svn:eol-style" property set to "native".

---
 opends/build.xml                                                 |   43 +++++++-
 opends/build-tools/src/org/opends/build/tools/CheckEOLStyle.java |  202 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 237 insertions(+), 8 deletions(-)

diff --git a/opends/build-tools/src/org/opends/build/tools/CheckEOLStyle.java b/opends/build-tools/src/org/opends/build/tools/CheckEOLStyle.java
new file mode 100644
index 0000000..5343b38
--- /dev/null
+++ b/opends/build-tools/src/org/opends/build/tools/CheckEOLStyle.java
@@ -0,0 +1,202 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2007 Sun Microsystems, Inc.
+ */
+package org.opends.build.tools;
+
+
+
+import java.io.File;
+import java.util.LinkedList;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.FileSet;
+
+import org.tmatesoft.svn.core.SVNException;
+import org.tmatesoft.svn.core.wc.SVNPropertyData;
+import org.tmatesoft.svn.core.wc.SVNRevision;
+import org.tmatesoft.svn.core.wc.SVNStatus;
+import org.tmatesoft.svn.core.wc.SVNStatusClient;
+import org.tmatesoft.svn.core.wc.SVNStatusType;
+import org.tmatesoft.svn.core.wc.SVNWCClient;
+
+
+
+/**
+ * This class provides an implementation of an Ant task that may be used to
+ * verify that any file marked for addition to the repository has the
+ * "svn:eol-style" property set with a value of "native".
+ */
+public class CheckEOLStyle
+       extends Task
+{
+  /**
+   * The name of the system property that may be used to prevent property
+   * errors from failing the build.
+   */
+  public static final String IGNORE_ERRORS_PROPERTY =
+       "org.opends.server.IgnoreEOLStyleErrors";
+
+
+
+  // A list of all the filesets to be checked.
+  private LinkedList<FileSet> filesetList = new LinkedList<FileSet>();
+
+  // The path to the root of the Subversion workspace to check.
+  private String workspace = null;
+
+
+
+  /**
+   * Adds the provided fileset to the list of filesets that should be checked.
+   *
+   * @param  fileset  A fileset containing a list of files that should be
+   *                  checked.
+   */
+  public void addFileset(FileSet fileset)
+  {
+    filesetList.add(fileset);
+  }
+
+
+
+  /**
+   * Specifies the path to the root of the Subversion workspace to check.
+   *
+   * @param  workspace  The path to the root of the Subversion workspace to
+   *                    check.
+   */
+  public void setWorkspace(String workspace)
+  {
+    this.workspace = workspace;
+  }
+
+
+
+  /**
+   * Performs the appropriate processing needed for this task.  In this case,
+   * it uses SVNKit to identify all files marked for addition to the Subversion
+   * repository and verify that the file has the svn:eol-style property set with
+   * a value of native.
+   */
+  @Override()
+  public void execute()
+  {
+    // Make sure that at least one fileset was provided.
+    if (filesetList.isEmpty())
+    {
+      throw new BuildException("ERROR:  No filesets were specified to " +
+                               "indicate which files should be checked.");
+    }
+
+
+    File workspacePath;
+    if ((workspace == null) || (workspace.length() == 0))
+    {
+      workspacePath = getProject().getBaseDir();
+    }
+    else
+    {
+      workspacePath = new File(workspace);
+    }
+    String workspacePathString = workspacePath.getAbsolutePath() +
+                                 File.separator;
+
+
+    // Get the current status for all files in the fileset.  For any files
+    // marked for addition, check the svn:eol-style property.
+    SVNStatusClient statusClient   = new SVNStatusClient(null, null);
+    SVNWCClient     propertyClient = new SVNWCClient(null, null);
+
+    LinkedList<String> problemFiles = new LinkedList<String>();
+    for (FileSet fileSet : filesetList)
+    {
+      DirectoryScanner scanner = fileSet.getDirectoryScanner(getProject());
+      for (String relativePath : scanner.getIncludedFiles())
+      {
+        String filePath = scanner.getBasedir() + File.separator + relativePath;
+        File targetFile = new File(filePath);
+
+        try
+        {
+          SVNStatus svnStatus = statusClient.doStatus(targetFile, false);
+          if (svnStatus == null)
+          {
+            System.err.println("WARNING:  Could not determine Subversion " +
+                               "status for file " + filePath);
+            System.err.println("No further EOL style checking will be " +
+                               "performed.");
+            return;
+          }
+
+          SVNStatusType statusType = svnStatus.getContentsStatus();
+          if (statusType == SVNStatusType.STATUS_ADDED)
+          {
+            SVNPropertyData propertyData =
+                 propertyClient.doGetProperty(targetFile, "svn:eol-style",
+                                              SVNRevision.BASE,
+                                              SVNRevision.WORKING, false);
+            if ((propertyData == null) ||
+                (! propertyData.getValue().equals("native")))
+            {
+              problemFiles.add(filePath);
+            }
+          }
+        }
+        catch (SVNException svnException)
+        {
+          System.err.println("WARNING:  Could not check eol-style property " +
+                             "for file " + filePath + ":  " + svnException);
+          System.err.println("No further EOL style checking will be " +
+                             "performed.");
+          return;
+        }
+      }
+    }
+
+
+    if (! problemFiles.isEmpty())
+    {
+      System.err.println("WARNING:  Property 'svn:eol-style' not set to " +
+                         "'native' for the following files:");
+      for (String filename : problemFiles)
+      {
+        System.err.println("     " + filename);
+      }
+
+      String ignoreStr = getProject().getProperty(IGNORE_ERRORS_PROPERTY);
+      if ((ignoreStr == null) || (! ignoreStr.equalsIgnoreCase("true")))
+      {
+        throw new BuildException("Fix these reported problems before " +
+                                 "proceeding, or use '-D" +
+                                 IGNORE_ERRORS_PROPERTY + "=true' to " +
+                                 "ignore svn:eol-style warnings.");
+      }
+    }
+  }
+}
+
diff --git a/opends/build.xml b/opends/build.xml
index b2cab9e..7263c8d 100644
--- a/opends/build.xml
+++ b/opends/build.xml
@@ -133,7 +133,7 @@
 
 
   <!-- The build target that should be used before committing code. -->
-  <target name="precommit" depends="checkstyle,clean,copyrightdates,dsml,javadoc,testwithcoverage"
+  <target name="precommit" depends="checkstyle,clean,copyrightdates,eolstyle,dsml,javadoc,testwithcoverage"
        description="Perform all processing needed before committing code." />
 
 
@@ -156,7 +156,7 @@
 
   <!-- The build target that should be used to build everything. -->
   <target name="all"
-       depends="checkstyle,clean,copyrightdates,dsml,javadoc,testallwithcoverage"
+       depends="checkstyle,clean,copyrightdates,eolstyle,dsml,javadoc,testallwithcoverage"
        description="Build using all defined targets." />
 
 
@@ -255,7 +255,7 @@
 
 
 
-  <!-- Check modified files to see any copyright updates are needed. -->
+  <!-- Check modified files to see if any copyright updates are needed. -->
   <target name="copyrightdates" depends="buildtools"
        description="Ensure updated files have the correct copyright year" >
     <taskdef name="checkcopyrightdates"
@@ -271,21 +271,48 @@
     </taskdef>
 
     <checkcopyrightdates>
-      <fileset dir="${src.dir}" includes="**/*.java" />
-      <fileset dir="${quicksetup.src.dir}" includes="**/*.java" />
-      <fileset dir="${statuspanel.src.dir}" includes="**/*.java" />
-      <fileset dir="${unittest.testng.src.dir}" includes="**/*.java" />
-      <fileset dir="${functest.testng.src.dir}" includes="**/*.java" />
+      <fileset dir="${basedir}" includes="**/*.java" excludes="build/**/*" />
       <fileset dir="${basedir}" includes="**/*.xml" excludes="build/**/*" />
+      <fileset dir="${basedir}" includes="**/*.html" excludes="build/**/*" />
       <fileset dir="${basedir}" includes="**/*.sh" excludes="build/**/*" />
       <fileset dir="${basedir}" includes="**/*.bat" excludes="build/**/* " />
       <fileset dir="${basedir}" includes="**/*.ldif" excludes="build/**/*" />
+      <fileset dir="${basedir}" includes="**/*.txt" excludes="build/**/*" />
     </checkcopyrightdates>
   </target>
 
 
 
 
+  <!-- Check added files to see if any svn:eol-style updates are needed. -->
+  <target name="eolstyle" depends="buildtools"
+       description="Ensure added files have the correct svn:eol-style" >
+    <taskdef name="checkeolstyle"
+             classname="org.opends.build.tools.CheckEOLStyle">
+      <classpath>
+        <fileset dir="${build.dir}/build-tools">
+          <include name="*.jar" />
+        </fileset>
+        <fileset dir="${svnkit.dir}">
+          <include name="*.jar" />
+        </fileset>
+      </classpath>
+    </taskdef>
+
+    <checkeolstyle>
+      <fileset dir="${basedir}" includes="**/*.java" excludes="build/**/*" />
+      <fileset dir="${basedir}" includes="**/*.xml" excludes="build/**/*" />
+      <fileset dir="${basedir}" includes="**/*.html" excludes="build/**/*" />
+      <fileset dir="${basedir}" includes="**/*.sh" excludes="build/**/*" />
+      <fileset dir="${basedir}" includes="**/*.bat" excludes="build/**/* " />
+      <fileset dir="${basedir}" includes="**/*.ldif" excludes="build/**/*" />
+      <fileset dir="${basedir}" includes="**/*.txt" excludes="build/**/*" />
+    </checkeolstyle>
+  </target>
+
+
+
+
   <!-- Ensure that the source code meets basic style requirements. -->
   <target name="checkstyle" description="Perform basic source style checks">
     <mkdir dir="${checkstyle.cache.dir}" />

--
Gitblit v1.10.0