Return-Path: Mailing-List: contact dev-help@ant.apache.org; run by ezmlm Delivered-To: mailing list dev@ant.apache.org Received: (qmail 95579 invoked by uid 500); 12 Mar 2003 11:23:30 -0000 Received: (qmail 95576 invoked from network); 12 Mar 2003 11:23:29 -0000 Received: from icarus.apache.org (208.185.179.13) by daedalus.apache.org with SMTP; 12 Mar 2003 11:23:29 -0000 Received: (qmail 56332 invoked by uid 1146); 12 Mar 2003 11:23:28 -0000 Date: 12 Mar 2003 11:23:28 -0000 Message-ID: <20030312112328.56327.qmail@icarus.apache.org> From: bodewig@apache.org To: ant-cvs@apache.org Subject: cvs commit: ant/src/main/org/apache/tools/ant/taskdefs Jar.java Zip.java X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N bodewig 2003/03/12 03:23:28 Modified: src/main/org/apache/tools/ant/taskdefs Jar.java Zip.java Log: Fix the bug. PR: 17780 Revision Changes Path 1.71 +5 -3 ant/src/main/org/apache/tools/ant/taskdefs/Jar.java Index: Jar.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Jar.java,v retrieving revision 1.70 retrieving revision 1.71 diff -u -r1.70 -r1.71 --- Jar.java 17 Feb 2003 14:00:34 -0000 1.70 +++ Jar.java 12 Mar 2003 11:23:27 -0000 1.71 @@ -531,11 +531,12 @@ * out-of-date. Subclasses overriding this method are supposed to * set this value correctly in their call to * super.getResourcesToAdd. - * @return an array of resources to add for each fileset passed in. + * @return an array of resources to add for each fileset passed in as well + * as a flag that indicates whether the archive is uptodate. * * @exception BuildException if it likes */ - protected Resource[][] getResourcesToAdd(FileSet[] filesets, + protected ArchiveState getResourcesToAdd(FileSet[] filesets, File zipFile, boolean needsUpdate) throws BuildException { @@ -581,7 +582,8 @@ ZipOutputStream zOut = null; try { - log("Building jar: " + getDestFile().getAbsolutePath()); + log("Building MANIFEST-only jar: " + + getDestFile().getAbsolutePath()); zOut = new ZipOutputStream(new FileOutputStream(getDestFile())); zOut.setEncoding(getEncoding()); 1.101 +64 -11 ant/src/main/org/apache/tools/ant/taskdefs/Zip.java Index: Zip.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Zip.java,v retrieving revision 1.100 retrieving revision 1.101 diff -u -r1.100 -r1.101 --- Zip.java 7 Mar 2003 11:23:03 -0000 1.100 +++ Zip.java 12 Mar 2003 11:23:27 -0000 1.101 @@ -344,7 +344,11 @@ // we don't need to update if the original file doesn't exist addingNewFiles = true; - doUpdate = doUpdate && zipFile.exists(); + if (doUpdate && !zipFile.exists()) { + doUpdate = false; + log("ignoring update attribute as " + archiveType + + " doesn't exist.", Project.MSG_DEBUG); + } // Add the files found in groupfileset to fileset for (int i = 0; i < groupfilesets.size(); i++) { @@ -381,14 +385,16 @@ vfss.copyInto(fss); boolean success = false; try { - Resource[][] addThem = getResourcesToAdd(fss, zipFile, false); + // can also handle empty archives + ArchiveState state = getResourcesToAdd(fss, zipFile, false); // quick exit if the target is up to date - // can also handle empty archives - if (isEmpty(addThem)) { + if (!state.isOutOfDate()) { return; } + Resource[][] addThem = state.getResourcesToAdd(); + if (doUpdate) { renamedFile = fileUtils.createTempFile("zip", ".tmp", @@ -687,17 +693,38 @@ * out-of-date. Subclasses overriding this method are supposed to * set this value correctly in their call to * super.getResourcesToAdd. - * @return an array of resources to add for each fileset passed in. + * @return an array of resources to add for each fileset passed in as well + * as a flag that indicates whether the archive is uptodate. * * @exception BuildException if it likes */ - protected Resource[][] getResourcesToAdd(FileSet[] filesets, + protected ArchiveState getResourcesToAdd(FileSet[] filesets, File zipFile, boolean needsUpdate) throws BuildException { Resource[][] initialResources = grabResources(filesets); if (isEmpty(initialResources)) { + if (needsUpdate && doUpdate) { + /* + * This is a rather hairy case. + * + * One of our subclasses knows that we need to update the + * archive, but at the same time, there are no resources + * known to us that would need to be added. Only the + * subclass seems to know what's going on. + * + * This happens if detects that the manifest has changed, + * for example. The manifest is not part of any resources + * because of our support for inline s. + * + * If we invoke createEmptyZip like Ant 1.5.2 did, + * we'll loose all stuff that has been in the original + * archive (bugzilla report 17780). + */ + return new ArchiveState(true, initialResources); + } + if (emptyBehavior.equals("skip")) { if (doUpdate) { log(archiveType + " archive " + zipFile @@ -717,16 +744,18 @@ // Create. createEmptyZip(zipFile); } - return initialResources; + return new ArchiveState(needsUpdate, initialResources); } + // initialResources is not empty + if (!zipFile.exists()) { - return initialResources; + return new ArchiveState(true, initialResources); } if (needsUpdate && !doUpdate) { // we are recreating the archive, need all resources - return initialResources; + return new ArchiveState(true, initialResources); } Resource[][] newerResources = new Resource[filesets.length][]; @@ -794,10 +823,10 @@ if (needsUpdate && !doUpdate) { // we are recreating the archive, need all resources - return initialResources; + return new ArchiveState(true, initialResources); } - return newerResources; + return new ArchiveState(needsUpdate, newerResources); } /** @@ -1094,6 +1123,30 @@ public static class Duplicate extends EnumeratedAttribute { public String[] getValues() { return new String[] {"add", "preserve", "fail"}; + } + } + + /** + * Holds the up-to-date status and the out-of-date resources of + * the original archive. + * + * @since Ant 1.5.3 + */ + public static class ArchiveState { + private boolean outOfDate; + private Resource[][] resourcesToAdd; + + ArchiveState(boolean state, Resource[][] r) { + outOfDate = state; + resourcesToAdd = r; + } + + public boolean isOutOfDate() { + return outOfDate; + } + + public Resource[][] getResourcesToAdd() { + return resourcesToAdd; } } }