diff --git a/src/main/org/apache/tools/ant/taskdefs/Zip.java b/src/main/org/apache/tools/ant/taskdefs/Zip.java index fca586417..8485c30c6 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Zip.java +++ b/src/main/org/apache/tools/ant/taskdefs/Zip.java @@ -449,12 +449,24 @@ public class Zip extends MatchingTask { DirectoryScanner ds = oldFiles.getDirectoryScanner(getProject()); ((ZipScanner) ds).setEncoding(encoding); + String[] f = ds.getIncludedFiles(); Resource[] r = new Resource[f.length]; for (int i = 0; i < f.length; i++) { r[i] = ds.getResource(f[i]); } + if (!doFilesonly) { + String[] d = ds.getIncludedDirectories(); + Resource[] dr = new Resource[d.length]; + for (int i = 0; i < d.length; i++) { + dr[i] = ds.getResource(d[i]); + } + Resource[] tmp = r; + r = new Resource[tmp.length + dr.length]; + System.arraycopy(dr, 0, r, 0, dr.length); + System.arraycopy(tmp, 0, r, dr.length, tmp.length); + } addResources(oldFiles, r, zOut); } finalizeZipOutputStream(zOut); @@ -596,7 +608,22 @@ public class Zip extends MatchingTask { name = name + "/"; } - addParentDirs(base, name, zOut, prefix, dirMode); + if (!doFilesonly && !dealingWithFiles + && resources[i].isDirectory() + && !zfs.hasDirModeBeenSet()) { + int nextToLastSlash = name.lastIndexOf("/", + name.length() - 2); + if (nextToLastSlash != -1) { + addParentDirs(base, name.substring(0, + nextToLastSlash + 1), + zOut, prefix, dirMode); + } + ZipEntry ze = zf.getEntry(resources[i].getName()); + addParentDirs(base, name, zOut, prefix, ze.getUnixMode()); + + } else { + addParentDirs(base, name, zOut, prefix, dirMode); + } if (!resources[i].isDirectory() && dealingWithFiles) { File f = fileUtils.resolveFile(base,