This happens mainly for two reasons: * preserve stored permissions unless the user explicitly overrides them (PR 2130). This is now fixed for stored files, but not for directories. * deal with filename encoding of existing archives. Supposed to work properly now. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274751 13f79535-47bb-0310-9956-ffa450edef68master
@@ -66,7 +66,6 @@ import java.util.Hashtable; | |||
import java.util.Stack; | |||
import java.util.Vector; | |||
import java.util.zip.CRC32; | |||
import java.util.zip.ZipFile; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.DirectoryScanner; | |||
@@ -85,6 +84,7 @@ import org.apache.tools.ant.util.IdentityMapper; | |||
import org.apache.tools.ant.util.MergingMapper; | |||
import org.apache.tools.ant.util.ResourceUtils; | |||
import org.apache.tools.zip.ZipEntry; | |||
import org.apache.tools.zip.ZipFile; | |||
import org.apache.tools.zip.ZipOutputStream; | |||
/** | |||
@@ -362,6 +362,7 @@ public class Zip extends MatchingTask { | |||
log("Adding file " + files[j] + " to fileset", | |||
Project.MSG_VERBOSE); | |||
ZipFileSet zf = new ZipFileSet(); | |||
zf.setProject(getProject()); | |||
zf.setSrc(new File(basedir, files[j])); | |||
filesets.addElement(zf); | |||
filesetsFromGroupfilesets.addElement(zf); | |||
@@ -439,6 +440,7 @@ public class Zip extends MatchingTask { | |||
if (doUpdate) { | |||
addingNewFiles = false; | |||
ZipFileSet oldFiles = new ZipFileSet(); | |||
oldFiles.setProject(getProject()); | |||
oldFiles.setSrc(renamedFile); | |||
for (int i = 0; i < addedFiles.size(); i++) { | |||
@@ -447,6 +449,7 @@ 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++) { | |||
@@ -575,7 +578,7 @@ public class Zip extends MatchingTask { | |||
dealingWithFiles = true; | |||
base = fileset.getDir(getProject()); | |||
} else { | |||
zf = new ZipFile(zfs.getSrc(getProject())); | |||
zf = new ZipFile(zfs.getSrc(getProject()), encoding); | |||
} | |||
for (int i = 0; i < resources.length; i++) { | |||
@@ -595,17 +598,18 @@ public class Zip extends MatchingTask { | |||
} | |||
addParentDirs(base, name, zOut, prefix, dirMode); | |||
if (!resources[i].isDirectory() && dealingWithFiles) { | |||
File f = fileUtils.resolveFile(base, | |||
resources[i].getName()); | |||
zipFile(f, zOut, prefix + name, fileMode); | |||
} else if (!resources[i].isDirectory()) { | |||
java.util.zip.ZipEntry ze = | |||
zf.getEntry(resources[i].getName()); | |||
ZipEntry ze = zf.getEntry(resources[i].getName()); | |||
if (ze != null) { | |||
zipFile(zf.getInputStream(ze), zOut, prefix + name, | |||
ze.getTime(), zfs.getSrc(getProject()), fileMode); | |||
ze.getTime(), zfs.getSrc(getProject()), | |||
zfs.hasFileModeBeenSet() ? fileMode | |||
: ze.getUnixMode()); | |||
} | |||
} | |||
} | |||
@@ -673,6 +677,7 @@ public class Zip extends MatchingTask { | |||
private synchronized ZipScanner getZipScanner() { | |||
if (zs == null) { | |||
zs = new ZipScanner(); | |||
zs.setEncoding(encoding); | |||
zs.setSrc(zipFile); | |||
} | |||
return zs; | |||
@@ -849,6 +854,9 @@ public class Zip extends MatchingTask { | |||
for (int i = 0; i < filesets.length; i++) { | |||
DirectoryScanner rs = | |||
filesets[i].getDirectoryScanner(getProject()); | |||
if (rs instanceof ZipScanner) { | |||
((ZipScanner) rs).setEncoding(encoding); | |||
} | |||
Vector resources = new Vector(); | |||
String[] directories = rs.getIncludedDirectories(); | |||
for (int j = 0; j < directories.length; j++) { | |||
@@ -98,6 +98,9 @@ public class ZipFileSet extends FileSet { | |||
private int fileMode = DEFAULT_FILE_MODE; | |||
private int dirMode = DEFAULT_DIR_MODE; | |||
private boolean fileModeHasBeenSet = false; | |||
private boolean dirModeHasBeenSet = false; | |||
public ZipFileSet() { | |||
super(); | |||
} | |||
@@ -114,6 +117,8 @@ public class ZipFileSet extends FileSet { | |||
hasDir = fileset.hasDir; | |||
fileMode = fileset.fileMode; | |||
dirMode = fileset.dirMode; | |||
fileModeHasBeenSet = fileset.fileModeHasBeenSet; | |||
dirModeHasBeenSet = fileset.dirModeHasBeenSet; | |||
} | |||
/** | |||
@@ -243,7 +248,8 @@ public class ZipFileSet extends FileSet { | |||
public void setFileMode(String octalString) { | |||
if (isReference()) { | |||
throw tooManyAttributes(); | |||
} | |||
} | |||
fileModeHasBeenSet = true; | |||
this.fileMode = | |||
UnixStat.FILE_FLAG | Integer.parseInt(octalString, 8); | |||
} | |||
@@ -258,23 +264,36 @@ public class ZipFileSet extends FileSet { | |||
return fileMode; | |||
} | |||
/** | |||
* Whether the user has specified the mode explicitly. | |||
* | |||
* @since Ant 1.6 | |||
*/ | |||
public boolean hasFileModeBeenSet() { | |||
if (isReference()) { | |||
return ((ZipFileSet)getRef(getProject())).hasFileModeBeenSet(); | |||
} | |||
return fileModeHasBeenSet; | |||
} | |||
/** | |||
* A 3 digit octal string, specify the user, group and | |||
* other modes in the standard Unix fashion; | |||
* optional, default=0755 | |||
* | |||
* @since Ant 1.6 | |||
* @since Ant 1.5.2 | |||
*/ | |||
public void setDirMode(String octalString) { | |||
if (isReference()) { | |||
throw tooManyAttributes(); | |||
} | |||
} | |||
dirModeHasBeenSet = true; | |||
this.dirMode = | |||
UnixStat.DIR_FLAG | Integer.parseInt(octalString, 8); | |||
} | |||
/** | |||
* @since Ant 1.6 | |||
* @since Ant 1.5.2 | |||
*/ | |||
public int getDirMode(Project p) { | |||
if (isReference()) { | |||
@@ -283,6 +302,18 @@ public class ZipFileSet extends FileSet { | |||
return dirMode; | |||
} | |||
/** | |||
* Whether the user has specified the mode explicitly. | |||
* | |||
* @since Ant 1.6 | |||
*/ | |||
public boolean hasDirModeBeenSet() { | |||
if (isReference()) { | |||
return ((ZipFileSet)getRef(getProject())).hasDirModeBeenSet(); | |||
} | |||
return dirModeHasBeenSet; | |||
} | |||
/** | |||
* A ZipFileset accepts another ZipFileSet or a FileSet as reference | |||
* FileSets are often used by the war task for the lib attribute | |||
@@ -60,12 +60,12 @@ import java.io.IOException; | |||
import java.util.Vector; | |||
import java.util.Hashtable; | |||
import java.util.Enumeration; | |||
import java.util.zip.ZipInputStream; | |||
import java.util.zip.ZipEntry; | |||
import java.util.zip.ZipException; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.DirectoryScanner; | |||
import org.apache.tools.zip.ZipEntry; | |||
import org.apache.tools.zip.ZipFile; | |||
/** | |||
* ZipScanner accesses the pattern matching algorithm in DirectoryScanner, | |||
@@ -92,6 +92,13 @@ public class ZipScanner extends DirectoryScanner { | |||
*/ | |||
private Hashtable myentries; | |||
/** | |||
* encoding of file names. | |||
* | |||
* @since Ant 1.6 | |||
*/ | |||
private String encoding; | |||
/** | |||
* Sets the srcFile for scanning. This is the jar or zip file that | |||
* is scanned for matching entries. | |||
@@ -102,6 +109,15 @@ public class ZipScanner extends DirectoryScanner { | |||
this.srcFile = srcFile; | |||
} | |||
/** | |||
* Sets encoding of file names. | |||
* | |||
* @since Ant 1.6 | |||
*/ | |||
public void setEncoding(String encoding) { | |||
this.encoding = encoding; | |||
} | |||
/** | |||
* Returns the names of the files which matched at least one of the | |||
* include patterns and none of the exclude patterns. | |||
@@ -230,37 +246,29 @@ public class ZipScanner extends DirectoryScanner { | |||
} | |||
ZipEntry entry = null; | |||
ZipInputStream in = null; | |||
ZipFile zf = null; | |||
myentries = new Hashtable(); | |||
try { | |||
try { | |||
in = new ZipInputStream(new FileInputStream(srcFile)); | |||
zf = new ZipFile(srcFile, encoding); | |||
} catch (ZipException ex) { | |||
throw new BuildException("problem reading " + srcFile, ex); | |||
} catch (IOException ex) { | |||
throw new BuildException("problem opening " + srcFile, ex); | |||
} | |||
while (true) { | |||
try { | |||
entry = in.getNextEntry(); | |||
if (entry == null) { | |||
break; | |||
} | |||
myentries.put(new String(entry.getName()), | |||
new Resource(entry.getName(), true, | |||
entry.getTime(), | |||
entry.isDirectory())); | |||
} catch (ZipException ex) { | |||
throw new BuildException("problem reading " + srcFile, | |||
ex); | |||
} catch (IOException e) { | |||
throw new BuildException("problem reading zip entry from " | |||
+ srcFile, e); | |||
} | |||
Enumeration enum = zf.getEntries(); | |||
while (enum.hasMoreElements()) { | |||
entry = (ZipEntry) enum.nextElement(); | |||
myentries.put(new String(entry.getName()), | |||
new Resource(entry.getName(), true, | |||
entry.getTime(), | |||
entry.isDirectory())); | |||
} | |||
} finally { | |||
if (in != null) { | |||
if (zf != null) { | |||
try { | |||
in.close(); | |||
zf.close(); | |||
} catch (IOException ex) { | |||
// swallow | |||
} | |||