diff --git a/WHATSNEW b/WHATSNEW index b3fae78ad..d36276e95 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -75,6 +75,9 @@ Fixed bugs: * The Unix wrapper script failed if you invoked it as a relative symlink and ANT_HOME has not been set. Bugzilla Report 17721. +* and 's failonerror didn't apply to filesets pointing to + non-existant directories. Bugzilla Report 18414. + Other changes: -------------- * Shipped XML parser is now Xerces 2.4.0 diff --git a/src/main/org/apache/tools/ant/taskdefs/Copy.java b/src/main/org/apache/tools/ant/taskdefs/Copy.java index 87e181b48..bbbff5cd7 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Copy.java +++ b/src/main/org/apache/tools/ant/taskdefs/Copy.java @@ -263,9 +263,9 @@ public class Copy extends Task { * If false, note errors to the output but keep going. * @param failonerror true or false */ - public void setFailOnError(boolean failonerror) { - this.failonerror = failonerror; - } + public void setFailOnError(boolean failonerror) { + this.failonerror = failonerror; + } /** * Adds a set of files to copy. @@ -374,7 +374,19 @@ public class Copy extends Task { // deal with the filesets for (int i = 0; i < filesets.size(); i++) { FileSet fs = (FileSet) filesets.elementAt(i); - DirectoryScanner ds = fs.getDirectoryScanner(getProject()); + DirectoryScanner ds = null; + try { + ds = fs.getDirectoryScanner(getProject()); + } catch (BuildException e) { + if (failonerror + || !e.getMessage().endsWith(" not found.")) { + throw e; + } else { + log("Warning: " + e.getMessage()); + continue; + } + } + File fromDir = fs.getDir(getProject()); String[] srcFiles = ds.getIncludedFiles(); @@ -405,66 +417,66 @@ public class Copy extends Task { } } -//************************************************************************ -// protected and private methods -//************************************************************************ - - /** - * Ensure we have a consistent and legal set of attributes, and set - * any internal flags necessary based on different combinations - * of attributes. - */ - protected void validateAttributes() throws BuildException { - if (file == null && filesets.size() == 0) { - throw new BuildException("Specify at least one source " - + "- a file or a fileset."); - } - - if (destFile != null && destDir != null) { - throw new BuildException("Only one of tofile and todir " - + "may be set."); - } + //************************************************************************ + // protected and private methods + //************************************************************************ + + /** + * Ensure we have a consistent and legal set of attributes, and set + * any internal flags necessary based on different combinations + * of attributes. + */ + protected void validateAttributes() throws BuildException { + if (file == null && filesets.size() == 0) { + throw new BuildException("Specify at least one source " + + "- a file or a fileset."); + } - if (destFile == null && destDir == null) { - throw new BuildException("One of tofile or todir must be set."); - } + if (destFile != null && destDir != null) { + throw new BuildException("Only one of tofile and todir " + + "may be set."); + } - if (file != null && file.exists() && file.isDirectory()) { - throw new BuildException("Use a fileset to copy directories."); - } + if (destFile == null && destDir == null) { + throw new BuildException("One of tofile or todir must be set."); + } - if (destFile != null && filesets.size() > 0) { - if (filesets.size() > 1) { - throw new BuildException( - "Cannot concatenate multiple files into a single file."); - } else { - FileSet fs = (FileSet) filesets.elementAt(0); - DirectoryScanner ds = fs.getDirectoryScanner(getProject()); - String[] srcFiles = ds.getIncludedFiles(); + if (file != null && file.exists() && file.isDirectory()) { + throw new BuildException("Use a fileset to copy directories."); + } - if (srcFiles.length == 0) { + if (destFile != null && filesets.size() > 0) { + if (filesets.size() > 1) { throw new BuildException( - "Cannot perform operation from directory to file."); - } else if (srcFiles.length == 1) { - if (file == null) { - file = new File(ds.getBasedir(), srcFiles[0]); - filesets.removeElementAt(0); + "Cannot concatenate multiple files into a single file."); + } else { + FileSet fs = (FileSet) filesets.elementAt(0); + DirectoryScanner ds = fs.getDirectoryScanner(getProject()); + String[] srcFiles = ds.getIncludedFiles(); + + if (srcFiles.length == 0) { + throw new BuildException( + "Cannot perform operation from directory to file."); + } else if (srcFiles.length == 1) { + if (file == null) { + file = new File(ds.getBasedir(), srcFiles[0]); + filesets.removeElementAt(0); + } else { + throw new BuildException("Cannot concatenate multiple " + + "files into a single file."); + } } else { throw new BuildException("Cannot concatenate multiple " + "files into a single file."); } - } else { - throw new BuildException("Cannot concatenate multiple " - + "files into a single file."); } } - } - if (destFile != null) { - destDir = fileUtils.getParentFile(destFile); - } + if (destFile != null) { + destDir = fileUtils.getParentFile(destFile); + } - } + } /** * Compares source files to destination files to see if they should be