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