diff --git a/WHATSNEW b/WHATSNEW index 39f04b6d8..e70a43da2 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -539,6 +539,11 @@ Other changes: can be applied to arbitrary resource collections. Bugzilla Report 4240. + * and have a new attribute + errorOnMissingArchive that allows "optional" filesets that don't + break the build if the archive doesn't exist. + Bugzilla Report 46091. + Changes from Ant 1.7.0 TO Ant 1.7.1 ============================================= diff --git a/docs/manual/CoreTypes/tarfileset.html b/docs/manual/CoreTypes/tarfileset.html index 920d02470..bf964a20c 100644 --- a/docs/manual/CoreTypes/tarfileset.html +++ b/docs/manual/CoreTypes/tarfileset.html @@ -117,6 +117,17 @@ directories. Default is 755. No + + erroronmissingarchive + + Specify what happens if the archive does not exist. + If true, a build error will happen; if false, the fileset + will be ignored/empty. + Defaults to true. + Since Ant 1.8.0 + + No +

The fullpath attribute can only be set for filesets that diff --git a/docs/manual/CoreTypes/zipfileset.html b/docs/manual/CoreTypes/zipfileset.html index 75fd53f91..bdb8ce632 100644 --- a/docs/manual/CoreTypes/zipfileset.html +++ b/docs/manual/CoreTypes/zipfileset.html @@ -98,6 +98,17 @@ directories. Default is 755. since Ant 1.5.2. Only supported by zipfileset. No + + erroronmissingarchive + + Specify what happens if the archive does not exist. + If true, a build error will happen; if false, the fileset + will be ignored/empty. + Defaults to true. + Since Ant 1.8.0 + + No +

The fullpath attribute can only be set for filesets that diff --git a/src/main/org/apache/tools/ant/types/ArchiveFileSet.java b/src/main/org/apache/tools/ant/types/ArchiveFileSet.java index 29ae4d803..058ba960b 100755 --- a/src/main/org/apache/tools/ant/types/ArchiveFileSet.java +++ b/src/main/org/apache/tools/ant/types/ArchiveFileSet.java @@ -68,6 +68,8 @@ public abstract class ArchiveFileSet extends FileSet { private static final String ERROR_DIR_AND_SRC_ATTRIBUTES = "Cannot set both dir and src attributes"; private static final String ERROR_PATH_AND_PREFIX = "Cannot set both fullpath and prefix attributes"; + private boolean errorOnMissingArchive = true; + /** Constructor for ArchiveFileSet */ public ArchiveFileSet() { super(); @@ -95,6 +97,7 @@ public abstract class ArchiveFileSet extends FileSet { dirMode = fileset.dirMode; fileModeHasBeenSet = fileset.fileModeHasBeenSet; dirModeHasBeenSet = fileset.dirModeHasBeenSet; + errorOnMissingArchive = fileset.errorOnMissingArchive; } /** @@ -161,6 +164,18 @@ public abstract class ArchiveFileSet extends FileSet { return getSrc(); } + /** + * Sets whether an error is thrown if an archive does not exist. + * + * @param errorOnMissingArchive true if missing archives cause errors, + * false if not. + * @since Ant 1.8.0 + */ + public void setErrorOnMissingArchive(boolean errorOnMissingArchive) { + checkAttributesAllowed(); + this.errorOnMissingArchive = errorOnMissingArchive; + } + /** * Get the archive file from which entries will be extracted. * @return the archive in case the archive is a file, null otherwise. @@ -247,7 +262,7 @@ public abstract class ArchiveFileSet extends FileSet { if (src == null) { return super.getDirectoryScanner(p); } - if (!src.isExists()) { + if (!src.isExists() && errorOnMissingArchive) { throw new BuildException( "The archive " + src.getName() + " doesn't exist"); } @@ -256,6 +271,7 @@ public abstract class ArchiveFileSet extends FileSet { + " can't be a directory"); } ArchiveScanner as = newArchiveScanner(); + as.setErrorOnMissingArchive(errorOnMissingArchive); as.setSrc(src); super.setDir(p.getBaseDir()); setupDirectoryScanner(as, p); diff --git a/src/main/org/apache/tools/ant/types/ArchiveScanner.java b/src/main/org/apache/tools/ant/types/ArchiveScanner.java index 9ad3df314..c7ec2ae7e 100755 --- a/src/main/org/apache/tools/ant/types/ArchiveScanner.java +++ b/src/main/org/apache/tools/ant/types/ArchiveScanner.java @@ -86,12 +86,28 @@ public abstract class ArchiveScanner extends DirectoryScanner { */ private String encoding; + /** + * @since Ant 1.8.0 + */ + private boolean errorOnMissingArchive = true; + + /** + * Sets whether an error is thrown if an archive does not exist. + * + * @param errorOnMissingArchive true if missing archives cause errors, + * false if not. + * @since Ant 1.8.0 + */ + public void setErrorOnMissingArchive(boolean errorOnMissingArchive) { + this.errorOnMissingArchive = errorOnMissingArchive; + } + /** * Don't scan when we have no zipfile. * @since Ant 1.7 */ public void scan() { - if (src == null) { + if (src == null || (!src.isExists() && !errorOnMissingArchive)) { return; } super.scan(); @@ -304,6 +320,10 @@ public abstract class ArchiveScanner extends DirectoryScanner { * are put into the appropriate tables. */ private void scanme() { + if (!src.isExists() && !errorOnMissingArchive) { + return; + } + //do not use a FileResource b/c it pulls File info from the filesystem: Resource thisresource = new Resource(src.getName(), src.isExists(), diff --git a/src/tests/antunit/types/tarfileset-test.xml b/src/tests/antunit/types/tarfileset-test.xml new file mode 100644 index 000000000..02a2e6788 --- /dev/null +++ b/src/tests/antunit/types/tarfileset-test.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/antunit/types/zipfileset-test.xml b/src/tests/antunit/types/zipfileset-test.xml index f591fab4e..c8bb022b1 100644 --- a/src/tests/antunit/types/zipfileset-test.xml +++ b/src/tests/antunit/types/zipfileset-test.xml @@ -64,4 +64,20 @@ + + + + + + + + + + + + + + + +