bodewig     2003/03/12 03:29:10

  Modified:    src/etc/testcases/taskdefs Tag: ANT_15_BRANCH jar.xml
               src/main/org/apache/tools/ant/taskdefs Tag: ANT_15_BRANCH
                        Jar.java Zip.java
               src/testcases/org/apache/tools/ant/taskdefs Tag:
                        ANT_15_BRANCH JarTest.java
  Log:
  Merge tests and fix for bug 17780 from HEAD
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.4.2.4   +11 -0     ant/src/etc/testcases/taskdefs/jar.xml
  
  Index: jar.xml
  ===================================================================
  RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/jar.xml,v
  retrieving revision 1.4.2.3
  retrieving revision 1.4.2.4
  diff -u -r1.4.2.3 -r1.4.2.4
  --- jar.xml   26 Feb 2003 10:07:00 -0000      1.4.2.3
  +++ jar.xml   12 Mar 2003 11:29:09 -0000      1.4.2.4
  @@ -189,4 +189,15 @@
       </jar>
     </target>
   
  +  <!-- bug 17780 -->
  +  <target name="testUpdateIfOnlyManifestHasChanged"
  +          depends="test4">
  +    <jar destfile="${tmp.jar}" update="true">
  +      <manifest>
  +        <attribute name="Foo" value="bar"/>
  +      </manifest>
  +    </jar>
  +    <mkdir dir="${tmp.dir}"/>
  +    <unzip src="${tmp.jar}" dest="${tmp.dir}"/>
  +  </target>
   </project>
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.51.2.17 +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.51.2.16
  retrieving revision 1.51.2.17
  diff -u -r1.51.2.16 -r1.51.2.17
  --- Jar.java  19 Feb 2003 08:13:59 -0000      1.51.2.16
  +++ Jar.java  12 Mar 2003 11:29:10 -0000      1.51.2.17
  @@ -535,11 +535,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 {
  @@ -585,7 +586,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.78.2.13 +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.78.2.12
  retrieving revision 1.78.2.13
  diff -u -r1.78.2.12 -r1.78.2.13
  --- Zip.java  7 Mar 2003 12:38:39 -0000       1.78.2.12
  +++ Zip.java  12 Mar 2003 11:29:10 -0000      1.78.2.13
  @@ -327,7 +327,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++) {
  @@ -364,14 +368,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",
  @@ -666,17 +672,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 <jar> detects that the manifest has 
changed,
  +                 * for example.  The manifest is not part of any resources
  +                 * because of our support for inline <manifest>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 
  @@ -696,16 +723,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][];
  @@ -773,10 +802,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);
       }
   
       /**
  @@ -1068,6 +1097,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;
           }
       }
   }
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.8.2.6   +9 -2      
ant/src/testcases/org/apache/tools/ant/taskdefs/JarTest.java
  
  Index: JarTest.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/JarTest.java,v
  retrieving revision 1.8.2.5
  retrieving revision 1.8.2.6
  diff -u -r1.8.2.5 -r1.8.2.6
  --- JarTest.java      26 Feb 2003 10:07:00 -0000      1.8.2.5
  +++ JarTest.java      12 Mar 2003 11:29:10 -0000      1.8.2.6
  @@ -67,6 +67,7 @@
   public class JarTest extends BuildFileTest {
   
       private static String tempJar = "tmp.jar";
  +    private static String tempDir = "jartmp/";
       private Reader r1, r2;
   
       public JarTest(String name) {
  @@ -170,9 +171,9 @@
           executeTarget("testManifestStaysIntact");
   
           r1 = new FileReader(getProject()
  -                            .resolveFile("jartmp/manifest"));
  +                            .resolveFile(tempDir + "manifest"));
           r2 = new FileReader(getProject()
  -                            .resolveFile("jartmp/META-INF/MANIFEST.MF"));
  +                            .resolveFile(tempDir + "META-INF/MANIFEST.MF"));
           Manifest mf1 = new Manifest(r1);
           Manifest mf2 = new Manifest(r2);
           assertEquals(mf1, mf2);
  @@ -218,5 +219,11 @@
           executeTarget("testCreateWithEmptyFilesetSetUp");
           executeTarget("testCreateWithEmptyFileset");
           executeTarget("testCreateWithEmptyFileset");
  +    }
  +
  +    public void testUpdateIfOnlyManifestHasChanged() {
  +        executeTarget("testUpdateIfOnlyManifestHasChanged");
  +        File jarXml = getProject().resolveFile(tempDir + "jar.xml");
  +        assertTrue(jarXml.exists());
       }
   }
  
  
  

Reply via email to