diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 21aaf7e13..aebba5de4 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -232,6 +232,7 @@ Ronen Mashal Russell Gold Sam Ruby Scott Carlson +Scott Ellsworth Scott M. Stirling Sean Egan Sean P. Kane diff --git a/WHATSNEW b/WHATSNEW index fa19f869c..48e944af8 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -223,6 +223,9 @@ Other changes: * has a new attribute - includeDestClasses. Bugzilla 40776. +* has a new attribute - errorOnMissingDir. + Bugzilla 11270. + Changes from Ant 1.6.5 to Ant 1.7.0 =================================== diff --git a/contributors.xml b/contributors.xml index ad210e2ba..565a50580 100644 --- a/contributors.xml +++ b/contributors.xml @@ -923,6 +923,10 @@ Scott Carlson + + Scott + Ellsworth + Scott M. diff --git a/docs/manual/CoreTypes/fileset.html b/docs/manual/CoreTypes/fileset.html index 935355fe2..2a3eed383 100644 --- a/docs/manual/CoreTypes/fileset.html +++ b/docs/manual/CoreTypes/fileset.html @@ -98,6 +98,15 @@ equivalent to an <and> selector container.

true. See the note below. No + + erroronmissingdir + + Specify what happens if the base directory does not exist. + If true a build error will happen, if false, the fileset + will be ignored. + true. + No +

Note: All files/directories for which diff --git a/src/main/org/apache/tools/ant/DirectoryScanner.java b/src/main/org/apache/tools/ant/DirectoryScanner.java index 70e4ec65a..1af30d6f1 100644 --- a/src/main/org/apache/tools/ant/DirectoryScanner.java +++ b/src/main/org/apache/tools/ant/DirectoryScanner.java @@ -251,6 +251,12 @@ public class DirectoryScanner */ protected boolean isCaseSensitive = true; + /** + * Whether a missing base directory is an error. + * @since Ant 1.7.1 + */ + protected boolean errorOnMissingDir = true; + /** * Whether or not symbolic links should be followed. * @@ -609,6 +615,17 @@ public class DirectoryScanner this.isCaseSensitive = isCaseSensitive; } + /** + * Sets whether or not a missing base directory is an error + * + * @param errorOnMissingDir whether or not a missing base directory + * is an error + * @since Ant 1.7.1 + */ + public void setErrorOnMissingDir(boolean errorOnMissingDir) { + this.errorOnMissingDir = errorOnMissingDir; + } + /** * Get whether or not a DirectoryScanner follows symbolic links. * @@ -790,8 +807,13 @@ public class DirectoryScanner } } else { if (!basedir.exists()) { - illegal = new IllegalStateException("basedir " + basedir - + " does not exist"); + if (errorOnMissingDir) { + illegal = new IllegalStateException( + "basedir " + basedir + " does not exist"); + } else { + // Nothing to do - basedir does not exist + return; + } } if (!basedir.isDirectory()) { illegal = new IllegalStateException("basedir " + basedir diff --git a/src/main/org/apache/tools/ant/types/AbstractFileSet.java b/src/main/org/apache/tools/ant/types/AbstractFileSet.java index e81da1213..3914dfbd6 100644 --- a/src/main/org/apache/tools/ant/types/AbstractFileSet.java +++ b/src/main/org/apache/tools/ant/types/AbstractFileSet.java @@ -65,6 +65,7 @@ public abstract class AbstractFileSet extends DataType private boolean useDefaultExcludes = true; private boolean caseSensitive = true; private boolean followSymlinks = true; + private boolean errorOnMissingDir = true; /* cached DirectoryScanner instance for our own Project only */ private DirectoryScanner directoryScanner = null; @@ -89,6 +90,7 @@ public abstract class AbstractFileSet extends DataType this.useDefaultExcludes = fileset.useDefaultExcludes; this.caseSensitive = fileset.caseSensitive; this.followSymlinks = fileset.followSymlinks; + this.errorOnMissingDir = fileset.errorOnMissingDir; setProject(fileset.getProject()); } @@ -392,6 +394,16 @@ public abstract class AbstractFileSet extends DataType ? getRef(getProject()).isFollowSymlinks() : followSymlinks; } + /** + * Sets whether an error is thrown if a directory does not exist. + * + * @param errorOnMissingDir true if missing directories cause errors, + * false if not. + */ + public void setErrorOnMissingDir(boolean errorOnMissingDir) { + this.errorOnMissingDir = errorOnMissingDir; + } + /** * Returns the directory scanner needed to access the files to process. * @return a DirectoryScanner instance. @@ -418,17 +430,18 @@ public abstract class AbstractFileSet extends DataType throw new BuildException("No directory specified for " + getDataTypeName() + "."); } - if (!dir.exists()) { + if (!dir.exists() && errorOnMissingDir) { throw new BuildException(dir.getAbsolutePath() + " not found."); } - if (!dir.isDirectory()) { + if (!dir.isDirectory() && dir.exists()) { throw new BuildException(dir.getAbsolutePath() + " is not a directory."); } ds = new DirectoryScanner(); setupDirectoryScanner(ds, p); ds.setFollowSymlinks(followSymlinks); + ds.setErrorOnMissingDir(errorOnMissingDir); directoryScanner = (p == getProject()) ? ds : directoryScanner; } } diff --git a/src/tests/antunit/types/fileset-test.xml b/src/tests/antunit/types/fileset-test.xml index cf909cddc..18e45716e 100644 --- a/src/tests/antunit/types/fileset-test.xml +++ b/src/tests/antunit/types/fileset-test.xml @@ -1,5 +1,15 @@ + + + + + + + + +