PR: 12700 Submitted by: Gus Heck <gus dot heck at olin dot edu> git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274554 13f79535-47bb-0310-9956-ffa450edef68master
@@ -302,6 +302,9 @@ Other changes: | |||||
in <vajload> by using special wildcard characters. Also fixes | in <vajload> by using special wildcard characters. Also fixes | ||||
Bugzilla Report 2236. | Bugzilla Report 2236. | ||||
* Users can now modify the list of default excludes using the new | |||||
defaultexcludes task. Bugzilla Report 12700. | |||||
Changes from Ant 1.5.2 to Ant 1.5.3 | Changes from Ant 1.5.2 to Ant 1.5.3 | ||||
=================================== | =================================== | ||||
@@ -0,0 +1,73 @@ | |||||
<html> | |||||
<head> | |||||
<meta http-equiv="Content-Language" content="en-us"> | |||||
<title>DefaultExcludes Task</title> | |||||
</head> | |||||
<body> | |||||
<h2><a name="echo">DefaultExcludes</a></h2> | |||||
<p><em>since Ant 1.6</em></p> | |||||
<h3>Description</h3> | |||||
<p>Alters the default excludes for all subsequent processing in the | |||||
build, and prints out the current default excludes if desired. | |||||
<h3>Parameters</h3> | |||||
<table border="1" cellpadding="2" cellspacing="0"> | |||||
<tr> | |||||
<td valign="top"><b>Attribute</b></td> | |||||
<td valign="top"><b>Description</b></td> | |||||
<td align="center" valign="top"><b>Required</b></td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">echo</td> | |||||
<td valign="top">whether or not to print out the default excludes.(defaults to false)</td> | |||||
<td valign="top" align="center">atribute "true" required if no | |||||
other argument specified</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">add</td> | |||||
<td valign="top">the pattern to add to the default excludes</td> | |||||
<td valign="top" align="center">if no other atribute is specified</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">remove</td> | |||||
<td valign="top">remove the specified pattern from the default excludes</td> | |||||
<td valign="top" align="center">if no other atribute is specified</td> | |||||
</tr> | |||||
</table> | |||||
<h3>Examples</h3> | |||||
<p>Print out the default excludes</p> | |||||
<pre> <defaultexcludes echo="true"/></pre> | |||||
<p>Print out the default excludes and exclude all *.bak files in | |||||
<strong>all</strong> further processing</p> | |||||
<pre> <defaultexcludes echo="true" add="**/*.bak"/></pre> | |||||
<p>Silently allow several fileset based tasks to operate on emacs | |||||
backup files and then restore normal behavior</p> | |||||
<pre> | |||||
<defaultexcludes remove="**/*~"/> | |||||
(do several fileset based tasks here) | |||||
<defaultexcludes add="**/*~"/> | |||||
</pre> | |||||
<hr> | |||||
<p align="center">Copyright © 2003 Apache Software Foundation. All rights | |||||
Reserved.</p> | |||||
</body> | |||||
</html> | |||||
@@ -36,6 +36,7 @@ | |||||
<a href="CoreTasks/changelog.html">CvsChangeLog</a><br> | <a href="CoreTasks/changelog.html">CvsChangeLog</a><br> | ||||
<a href="CoreTasks/cvspass.html">CVSPass</a><br> | <a href="CoreTasks/cvspass.html">CVSPass</a><br> | ||||
<a href="CoreTasks/cvstagdiff.html">CvsTagDiff</a><br> | <a href="CoreTasks/cvstagdiff.html">CvsTagDiff</a><br> | ||||
<a href="CoreTasks/defaultexcludes.html">Defaultexcludes</a><br> | |||||
<a href="CoreTasks/delete.html">Delete</a><br> | <a href="CoreTasks/delete.html">Delete</a><br> | ||||
<a href="CoreTasks/deltree.html"><i>Deltree</i></a><br> | <a href="CoreTasks/deltree.html"><i>Deltree</i></a><br> | ||||
<a href="CoreTasks/dependset.html">Dependset</a><br> | <a href="CoreTasks/dependset.html">Dependset</a><br> | ||||
@@ -261,8 +261,14 @@ directory-based tasks. They are:</p> | |||||
**/.svn/** | **/.svn/** | ||||
**/.DS_Store | **/.DS_Store | ||||
</pre> | </pre> | ||||
<p>If you do not want these default excludes applied, you may disable them | |||||
with the <code>defaultexcludes="no"</code> attribute.</p> | |||||
<p>If you do not want these default excludes applied, you may disable | |||||
them with the <code>defaultexcludes="no"</code> | |||||
attribute.</p> | |||||
<p>This is the default list, note that you can modify the list of | |||||
default excludes by using the <a | |||||
href="CoreTasks/defaultexcludes.html">defaultexcludes</a> task.</p> | |||||
<hr> | <hr> | ||||
<p align="center">Copyright © 2000-2003 Apache Software Foundation. All | <p align="center">Copyright © 2000-2003 Apache Software Foundation. All | ||||
rights Reserved.</p> | rights Reserved.</p> | ||||
@@ -0,0 +1,19 @@ | |||||
<?xml version="1.0"?> | |||||
<project name="echo-test" basedir="." default="test1"> | |||||
<target name="test1"> | |||||
<defaultexcludes echo="true"/> | |||||
</target> | |||||
<target name="test2"> | |||||
<defaultexcludes add="foo" echo="true"/> | |||||
<defaultexcludes remove="foo" echo="false"/> | |||||
</target> | |||||
<target name="test3"> | |||||
<defaultexcludes remove="**/CVS" echo="true"/> | |||||
<defaultexcludes add="**/CVS" echo="false"/> | |||||
</target> | |||||
</project> |
@@ -155,38 +155,34 @@ import org.apache.tools.ant.util.FileUtils; | |||||
public class DirectoryScanner | public class DirectoryScanner | ||||
implements FileScanner, SelectorScanner, ResourceFactory { | implements FileScanner, SelectorScanner, ResourceFactory { | ||||
/** | /** | ||||
* Patterns which should be excluded by default. | * Patterns which should be excluded by default. | ||||
* | * | ||||
* @see #addDefaultExcludes() | * @see #addDefaultExcludes() | ||||
*/ | */ | ||||
protected static final String[] DEFAULTEXCLUDES = { | |||||
// Miscellaneous typical temporary files | |||||
"**/*~", | |||||
"**/#*#", | |||||
"**/.#*", | |||||
"**/%*%", | |||||
"**/._*", | |||||
private static Vector defaultExcludes = new Vector(); | |||||
// CVS | |||||
"**/CVS", | |||||
"**/CVS/**", | |||||
"**/.cvsignore", | |||||
static { | |||||
defaultExcludes.add("**/*~"); | |||||
defaultExcludes.add("**/#*#"); | |||||
defaultExcludes.add("**/.#*"); | |||||
defaultExcludes.add("**/%*%"); | |||||
defaultExcludes.add("**/._*"); | |||||
// SCCS | |||||
"**/SCCS", | |||||
"**/SCCS/**", | |||||
defaultExcludes.add("**/CVS"); | |||||
defaultExcludes.add("**/CVS/**"); | |||||
defaultExcludes.add("**/.cvsignore"); | |||||
// Visual SourceSafe | |||||
"**/vssver.scc", | |||||
defaultExcludes.add("**/SCCS"); | |||||
defaultExcludes.add("**/SCCS/**"); | |||||
// Subversion | |||||
"**/.svn", | |||||
"**/.svn/**", | |||||
defaultExcludes.add("**/vssver.scc"); | |||||
// Mac | |||||
"**/.DS_Store" | |||||
}; | |||||
defaultExcludes.add("**/.svn"); | |||||
defaultExcludes.add("**/.svn/**"); | |||||
defaultExcludes.add("**/.DS_Store"); | |||||
} | |||||
/** The base directory to be scanned. */ | /** The base directory to be scanned. */ | ||||
protected File basedir; | protected File basedir; | ||||
@@ -381,6 +377,48 @@ public class DirectoryScanner | |||||
return SelectorUtils.match(pattern, str, isCaseSensitive); | return SelectorUtils.match(pattern, str, isCaseSensitive); | ||||
} | } | ||||
/** | |||||
* Get the list of patterns that should be excluded by default. | |||||
* | |||||
* @return An array of <code>String</code> based on the current | |||||
* contents of the <code>defaultExcludes</code> | |||||
* <code>Vector</code>. | |||||
*/ | |||||
public static String[] getDefaultExcludes() { | |||||
return (String[]) defaultExcludes.toArray(new String[defaultExcludes.size()]); | |||||
} | |||||
/** | |||||
* Add a pattern to the default excludes unless it is already a | |||||
* default exclude. | |||||
* | |||||
* @param s A string to add as an exclude pattern. | |||||
* @return <code>true</code> if the string was added | |||||
* <code>false</code> if it already | |||||
* existed. | |||||
*/ | |||||
public static boolean addDefaultExclude(String s){ | |||||
if (defaultExcludes.indexOf(s) == -1) { | |||||
defaultExcludes.add(s); | |||||
return true; | |||||
} | |||||
return false; | |||||
} | |||||
/** | |||||
* Remove a string if it is a default exclude. | |||||
* | |||||
* @param s The string to attempt to remove. | |||||
* @return <code>true</code> if <code>s</code> was a default | |||||
* exclude (and thus was removed), | |||||
* <code>false</code> if <code>s</code> was not | |||||
* in the default excludes list to begin with | |||||
*/ | |||||
public static boolean removeDefaultExclude(String s) { | |||||
return defaultExcludes.remove(s); | |||||
} | |||||
/** | /** | ||||
* Sets the base directory to be scanned. This is the directory which is | * Sets the base directory to be scanned. This is the directory which is | ||||
* scanned recursively. All '/' and '\' characters are replaced by | * scanned recursively. All '/' and '\' characters are replaced by | ||||
@@ -938,13 +976,15 @@ public class DirectoryScanner | |||||
public void addDefaultExcludes() { | public void addDefaultExcludes() { | ||||
int excludesLength = excludes == null ? 0 : excludes.length; | int excludesLength = excludes == null ? 0 : excludes.length; | ||||
String[] newExcludes; | String[] newExcludes; | ||||
newExcludes = new String[excludesLength + DEFAULTEXCLUDES.length]; | |||||
newExcludes = new String[excludesLength + defaultExcludes.size()]; | |||||
if (excludesLength > 0) { | if (excludesLength > 0) { | ||||
System.arraycopy(excludes, 0, newExcludes, 0, excludesLength); | System.arraycopy(excludes, 0, newExcludes, 0, excludesLength); | ||||
} | } | ||||
for (int i = 0; i < DEFAULTEXCLUDES.length; i++) { | |||||
newExcludes[i + excludesLength] = DEFAULTEXCLUDES[i].replace('/', | |||||
File.separatorChar).replace('\\', File.separatorChar); | |||||
String[] defaultExcludesTemp = getDefaultExcludes(); | |||||
for (int i = 0; i < defaultExcludesTemp.length; i++) { | |||||
newExcludes[i + excludesLength] = defaultExcludesTemp[i]. | |||||
replace('/', File.separatorChar). | |||||
replace('\\', File.separatorChar); | |||||
} | } | ||||
excludes = newExcludes; | excludes = newExcludes; | ||||
} | } | ||||
@@ -0,0 +1,139 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2003 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "Ant" and "Apache Software | |||||
* Foundation" must not be used to endorse or promote products derived | |||||
* from this software without prior written permission. For written | |||||
* permission, please contact apache@apache.org. | |||||
* | |||||
* 5. Products derived from this software may not be called "Apache" | |||||
* nor may "Apache" appear in their names without prior written | |||||
* permission of the Apache Group. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
* SUCH DAMAGE. | |||||
* ==================================================================== | |||||
* | |||||
* This software consists of voluntary contributions made by many | |||||
* individuals on behalf of the Apache Software Foundation. For more | |||||
* information on the Apache Software Foundation, please see | |||||
* <http://www.apache.org/>. | |||||
*/ | |||||
package org.apache.tools.ant.taskdefs; | |||||
import org.apache.tools.ant.Task; | |||||
import org.apache.tools.ant.Project; | |||||
import org.apache.tools.ant.BuildException; | |||||
import org.apache.tools.ant.DirectoryScanner; | |||||
import org.apache.tools.ant.types.EnumeratedAttribute; | |||||
/** | |||||
* Alters the default excludes for the <strong>entire</strong> build.. | |||||
* | |||||
* @author Gus Heck <gus.heck@olin.edu> | |||||
* | |||||
* @since Ant 1.6 | |||||
* | |||||
* @ant.task category="utility" | |||||
*/ | |||||
public class DefaultExcludes extends Task { | |||||
private String add = ""; | |||||
private String remove = ""; | |||||
private boolean echo = false; | |||||
// by default, messages are always displayed | |||||
private int logLevel = Project.MSG_WARN; | |||||
/** | |||||
* Does the work. | |||||
* | |||||
* @exception BuildException if someting goes wrong with the build | |||||
*/ | |||||
public void execute() throws BuildException { | |||||
if (add.equals("") && remove.equals("") && (echo == false)) { | |||||
throw new BuildException("<defaultexcludes> task must set "+ | |||||
"at least one atribute (echo=\"false\""+ | |||||
" doesn't count since that is the "+ | |||||
"default"); | |||||
} | |||||
if (!add.equals("")) { | |||||
DirectoryScanner.addDefaultExclude(add); | |||||
} | |||||
if (!remove.equals("")) { | |||||
DirectoryScanner.removeDefaultExclude(remove); | |||||
} | |||||
if (echo == true) { | |||||
StringBuffer message = new StringBuffer("Current Default "+ | |||||
"Excludes:\n"); | |||||
String[] excludes = DirectoryScanner.getDefaultExcludes(); | |||||
for (int i=0;i<excludes.length;i++) { | |||||
message.append(" " + excludes[i] + "\n"); | |||||
} | |||||
log(message.toString(), logLevel); | |||||
} | |||||
} | |||||
/** | |||||
* Pattern to add to the default excludes | |||||
* | |||||
* @param add Sets the value for the pattern to exclude. | |||||
*/ | |||||
public void setAdd(String add) { | |||||
this.add = add; | |||||
} | |||||
/** | |||||
* Pattern to remove from the default excludes. | |||||
* | |||||
* @param msg Sets the value for the pattern that | |||||
* should nolonger be excluded. | |||||
*/ | |||||
public void setRemove(String remove) { | |||||
this.remove = remove; | |||||
} | |||||
/** | |||||
* If true, echo the default excludes. | |||||
* | |||||
* @param echo whether or not to echo the contents of | |||||
* the default excludes. | |||||
*/ | |||||
public void setEcho(boolean echo) { | |||||
this.echo = echo; | |||||
} | |||||
} |
@@ -75,6 +75,7 @@ import=org.apache.tools.ant.taskdefs.ImportTask | |||||
whichresource=org.apache.tools.ant.taskdefs.WhichResource | whichresource=org.apache.tools.ant.taskdefs.WhichResource | ||||
subant=org.apache.tools.ant.taskdefs.SubAnt | subant=org.apache.tools.ant.taskdefs.SubAnt | ||||
sync=org.apache.tools.ant.taskdefs.Sync | sync=org.apache.tools.ant.taskdefs.Sync | ||||
defaultexcludes=org.apache.tools.ant.taskdefs.DefaultExcludes | |||||
# optional tasks | # optional tasks | ||||
image=org.apache.tools.ant.taskdefs.optional.image.Image | image=org.apache.tools.ant.taskdefs.optional.image.Image | ||||
@@ -0,0 +1,129 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2003 The Apache Software Foundation. All rights | |||||
* reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the | |||||
* distribution. | |||||
* | |||||
* 3. The end-user documentation included with the redistribution, if | |||||
* any, must include the following acknowlegement: | |||||
* "This product includes software developed by the | |||||
* Apache Software Foundation (http://www.apache.org/)." | |||||
* Alternately, this acknowlegement may appear in the software itself, | |||||
* if and wherever such third-party acknowlegements normally appear. | |||||
* | |||||
* 4. The names "Ant" and "Apache Software | |||||
* Foundation" must not be used to endorse or promote products derived | |||||
* from this software without prior written permission. For written | |||||
* permission, please contact apache@apache.org. | |||||
* | |||||
* 5. Products derived from this software may not be called "Apache" | |||||
* nor may "Apache" appear in their names without prior written | |||||
* permission of the Apache Group. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
* SUCH DAMAGE. | |||||
* ==================================================================== | |||||
* | |||||
* This software consists of voluntary contributions made by many | |||||
* individuals on behalf of the Apache Software Foundation. For more | |||||
* information on the Apache Software Foundation, please see | |||||
* <http://www.apache.org/>. | |||||
*/ | |||||
package org.apache.tools.ant.taskdefs; | |||||
import org.apache.tools.ant.BuildFileTest; | |||||
/** | |||||
* @author Gus Heck <gus.heck@olin.edu> | |||||
*/ | |||||
public class DefaultExcludesTest extends BuildFileTest { | |||||
public DefaultExcludesTest(String name) { | |||||
super(name); | |||||
} | |||||
public void setUp() { | |||||
configureProject("src/etc/testcases/taskdefs/defaultexcludes.xml"); | |||||
} | |||||
// Output the default excludes | |||||
public void test1() { | |||||
expectLog("test1", "Current Default Excludes:\n"+ | |||||
" **/*~\n"+ | |||||
" **/#*#\n"+ | |||||
" **/.#*\n"+ | |||||
" **/%*%\n"+ | |||||
" **/._*\n"+ | |||||
" **/CVS\n"+ | |||||
" **/CVS/**\n"+ | |||||
" **/.cvsignore\n"+ | |||||
" **/SCCS\n"+ | |||||
" **/SCCS/**\n"+ | |||||
" **/vssver.scc\n"+ | |||||
" **/.svn\n"+ | |||||
" **/.svn/**\n"+ | |||||
" **/.DS_Store\n"); | |||||
} | |||||
// adding something to the excludes' | |||||
public void test2() { | |||||
expectLog("test2", "Current Default Excludes:\n"+ | |||||
" **/*~\n"+ | |||||
" **/#*#\n"+ | |||||
" **/.#*\n"+ | |||||
" **/%*%\n"+ | |||||
" **/._*\n"+ | |||||
" **/CVS\n"+ | |||||
" **/CVS/**\n"+ | |||||
" **/.cvsignore\n"+ | |||||
" **/SCCS\n"+ | |||||
" **/SCCS/**\n"+ | |||||
" **/vssver.scc\n"+ | |||||
" **/.svn\n"+ | |||||
" **/.svn/**\n"+ | |||||
" **/.DS_Store\n"+ | |||||
" foo\n"); // foo added | |||||
} | |||||
// removing something from the defaults | |||||
public void test3() { | |||||
expectLog("test3", "Current Default Excludes:\n"+ | |||||
" **/*~\n"+ | |||||
" **/#*#\n"+ | |||||
" **/.#*\n"+ | |||||
" **/%*%\n"+ | |||||
" **/._*\n"+ | |||||
//CVS missing | |||||
" **/CVS/**\n"+ | |||||
" **/.cvsignore\n"+ | |||||
" **/SCCS\n"+ | |||||
" **/SCCS/**\n"+ | |||||
" **/vssver.scc\n"+ | |||||
" **/.svn\n"+ | |||||
" **/.svn/**\n"+ | |||||
" **/.DS_Store\n"); | |||||
} | |||||
} |