Browse Source

A new task that allows users to modify the list of default excludes.

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-ffa450edef68
master
Stefan Bodewig 22 years ago
parent
commit
f1bc629e34
9 changed files with 439 additions and 28 deletions
  1. +3
    -0
      WHATSNEW
  2. +73
    -0
      docs/manual/CoreTasks/defaultexcludes.html
  3. +1
    -0
      docs/manual/coretasklist.html
  4. +8
    -2
      docs/manual/dirtasks.html
  5. +19
    -0
      src/etc/testcases/taskdefs/defaultexcludes.xml
  6. +66
    -26
      src/main/org/apache/tools/ant/DirectoryScanner.java
  7. +139
    -0
      src/main/org/apache/tools/ant/taskdefs/DefaultExcludes.java
  8. +1
    -0
      src/main/org/apache/tools/ant/taskdefs/defaults.properties
  9. +129
    -0
      src/testcases/org/apache/tools/ant/taskdefs/DefaultExcludesTest.java

+ 3
- 0
WHATSNEW View File

@@ -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
=================================== ===================================




+ 73
- 0
docs/manual/CoreTasks/defaultexcludes.html View File

@@ -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> &lt;defaultexcludes echo=&quot;true&quot;/&gt;</pre>

<p>Print out the default excludes and exclude all *.bak files in
<strong>all</strong> further processing</p>

<pre> &lt;defaultexcludes echo=&quot;true&quot; add=&quot;**/*.bak&quot;/&gt;</pre>

<p>Silently allow several fileset based tasks to operate on emacs
backup files and then restore normal behavior</p>

<pre>
&lt;defaultexcludes remove=&quot;**/*~&quot;/&gt;

(do several fileset based tasks here)

&lt;defaultexcludes add=&quot;**/*~&quot;/&gt;
</pre>


<hr>

<p align="center">Copyright &copy; 2003 Apache Software Foundation. All rights
Reserved.</p>

</body>
</html>


+ 1
- 0
docs/manual/coretasklist.html View File

@@ -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>


+ 8
- 2
docs/manual/dirtasks.html View File

@@ -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=&quot;no&quot;</code> attribute.</p>
<p>If you do not want these default excludes applied, you may disable
them with the <code>defaultexcludes=&quot;no&quot;</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 &copy; 2000-2003 Apache Software Foundation. All <p align="center">Copyright &copy; 2000-2003 Apache Software Foundation. All
rights Reserved.</p> rights Reserved.</p>


+ 19
- 0
src/etc/testcases/taskdefs/defaultexcludes.xml View File

@@ -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>

+ 66
- 26
src/main/org/apache/tools/ant/DirectoryScanner.java View File

@@ -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;
} }


+ 139
- 0
src/main/org/apache/tools/ant/taskdefs/DefaultExcludes.java View File

@@ -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 &lt;gus.heck@olin.edu&gt;
*
* @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;
}


}

+ 1
- 0
src/main/org/apache/tools/ant/taskdefs/defaults.properties View File

@@ -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


+ 129
- 0
src/testcases/org/apache/tools/ant/taskdefs/DefaultExcludesTest.java View File

@@ -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");
}
}

Loading…
Cancel
Save