From a6e42833f664835fa3f5352d379e3ec520d54eab Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Wed, 15 Jul 2009 08:53:07 +0000 Subject: [PATCH] preserve timestamps for directories added to a zip archive (and potentially zip extra fields as well) git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@794198 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/tools/ant/taskdefs/Jar.java | 3 +- .../org/apache/tools/ant/taskdefs/Zip.java | 38 +++++++++++++++---- .../ant/types/resources/ZipResource.java | 15 ++++++++ src/tests/antunit/taskdefs/zip-test.xml | 20 +++++++++- 4 files changed, 66 insertions(+), 10 deletions(-) diff --git a/src/main/org/apache/tools/ant/taskdefs/Jar.java b/src/main/org/apache/tools/ant/taskdefs/Jar.java index 715eb01b4..e4287250a 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Jar.java +++ b/src/main/org/apache/tools/ant/taskdefs/Jar.java @@ -48,6 +48,7 @@ import org.apache.tools.ant.Project; 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 @@ public class Jar extends Zip { 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(); diff --git a/src/main/org/apache/tools/ant/taskdefs/Zip.java b/src/main/org/apache/tools/ant/taskdefs/Zip.java index 641d0daa8..92e3281ab 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Zip.java +++ b/src/main/org/apache/tools/ant/taskdefs/Zip.java @@ -49,6 +49,8 @@ import org.apache.tools.ant.types.ZipFileSet; 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 @@ public class Zip extends MatchingTask { 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 @@ public class Zip extends MatchingTask { /** * 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 @@ public class Zip extends MatchingTask { 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 @@ public class Zip extends MatchingTask { 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); diff --git a/src/main/org/apache/tools/ant/types/resources/ZipResource.java b/src/main/org/apache/tools/ant/types/resources/ZipResource.java index 2aab102e4..b7d9afd3b 100644 --- a/src/main/org/apache/tools/ant/types/resources/ZipResource.java +++ b/src/main/org/apache/tools/ant/types/resources/ZipResource.java @@ -31,6 +31,7 @@ import org.apache.tools.ant.types.Reference; 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 @@ import org.apache.tools.zip.ZipEntry; public class ZipResource extends ArchiveResource { private String encoding; + private ZipExtraField[] extras; /** * Default constructor. @@ -165,6 +167,18 @@ public class ZipResource extends ArchiveResource { "Use the zip task for zip output."); } + /** + * 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. */ @@ -198,6 +212,7 @@ public class ZipResource extends ArchiveResource { setDirectory(e.isDirectory()); setSize(e.getSize()); setMode(e.getUnixMode()); + extras = e.getExtraFields(); } } diff --git a/src/tests/antunit/taskdefs/zip-test.xml b/src/tests/antunit/taskdefs/zip-test.xml index 987c20170..7edcaf640 100644 --- a/src/tests/antunit/taskdefs/zip-test.xml +++ b/src/tests/antunit/taskdefs/zip-test.xml @@ -86,8 +86,9 @@ - + @@ -104,4 +105,21 @@ + + + + + + + + + + + + + + + +