git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@690714 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -316,6 +316,10 @@ Other changes: | |||||
| manual page for details. | manual page for details. | ||||
| Bugzilla Report 37241. | Bugzilla Report 37241. | ||||
| * The Jar task now supports the addition of a jar index file in update mode. | |||||
| Previously the absence of the index was not enough to trigger the rebuild; | |||||
| some other update was necessary. Bugzilla report 45098. | |||||
| Changes from Ant 1.7.0 TO Ant 1.7.1 | Changes from Ant 1.7.0 TO Ant 1.7.1 | ||||
| ============================================= | ============================================= | ||||
| @@ -340,6 +340,29 @@ public class Jar extends Zip { | |||||
| return newManifest; | return newManifest; | ||||
| } | } | ||||
| private boolean jarHasIndex(File jarFile) throws IOException { | |||||
| ZipFile zf = null; | |||||
| try { | |||||
| zf = new ZipFile(jarFile); | |||||
| Enumeration e = zf.entries(); | |||||
| while (e.hasMoreElements()) { | |||||
| ZipEntry ze = (ZipEntry) e.nextElement(); | |||||
| if (ze.getName().equalsIgnoreCase(INDEX_NAME)) { | |||||
| return true; | |||||
| } | |||||
| } | |||||
| return false; | |||||
| } finally { | |||||
| if (zf != null) { | |||||
| try { | |||||
| zf.close(); | |||||
| } catch (IOException e) { | |||||
| // XXX - log an error? throw an exception? | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| /** | /** | ||||
| * Behavior when a Manifest is found in a zipfileset or zipgroupfileset file. | * Behavior when a Manifest is found in a zipfileset or zipgroupfileset file. | ||||
| * Valid values are "skip", "merge", and "mergewithoutmain". | * Valid values are "skip", "merge", and "mergewithoutmain". | ||||
| @@ -593,7 +616,7 @@ public class Jar extends Zip { | |||||
| } | } | ||||
| } else if (INDEX_NAME.equalsIgnoreCase(vPath) && index) { | } else if (INDEX_NAME.equalsIgnoreCase(vPath) && index) { | ||||
| log("Warning: selected " + archiveType | log("Warning: selected " + archiveType | ||||
| + " files include a META-INF/INDEX.LIST which will" | |||||
| + " files include a " + INDEX_NAME + " which will" | |||||
| + " be replaced by a newly generated one.", Project.MSG_WARN); | + " be replaced by a newly generated one.", Project.MSG_WARN); | ||||
| } else { | } else { | ||||
| if (index && vPath.indexOf("/") == -1) { | if (index && vPath.indexOf("/") == -1) { | ||||
| @@ -734,6 +757,14 @@ public class Jar extends Zip { | |||||
| } | } | ||||
| createEmpty = needsUpdate; | createEmpty = needsUpdate; | ||||
| if (!needsUpdate && index) { | |||||
| try { | |||||
| needsUpdate = !jarHasIndex(zipFile); | |||||
| } catch (IOException e) { | |||||
| //if we couldn't read it, we might as well recreate it? | |||||
| needsUpdate = true; | |||||
| } | |||||
| } | |||||
| return super.getResourcesToAdd(rcs, zipFile, needsUpdate); | return super.getResourcesToAdd(rcs, zipFile, needsUpdate); | ||||
| } | } | ||||
| @@ -0,0 +1,52 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!-- | |||||
| Licensed to the Apache Software Foundation (ASF) under one or more | |||||
| contributor license agreements. See the NOTICE file distributed with | |||||
| this work for additional information regarding copyright ownership. | |||||
| The ASF licenses this file to You under the Apache License, Version 2.0 | |||||
| (the "License"); you may not use this file except in compliance with | |||||
| the License. You may obtain a copy of the License at | |||||
| http://www.apache.org/licenses/LICENSE-2.0 | |||||
| Unless required by applicable law or agreed to in writing, software | |||||
| distributed under the License is distributed on an "AS IS" BASIS, | |||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| See the License for the specific language governing permissions and | |||||
| limitations under the License. | |||||
| --> | |||||
| <project default="antunit" xmlns:au="antlib:org.apache.ant.antunit"> | |||||
| <import file="../antunit-base.xml" /> | |||||
| <property name="index.jar" location="index.jar" /> | |||||
| <target name="tearDown"> | |||||
| <delete file="${index.jar}" /> | |||||
| </target> | |||||
| <target name="testIndexOnlyUpdate"> | |||||
| <jar destfile="${index.jar}" index="false"> | |||||
| <fileset dir="${basedir}" includes="*-test.xml" /> | |||||
| </jar> | |||||
| <au:assertTrue> | |||||
| <resourcecount count="0"> | |||||
| <restrict> | |||||
| <zipentry zipfile="${index.jar}" name="META-INF/INDEX.LIST" /> | |||||
| <exists /> | |||||
| </restrict> | |||||
| </resourcecount> | |||||
| </au:assertTrue> | |||||
| <jar destfile="${index.jar}" index="true" update="true"> | |||||
| <fileset dir="${basedir}" includes="*-test.xml" /> | |||||
| </jar> | |||||
| <au:assertTrue> | |||||
| <resourcecount count="1"> | |||||
| <restrict> | |||||
| <zipentry zipfile="${index.jar}" name="META-INF/INDEX.LIST" /> | |||||
| <exists /> | |||||
| </restrict> | |||||
| </resourcecount> | |||||
| </au:assertTrue> | |||||
| </target> | |||||
| </project> | |||||