You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by bo...@apache.org on 2009/07/15 10:53:07 UTC
svn commit: r794198 - in /ant/core/trunk/src:
main/org/apache/tools/ant/taskdefs/Jar.java
main/org/apache/tools/ant/taskdefs/Zip.java
main/org/apache/tools/ant/types/resources/ZipResource.java
tests/antunit/taskdefs/zip-test.xml
Author: bodewig
Date: Wed Jul 15 08:53:07 2009
New Revision: 794198
URL: http://svn.apache.org/viewvc?rev=794198&view=rev
Log:
preserve timestamps for directories added to a zip archive (and potentially zip extra fields as well)
Modified:
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Jar.java
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Zip.java
ant/core/trunk/src/main/org/apache/tools/ant/types/resources/ZipResource.java
ant/core/trunk/src/tests/antunit/taskdefs/zip-test.xml
Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Jar.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Jar.java?rev=794198&r1=794197&r2=794198&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Jar.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Jar.java Wed Jul 15 08:53:07 2009
@@ -48,6 +48,7 @@
import org.apache.tools.ant.taskdefs.Manifest.Section;
import org.apache.tools.ant.types.EnumeratedAttribute;
import org.apache.tools.ant.types.Path;
+import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.ResourceCollection;
import org.apache.tools.ant.types.ZipFileSet;
import org.apache.tools.ant.types.spi.Service;
@@ -532,7 +533,7 @@
Project.MSG_WARN);
}
- zipDir(null, zOut, "META-INF/", ZipFileSet.DEFAULT_DIR_MODE,
+ zipDir((Resource) null, zOut, "META-INF/", ZipFileSet.DEFAULT_DIR_MODE,
JAR_MARKER);
// time to write the manifest
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Zip.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Zip.java?rev=794198&r1=794197&r2=794198&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Zip.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Zip.java Wed Jul 15 08:53:07 2009
@@ -49,6 +49,8 @@
import org.apache.tools.ant.types.ZipScanner;
import org.apache.tools.ant.types.resources.ArchiveResource;
import org.apache.tools.ant.types.resources.FileProvider;
+import org.apache.tools.ant.types.resources.FileResource;
+import org.apache.tools.ant.types.resources.ZipResource;
import org.apache.tools.ant.util.FileNameMapper;
import org.apache.tools.ant.util.FileUtils;
import org.apache.tools.ant.util.GlobPatternMapper;
@@ -950,7 +952,9 @@
addParentDirs(base, name.substring(0, nextToLastSlash + 1),
zOut, prefix, defaultDirMode);
}
- addParentDirs(base, name, zOut, prefix, thisDirMode);
+ zipDir(r, zOut, prefix + name, thisDirMode,
+ r instanceof ZipResource
+ ? ((ZipResource) r).getExtraFields() : null);
}
/**
@@ -1551,7 +1555,7 @@
/**
* Add a directory to the zip stream.
- * @param dir the directort to add to the archive
+ * @param dir the directory to add to the archive
* @param zOut the stream to write to
* @param vPath the name this entry shall have in the archive
* @param mode the Unix permissions to set.
@@ -1562,6 +1566,23 @@
protected void zipDir(File dir, ZipOutputStream zOut, String vPath,
int mode, ZipExtraField[] extra)
throws IOException {
+ zipDir(dir == null ? (Resource) null : new FileResource(dir),
+ zOut, vPath, mode, extra);
+ }
+
+ /**
+ * Add a directory to the zip stream.
+ * @param dir the directory to add to the archive
+ * @param zOut the stream to write to
+ * @param vPath the name this entry shall have in the archive
+ * @param mode the Unix permissions to set.
+ * @param extra ZipExtraFields to add
+ * @throws IOException on error
+ * @since Ant 1.8.0
+ */
+ protected void zipDir(Resource dir, ZipOutputStream zOut, String vPath,
+ int mode, ZipExtraField[] extra)
+ throws IOException {
if (doFilesonly) {
logOnFirstPass("skipping directory " + vPath
+ " for file-only archive",
@@ -1579,13 +1600,14 @@
if (!skipWriting) {
ZipEntry ze = new ZipEntry (vPath);
- if (dir != null && dir.exists()) {
- // ZIPs store time with a granularity of 2 seconds, round up
- ze.setTime(dir.lastModified() + (roundUp ? ROUNDUP_MILLIS : 0));
+
+ // ZIPs store time with a granularity of 2 seconds, round up
+ int millisToAdd = roundUp ? ROUNDUP_MILLIS : 0;
+
+ if (dir != null && dir.isExists()) {
+ ze.setTime(dir.getLastModified() + millisToAdd);
} else {
- // ZIPs store time with a granularity of 2 seconds, round up
- ze.setTime(System.currentTimeMillis()
- + (roundUp ? ROUNDUP_MILLIS : 0));
+ ze.setTime(System.currentTimeMillis() + millisToAdd);
}
ze.setSize (0);
ze.setMethod (ZipEntry.STORED);
Modified: ant/core/trunk/src/main/org/apache/tools/ant/types/resources/ZipResource.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/types/resources/ZipResource.java?rev=794198&r1=794197&r2=794198&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/types/resources/ZipResource.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/types/resources/ZipResource.java Wed Jul 15 08:53:07 2009
@@ -31,6 +31,7 @@
import org.apache.tools.ant.util.FileUtils;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipEntry;
+import org.apache.tools.zip.ZipExtraField;
/**
* A Resource representation of an entry in a zipfile.
@@ -39,6 +40,7 @@
public class ZipResource extends ArchiveResource {
private String encoding;
+ private ZipExtraField[] extras;
/**
* Default constructor.
@@ -166,6 +168,18 @@
}
/**
+ * Retrieves extra fields.
+ * @return an array of the extra fields
+ * @since Ant 1.8.0
+ */
+ public ZipExtraField[] getExtraFields() {
+ if (extras == null) {
+ return new ZipExtraField[0];
+ }
+ return extras;
+ }
+
+ /**
* fetches information from the named entry inside the archive.
*/
protected void fetchEntry() {
@@ -198,6 +212,7 @@
setDirectory(e.isDirectory());
setSize(e.getSize());
setMode(e.getUnixMode());
+ extras = e.getExtraFields();
}
}
Modified: ant/core/trunk/src/tests/antunit/taskdefs/zip-test.xml
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/taskdefs/zip-test.xml?rev=794198&r1=794197&r2=794198&view=diff
==============================================================================
--- ant/core/trunk/src/tests/antunit/taskdefs/zip-test.xml (original)
+++ ant/core/trunk/src/tests/antunit/taskdefs/zip-test.xml Wed Jul 15 08:53:07 2009
@@ -86,8 +86,9 @@
<fileset dir="${input}/build"/>
<fileset dir="${input}/src" excludes="**/*.java"/>
</jar>
- <au:assertDestIsUptodate src="${output}/jar.jar"
+ <au:assertDestIsOutofdate src="${output}/jar.jar"
dest="${output}/reference.jar"/>
+ <copy file="${output}/jar.jar" tofile="${output}/reference.jar"/>
<sleep seconds="1"/>
<jar jarfile="${output}/jar.jar">
@@ -104,4 +105,21 @@
<au:assertDestIsUptodate src="${output}/jar.jar"
dest="${output}/reference.jar"/>
</target>
+
+ <target name="testNewEmptyDirUpdatesArchive">
+ <mkdir dir="${input}"/>
+ <touch file="${input}/x"/>
+ <mkdir dir="${output}"/>
+ <jar jarfile="${output}/jar.jar">
+ <fileset dir="${input}"/>
+ </jar>
+ <copy file="${output}/jar.jar" tofile="${output}/reference.jar"/>
+
+ <mkdir dir="${input}/y"/>
+ <jar jarfile="${output}/jar.jar">
+ <fileset dir="${input}"/>
+ </jar>
+ <au:assertDestIsOutofdate src="${output}/jar.jar"
+ dest="${output}/reference.jar"/>
+ </target>
</project>