Author: bodewig Date: Wed Aug 26 04:30:13 2009 New Revision: 807875 URL: http://svn.apache.org/viewvc?rev=807875&view=rev Log: port duplicate attribute from <zip>
Modified: ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java ant/sandbox/antlibs/compress/trunk/src/tests/antunit/ar-test.xml ant/sandbox/antlibs/compress/trunk/src/tests/antunit/cpio-test.xml ant/sandbox/antlibs/compress/trunk/src/tests/antunit/tar-test.xml ant/sandbox/antlibs/compress/trunk/src/tests/antunit/zip-test.xml Modified: ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java URL: http://svn.apache.org/viewvc/ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java?rev=807875&r1=807874&r2=807875&view=diff ============================================================================== --- ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java (original) +++ ant/sandbox/antlibs/compress/trunk/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java Wed Aug 26 04:30:13 2009 @@ -76,6 +76,7 @@ private boolean preserve0permissions = false; private boolean roundUp = true; private boolean preserveLeadingSlashes = false; + private Duplicate duplicate = new Duplicate(); protected ArchiveBase() {} @@ -171,6 +172,19 @@ this.preserveLeadingSlashes = b; } + /** + * Sets behavior for when a duplicate file is about to be added - + * one of <code>add</code>, <code>preserve</code> or <code>fail</code>. + * Possible values are: <code>add</code> (keep both + * of the files); <code>preserve</code> (keep the first version + * of the file found); <code>fail</code> halt a problem + * Default for is <code>add</code> + * @param df a <code>Duplicate</code> enumerated value + */ + public void setDuplicate(Duplicate df) { + duplicate = df; + } + public void execute() { validate(); if (!dest.isExists()) { @@ -219,7 +233,8 @@ * the archive. */ protected ResourceWithFlags[] findSources() throws IOException { - ArrayList l = new ArrayList(); + List/*<ResourceWithFlags>*/ l = new ArrayList/*<ResourceWithFlags>*/(); + Set/*<String>*/ addedNames = new HashSet/*<String>*/(); for (Iterator rcs = sources.iterator(); rcs.hasNext(); ) { ResourceCollection rc = (ResourceCollection) rcs.next(); ResourceCollectionFlags rcFlags = getFlags(rc); @@ -228,9 +243,12 @@ if (!filesOnly || !r.isDirectory()) { ResourceWithFlags rwf = new ResourceWithFlags(r, rcFlags, getFlags(r)); - if (!"".equals(rwf.getName()) - && !"/".equals(rwf.getName())) { - l.add(rwf); + String name = rwf.getName(); + if (!"".equals(name) && !"/".equals(name)) { + boolean isDup = !addedNames.add(name); + if (!isDup || addDuplicate(name)) { + l.add(rwf); + } } } } @@ -509,6 +527,24 @@ } /** + * Is invoked if a duplicate entry is found, decides whether the + * entry shall be added regardless. + */ + protected boolean addDuplicate(String name) { + if (duplicate.getValue().equals(Duplicate.PRESERVE)) { + log(name + " already added, skipping.", Project.MSG_INFO); + return false; + } else if (duplicate.getValue().equals(Duplicate.FAIL)) { + throw new BuildException("Duplicate entry " + name + + " was found and the duplicate " + + "attribute is 'fail'."); + } + // duplicate equal to add, so we continue + log("duplicate entry " + name + " found, adding.", Project.MSG_VERBOSE); + return true; + } + + /** * Valid Modes for create/update/replace. */ public static final class Mode extends EnumeratedAttribute { @@ -539,6 +575,28 @@ } /** + * Possible behaviors when a duplicate file is added: + * "add", "preserve" or "fail" + */ + public static class Duplicate extends EnumeratedAttribute { + private static String ADD = "add"; + private static String PRESERVE = "preserve"; + private static String FAIL = "fail"; + + public Duplicate() { + setValue(ADD); + } + + /** + * @see EnumeratedAttribute#getValues() + */ + /** {...@inheritdoc} */ + public String[] getValues() { + return new String[] {ADD, PRESERVE, FAIL}; + } + } + + /** * Various flags a (archive) resource may hold in addition to * being a plain resource. */ Modified: ant/sandbox/antlibs/compress/trunk/src/tests/antunit/ar-test.xml URL: http://svn.apache.org/viewvc/ant/sandbox/antlibs/compress/trunk/src/tests/antunit/ar-test.xml?rev=807875&r1=807874&r2=807875&view=diff ============================================================================== --- ant/sandbox/antlibs/compress/trunk/src/tests/antunit/ar-test.xml (original) +++ ant/sandbox/antlibs/compress/trunk/src/tests/antunit/ar-test.xml Wed Aug 26 04:30:13 2009 @@ -326,4 +326,31 @@ </assertResourceDoesntExist> </target> + <target name="testAddDuplicates" depends="setUp"> + <cmp:ar destfile="${dest}"> + <cmp:arfileset src="../resources/asf-logo.gif.ar"/> + <cmp:zipfileset src="../resources/asf-logo.gif.zip"/> + </cmp:ar> + <au:assertLogContains text="duplicate entry asf-logo.gif found, adding." + level="verbose"/> + </target> + + <target name="testPreserveDuplicates" depends="setUp"> + <cmp:ar destfile="${dest}" duplicate="preserve"> + <cmp:arfileset src="../resources/asf-logo.gif.ar"/> + <cmp:zipfileset src="../resources/asf-logo.gif.zip"/> + </cmp:ar> + <au:assertLogContains text="asf-logo.gif already added, skipping." + level="verbose"/> + </target> + + <target name="testFailDuplicates" depends="setUp"> + <au:expectfailure + message="Duplicate entry asf-logo.gif was found and the duplicate attribute is 'fail'."> + <cmp:ar destfile="${dest}" duplicate="fail"> + <cmp:arfileset src="../resources/asf-logo.gif.ar"/> + <cmp:zipfileset src="../resources/asf-logo.gif.zip"/> + </cmp:ar> + </au:expectfailure> + </target> </project> Modified: ant/sandbox/antlibs/compress/trunk/src/tests/antunit/cpio-test.xml URL: http://svn.apache.org/viewvc/ant/sandbox/antlibs/compress/trunk/src/tests/antunit/cpio-test.xml?rev=807875&r1=807874&r2=807875&view=diff ============================================================================== --- ant/sandbox/antlibs/compress/trunk/src/tests/antunit/cpio-test.xml (original) +++ ant/sandbox/antlibs/compress/trunk/src/tests/antunit/cpio-test.xml Wed Aug 26 04:30:13 2009 @@ -357,4 +357,33 @@ </cmp:cpioentry> </assertResourceDoesntExist> </target> + + <!-- ACC 1.0 CPIO prevents duplicate entries --> + <target name="fail-testAddDuplicates" depends="setUp"> + <cmp:cpio destfile="${dest}"> + <cmp:arfileset src="../resources/asf-logo.gif.ar"/> + <cmp:zipfileset src="../resources/asf-logo.gif.zip"/> + </cmp:cpio> + <au:assertLogContains text="duplicate entry asf-logo.gif found, adding." + level="verbose"/> + </target> + + <target name="testPreserveDuplicates" depends="setUp"> + <cmp:cpio destfile="${dest}" duplicate="preserve"> + <cmp:arfileset src="../resources/asf-logo.gif.ar"/> + <cmp:zipfileset src="../resources/asf-logo.gif.zip"/> + </cmp:cpio> + <au:assertLogContains text="asf-logo.gif already added, skipping." + level="verbose"/> + </target> + + <target name="testFailDuplicates" depends="setUp"> + <au:expectfailure + message="Duplicate entry asf-logo.gif was found and the duplicate attribute is 'fail'."> + <cmp:cpio destfile="${dest}" duplicate="fail"> + <cmp:arfileset src="../resources/asf-logo.gif.ar"/> + <cmp:zipfileset src="../resources/asf-logo.gif.zip"/> + </cmp:cpio> + </au:expectfailure> + </target> </project> Modified: ant/sandbox/antlibs/compress/trunk/src/tests/antunit/tar-test.xml URL: http://svn.apache.org/viewvc/ant/sandbox/antlibs/compress/trunk/src/tests/antunit/tar-test.xml?rev=807875&r1=807874&r2=807875&view=diff ============================================================================== --- ant/sandbox/antlibs/compress/trunk/src/tests/antunit/tar-test.xml (original) +++ ant/sandbox/antlibs/compress/trunk/src/tests/antunit/tar-test.xml Wed Aug 26 04:30:13 2009 @@ -375,4 +375,32 @@ </cmp:tarentry> </assertResourceDoesntExist> </target> + + <target name="testAddDuplicates" depends="setUp"> + <cmp:tar destfile="${dest}"> + <cmp:arfileset src="../resources/asf-logo.gif.ar"/> + <cmp:zipfileset src="../resources/asf-logo.gif.zip"/> + </cmp:tar> + <au:assertLogContains text="duplicate entry asf-logo.gif found, adding." + level="verbose"/> + </target> + + <target name="testPreserveDuplicates" depends="setUp"> + <cmp:tar destfile="${dest}" duplicate="preserve"> + <cmp:arfileset src="../resources/asf-logo.gif.ar"/> + <cmp:zipfileset src="../resources/asf-logo.gif.zip"/> + </cmp:tar> + <au:assertLogContains text="asf-logo.gif already added, skipping." + level="verbose"/> + </target> + + <target name="testFailDuplicates" depends="setUp"> + <au:expectfailure + message="Duplicate entry asf-logo.gif was found and the duplicate attribute is 'fail'."> + <cmp:tar destfile="${dest}" duplicate="fail"> + <cmp:arfileset src="../resources/asf-logo.gif.ar"/> + <cmp:zipfileset src="../resources/asf-logo.gif.zip"/> + </cmp:tar> + </au:expectfailure> + </target> </project> Modified: ant/sandbox/antlibs/compress/trunk/src/tests/antunit/zip-test.xml URL: http://svn.apache.org/viewvc/ant/sandbox/antlibs/compress/trunk/src/tests/antunit/zip-test.xml?rev=807875&r1=807874&r2=807875&view=diff ============================================================================== --- ant/sandbox/antlibs/compress/trunk/src/tests/antunit/zip-test.xml (original) +++ ant/sandbox/antlibs/compress/trunk/src/tests/antunit/zip-test.xml Wed Aug 26 04:30:13 2009 @@ -384,4 +384,31 @@ with command line zip --> </target> + <target name="testAddDuplicates" depends="setUp"> + <cmp:zip destfile="${dest}"> + <cmp:arfileset src="../resources/asf-logo.gif.ar"/> + <cmp:zipfileset src="../resources/asf-logo.gif.zip"/> + </cmp:zip> + <au:assertLogContains text="duplicate entry asf-logo.gif found, adding." + level="verbose"/> + </target> + + <target name="testPreserveDuplicates" depends="setUp"> + <cmp:zip destfile="${dest}" duplicate="preserve"> + <cmp:arfileset src="../resources/asf-logo.gif.ar"/> + <cmp:zipfileset src="../resources/asf-logo.gif.zip"/> + </cmp:zip> + <au:assertLogContains text="asf-logo.gif already added, skipping." + level="verbose"/> + </target> + + <target name="testFailDuplicates" depends="setUp"> + <au:expectfailure + message="Duplicate entry asf-logo.gif was found and the duplicate attribute is 'fail'."> + <cmp:zip destfile="${dest}" duplicate="fail"> + <cmp:arfileset src="../resources/asf-logo.gif.ar"/> + <cmp:zipfileset src="../resources/asf-logo.gif.zip"/> + </cmp:zip> + </au:expectfailure> + </target> </project>