CheckPrecommit.java revision 2efcb9667318c099d8723dd578f198c16b4a22c4
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync/*
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * CDDL HEADER START
1d753fdeb00e3867c6bbf94ab3c36cd6734dd447vboxsync *
1d753fdeb00e3867c6bbf94ab3c36cd6734dd447vboxsync * The contents of this file are subject to the terms of the
1d753fdeb00e3867c6bbf94ab3c36cd6734dd447vboxsync * Common Development and Distribution License, Version 1.0 only
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync * (the "License"). You may not use this file except in compliance
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * with the License.
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync *
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * You can obtain a copy of the license at
d14682a025d2c801f1e777f491092d2ebbe78c3cvboxsync * trunk/opends/resource/legal-notices/OpenDS.LICENSE
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * See the License for the specific language governing permissions
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * and limitations under the License.
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync *
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * When distributing Covered Code, include this CDDL HEADER in each
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * file and include the License file at
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * add the following below this CDDL HEADER, with the fields enclosed
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * by brackets "[]" replaced with your own identifying information:
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync * Portions Copyright [yyyy] [name of copyright owner]
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync *
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync * CDDL HEADER END
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync *
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync *
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * Copyright 2008 Sun Microsystems, Inc.
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * Portions copyright 2012 ForgeRock AS.
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync */
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncpackage org.opends.build.tools;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncimport java.io.BufferedReader;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncimport java.io.File;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncimport java.io.FileReader;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncimport java.io.IOException;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncimport java.util.GregorianCalendar;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncimport java.util.HashSet;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncimport java.util.LinkedList;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncimport org.apache.tools.ant.BuildException;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncimport org.apache.tools.ant.Task;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncimport org.tmatesoft.svn.core.SVNDepth;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncimport org.tmatesoft.svn.core.SVNException;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncimport org.tmatesoft.svn.core.wc.SVNPropertyData;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncimport org.tmatesoft.svn.core.wc.SVNRevision;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncimport org.tmatesoft.svn.core.wc.ISVNStatusHandler;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncimport org.tmatesoft.svn.core.wc.SVNClientManager;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncimport org.tmatesoft.svn.core.wc.SVNStatus;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsyncimport org.tmatesoft.svn.core.wc.SVNWCClient;
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync/**
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * This class provides an implementation of an Ant task that may be used to
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * perform various checks to deteermine whether a file is suitable to be
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * committed. This includes:
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * <UL>
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * <LI>Make sure that the file has the correct "svn:eol-style" property
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * value.</LI>
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * <LI>If a file contains a line that appears to be a comment and includes the
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * word "copyright", then it should contain the current year.</LI>
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync * </UL>
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync */
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsyncpublic class CheckPrecommit
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync extends Task
5a07658d13590eba51dd98ef335a73d2a11edaa7vboxsync implements ISVNStatusHandler
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync{
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /**
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * The name of the system property that may be used to prevent copyright date
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync * problems from failing the build.
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync */
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync public static final String IGNORE_COPYRIGHT_ERRORS_PROPERTY =
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync "org.opends.server.IgnoreCopyrightDateErrors";
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /**
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync * The name of the system property that may be used to prevent svn eol-style
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync * problems from failing the build.
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync public static final String IGNORE_EOLSTYLE_ERRORS_PROPERTY =
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync "org.opends.server.IgnoreEOLStyleErrors";
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /**
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync *
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync */
e6e69eb2216092b564f920a6214f5103333ce54cvboxsync public static final HashSet<String> CHECKED_EXTENSIONS =
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync new HashSet<String>();
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync static
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync CHECKED_EXTENSIONS.add("java");
529e6bec97f5ef2e005c99c205c9624583ecb7f0vboxsync CHECKED_EXTENSIONS.add("xml");
529e6bec97f5ef2e005c99c205c9624583ecb7f0vboxsync CHECKED_EXTENSIONS.add("xsd");
529e6bec97f5ef2e005c99c205c9624583ecb7f0vboxsync CHECKED_EXTENSIONS.add("xsl");
529e6bec97f5ef2e005c99c205c9624583ecb7f0vboxsync CHECKED_EXTENSIONS.add("html");
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync CHECKED_EXTENSIONS.add("sh");
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync CHECKED_EXTENSIONS.add("bat");
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync CHECKED_EXTENSIONS.add("ldif");
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync CHECKED_EXTENSIONS.add("txt");
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync CHECKED_EXTENSIONS.add("c");
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync CHECKED_EXTENSIONS.add("h");
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync CHECKED_EXTENSIONS.add("mc");
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync CHECKED_EXTENSIONS.add("Makefile");
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync // The path to the directory that is the base of the workspace.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync private File workspacePath;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync // The set of files that appear to have problems with the EOL style.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync private LinkedList<String> eolStyleProblemFiles = new LinkedList<String>();
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync // The set of files that appear to have problems with the copyright date.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync private LinkedList<String> copyrightProblemFiles = new LinkedList<String>();
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync // The path to the root of the Subversion workspace to check.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync private String workspace = null;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync // The string representation of the current year.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync private String yearString;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync // The overall SVN Client Manager. required with svnkit 1.2.x
56db633f06f3070f792e84b806b77873e3e98404vboxsync private static SVNClientManager ourClientManager =
730f8be51b729e8a3c1e32c756cd0f4ec088dd4dvboxsync SVNClientManager.newInstance();
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync // The property client used to look at file properties.
18745d2ecb6a9d5f83c1c7a6f823847b9c3b4f57vboxsync private SVNWCClient propertyClient;
18745d2ecb6a9d5f83c1c7a6f823847b9c3b4f57vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync /**
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync * Specifies the path to the root of the Subversion workspace for which to
56db633f06f3070f792e84b806b77873e3e98404vboxsync * retrieve the revision number.
56db633f06f3070f792e84b806b77873e3e98404vboxsync *
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync * @param workspace The path to the root of the Subversion workspace for
18745d2ecb6a9d5f83c1c7a6f823847b9c3b4f57vboxsync * which to retrieve the revision number.
56db633f06f3070f792e84b806b77873e3e98404vboxsync */
56db633f06f3070f792e84b806b77873e3e98404vboxsync public void setWorkspace(String workspace)
18745d2ecb6a9d5f83c1c7a6f823847b9c3b4f57vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync this.workspace = workspace;
18745d2ecb6a9d5f83c1c7a6f823847b9c3b4f57vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync /**
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync * Performs the appropriate processing needed for this task. In this case,
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync * it uses SVNKit to identify all modified files in the current workspace.
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync * For all source files, look for comment lines containing the word
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * "copyright" and make sure at least one of them contains the current year.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
18745d2ecb6a9d5f83c1c7a6f823847b9c3b4f57vboxsync @Override()
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync public void execute()
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync if ((workspace == null) || (workspace.length() == 0))
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync workspacePath = getProject().getBaseDir();
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync else
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync {
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync workspacePath = new File(workspace);
18745d2ecb6a9d5f83c1c7a6f823847b9c3b4f57vboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync // Get the year to use in the determination.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync GregorianCalendar calendar = new GregorianCalendar();
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync int year = calendar.get(GregorianCalendar.YEAR);
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync yearString = String.valueOf(year);
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync // Process the base directory and all of its subdirectories.
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync propertyClient = ourClientManager.getWCClient();
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync try
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync {
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync ourClientManager.getStatusClient().doStatus(workspacePath, SVNRevision.WORKING,
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync SVNDepth.INFINITY, false, false, false, false, this, null);
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync }
610972deee47d5e5229ccdb6c86cbb332d2b4626vboxsync catch (Exception e)
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync e.printStackTrace();
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync System.err.println("WARNING: Encountered an error while examining " +
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync "Subversion status: " + e);
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync System.err.println("No further checks will be performed.");
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync return;
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync }
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync boolean fail = false;
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync if (! eolStyleProblemFiles.isEmpty())
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync System.err.println("WARNING: Potential svn:eol-style updates needed " +
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync "for the following files:");
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync for (String filename : eolStyleProblemFiles)
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync System.err.println(" " + filename);
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync String ignoreProp =
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync getProject().getProperty(IGNORE_EOLSTYLE_ERRORS_PROPERTY);
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if ((ignoreProp == null) || (! ignoreProp.equalsIgnoreCase("true")))
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync fail = true;
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync System.err.println("Fix svn:eol-style problems before proceeding, or " +
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync "use '-D" + IGNORE_EOLSTYLE_ERRORS_PROPERTY +
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync "=true' to ignore svn eol-style warnings.");
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if (! copyrightProblemFiles.isEmpty())
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync System.err.println("WARNING: Potential copyright year updates needed " +
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync "for the following files:");
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync for (String filename : copyrightProblemFiles)
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync System.err.println(" " + filename);
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync String ignoreProp =
da7386fee6ea74052fdce065965f745d7bc9522dvboxsync getProject().getProperty(IGNORE_COPYRIGHT_ERRORS_PROPERTY);
aa4cd5b56e5cf2c510a42ddc153bd0f1f0c64fbavboxsync if ((ignoreProp == null) || (! ignoreProp.equalsIgnoreCase("true")))
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync fail = true;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync System.err.println("Fix copyright date problems before proceeding, " +
aa4cd5b56e5cf2c510a42ddc153bd0f1f0c64fbavboxsync "or use '-D" + IGNORE_COPYRIGHT_ERRORS_PROPERTY +
7c19e11502220292d5270519296442234c2493cdvboxsync "=true' to ignore copyright warnings.");
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync if (fail)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync throw new BuildException();
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync /**
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync * Examines the provided status item to determine whether the associated file
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync * is acceptable.
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync *
7c19e11502220292d5270519296442234c2493cdvboxsync * @param status The SVN status information for the file of interest.
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync */
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync public void handleStatus(SVNStatus status)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync File file = status.getFile();
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync if ((! file.exists()) || (! file.isFile()))
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync // The file doesn't exist (which probably means it's been deleted) or
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync // isn't a regular file, so we'll ignore it.
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync return;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync String fileName = file.getName();
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync int lastPeriodPos = fileName.lastIndexOf('.');
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync if (lastPeriodPos > 0)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync String extension = fileName.substring(lastPeriodPos+1);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync if (! CHECKED_EXTENSIONS.contains(extension.toLowerCase()))
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync // The file doesn't have an extension that we care about, so skip it.
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync return;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync else
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync // The file doesn't have an extension. We'll still want to check it if
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync // it's in a resource/bin directory.
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync File parentDirectory = file.getParentFile();
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync if ((parentDirectory == null) ||
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync (! parentDirectory.getName().equals("bin")))
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync return;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync parentDirectory = parentDirectory.getParentFile();
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync if ((parentDirectory == null) ||
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync (! parentDirectory.getName().equals("resource")))
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync return;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync String filePath = file.getAbsolutePath();
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync if (filePath.startsWith(workspacePath.getPath() + "/"))
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync filePath = filePath.substring(workspacePath.getPath().length() + 1);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync // Check to make sure that the file has the correct EOL style.
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync try
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync SVNPropertyData propertyData =
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync propertyClient.doGetProperty(file, "svn:eol-style",
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync SVNRevision.BASE,
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync SVNRevision.WORKING);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync if ((propertyData == null) ||
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync (! propertyData.getValue().getString().equals("native")))
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync eolStyleProblemFiles.add(filePath);
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync catch (SVNException se)
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync {
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync // This could happen if the file isn't under version control. If so, then
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync // we can't check the eol-style but we should at least be able to check
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync // the copyright dates, so keep going.
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync // Check to see whether the file has a comment line containing a copyright
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync // without the current year.
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync BufferedReader reader = null;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync try
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync boolean copyrightFound = false;
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync boolean correctYearFound = false;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync reader = new BufferedReader(new FileReader(file));
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync String line = reader.readLine();
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync while (line != null)
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync {
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync String lowerLine = line.toLowerCase().trim();
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync if (isCommentLine(lowerLine))
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync {
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync int copyrightPos = lowerLine.indexOf("copyright");
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync if (copyrightPos > 0)
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync {
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync copyrightFound = true;
cbc215af8423a8326b27143c59c5d8fc9ffb0279vboxsync if (lowerLine.indexOf(yearString) > 0)
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync correctYearFound = true;
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync break;
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync }
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync }
892e4404b22b024dd58b9561787a5ac46a02b6c5vboxsync }
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync line = reader.readLine();
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync }
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync if (copyrightFound && (! correctYearFound))
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync {
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync copyrightProblemFiles.add(filePath);
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync catch (IOException ioe)
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync {
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync System.err.println("ERROR: Could not read file " + filePath +
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync " to check copyright date.");
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync System.err.println("No further copyright date checking will be " +
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync "performed.");
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync throw new RuntimeException();
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync finally
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync {
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync try
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync {
ece707b8d97e63ed54d4b48d7a8d841187e0023cvboxsync if (reader != null)
07557d07616212d7ba6e7ab3059e85cb14633775vboxsync {
2f4c1bacd54af5063c3185cc8eab03e4e8ef9b90vboxsync reader.close();
bcd589d9db90b68d3af5d6839c1d613bb64d4c04vboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync } catch (Exception e) {}
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync /**
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * Indicates whether the provided line appears to be a comment line. It will
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * check for a number of common comment indicators in Java source files,
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * shell scripts, XML files, and LDIF files.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync *
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * @param lowerLine The line to be checked. It should have been coverted to
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * all lowercase characters and any leading spaces
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * removed.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync *
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * @return {@code true} if it appears that the line is a comment line, or
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync * {@code false} if not.
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync */
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync private static boolean isCommentLine(String lowerLine)
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync if (lowerLine.startsWith("/*") ||
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync lowerLine.startsWith("*") ||
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync lowerLine.startsWith("//") ||
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync lowerLine.startsWith("#") ||
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync lowerLine.startsWith("rem") ||
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync lowerLine.startsWith("<!--") ||
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync lowerLine.startsWith("!"))
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync {
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync return true;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync }
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync else
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync {
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync return false;
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync }
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync }
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync}
6ba96ad7028e4d559a5998de4bab0b71a8251c99vboxsync
3a45119099f0df5230e8304145168aa5e2a3f1a1vboxsync