This is a workaround for Bugzilla Issue 57822 https://bz.apache.org/bugzilla/show_bug.cgi?id=57822master
| @@ -84,6 +84,16 @@ Fixed bugs: | |||
| * TarEntry's constructor with a File and a String arg didn't | |||
| normalize the name. | |||
| * Between 1.8.4 and 1.9.5 TarArchiveInputStream started to parse file | |||
| names using the platform's default encoding rather than as ASCII. | |||
| This has been a breaking change that has never been marked as such | |||
| (in fact it went unnoticed). In order to allow <untar> and | |||
| <tarfileset> to work on platforms who's encoding doesn't match the | |||
| encoding of file names inside the archive, the both now support | |||
| encoding attributes. | |||
| The attribute has also been added to <tar> for symmetry. | |||
| Bugzilla Report 57822 | |||
| Other changes: | |||
| -------------- | |||
| @@ -146,6 +146,15 @@ or "bzip2".</p> | |||
| "none".</td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">encoding</td> | |||
| <td valign="top">The character encoding to use for filenames | |||
| inside the tar file. For a list of possible values see the <a | |||
| href="http://docs.oracle.com/javase/7/docs/technotes/guides/intl/encoding.doc.html">Supported Encodings</a>.<br/> | |||
| Defaults to the platform's default character encoding. | |||
| <em>Since Ant 1.9.4</em> | |||
| <td align="center" valign="top">No</td> | |||
| </tr> | |||
| </table> | |||
| <h3>Nested Elements</h3> | |||
| @@ -100,12 +100,13 @@ archive.</p> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">encoding</td> | |||
| <td valign="top"><b>Note:</b> This attribute is not available for | |||
| the <code>untar</code> task.<br> | |||
| <td valign="top"> | |||
| The character encoding that has been used for filenames | |||
| inside the zip file. For a list of possible values see the <a | |||
| href="http://docs.oracle.com/javase/7/docs/technotes/guides/intl/encoding.doc.html">Supported Encodings</a>.<br/> | |||
| Defaults to "UTF8", use the magic value | |||
| Defaults to "UTF8" for the <code>unzip</code> and the | |||
| platform's default encoding for the <code>untar</code> task. Use | |||
| the magic value | |||
| <code>native-encoding</code> for the platform's default character | |||
| encoding. | |||
| <br/>See also the <a href="zip.html#encoding">discussion in the | |||
| @@ -130,6 +130,15 @@ directories. Default is 755.</td> | |||
| </td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">encoding</td> | |||
| <td valign="top">The character encoding to use for filenames | |||
| inside the zip file. For a list of possible values see the <a | |||
| href="http://docs.oracle.com/javase/7/docs/technotes/guides/intl/encoding.doc.html">Supported Encodings</a>. | |||
| Defaults to the platform's default character encoding. | |||
| <em>Since Ant 1.9.5</em> | |||
| <td align="center" valign="top">No</td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||
| <p>The <i>fullpath</i> attribute can only be set for filesets that | |||
| @@ -97,7 +97,6 @@ directories. Default is 755. <em>since Ant 1.5.2</em>.</td> | |||
| inside the zip file. For a list of possible values see the <a | |||
| href="http://docs.oracle.com/javase/7/docs/technotes/guides/intl/encoding.doc.html">Supported Encodings</a>. | |||
| Defaults to the platform's default character encoding. | |||
| <b>Only supported by zipfileset.</b></td> | |||
| <td align="center" valign="top">No</td> | |||
| </tr> | |||
| <tr> | |||
| @@ -57,8 +57,12 @@ | |||
| <untar src="." dest="${output}/untar" /> | |||
| </target> | |||
| <target name="encoding"> | |||
| <untar src="expected/asf-logo.gif.tar" dest="${output}/untar" encoding="foo"/> | |||
| <target name="encodingTest"> | |||
| <mkdir dir="${output}/untartestin"/> | |||
| <touch file="${output}/untartestin/foo"/> | |||
| <tar tarfile="${output}/untartest.tar" basedir="${output}/untartestin" encoding="UnicodeBig"/> | |||
| <mkdir dir="${output}/untartestout"/> | |||
| <untar src="${output}/untartest.tar" dest="${output}/untartestout" encoding="UnicodeBig"/> | |||
| </target> | |||
| <target name="resourceCollection"> | |||
| @@ -72,12 +72,28 @@ public class Expand extends Task { | |||
| public static final String NATIVE_ENCODING = "native-encoding"; | |||
| private String encoding = "UTF8"; | |||
| private String encoding; | |||
| /** Error message when more that one mapper is defined */ | |||
| public static final String ERROR_MULTIPLE_MAPPERS = "Cannot define more than one mapper"; | |||
| private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); | |||
| /** | |||
| * Creates an Expand instance and sets encoding to UTF-8. | |||
| */ | |||
| public Expand() { | |||
| this("UTF8"); | |||
| } | |||
| /** | |||
| * Creates an Expand instance and sets the given encoding. | |||
| * | |||
| * @since Ant 1.9.5 | |||
| */ | |||
| protected Expand(String encoding) { | |||
| this.encoding = encoding; | |||
| } | |||
| /** | |||
| * Whether try ing to expand an empty archive would be an error. | |||
| * | |||
| @@ -123,6 +123,12 @@ public class Tar extends MatchingTask { | |||
| private TarCompressionMethod compression = new TarCompressionMethod(); | |||
| /** | |||
| * Encoding to use for filenames, defaults to the platform's | |||
| * default encoding. | |||
| */ | |||
| private String encoding; | |||
| /** | |||
| * Add a new fileset with the option to specify permissions | |||
| * @return the tar fileset to be used as the nested element. | |||
| @@ -231,6 +237,20 @@ public class Tar extends MatchingTask { | |||
| this.compression = mode; | |||
| } | |||
| /** | |||
| * Encoding to use for filenames, defaults to the platform's | |||
| * default encoding. | |||
| * | |||
| * <p>For a list of possible values see <a | |||
| * href="http://java.sun.com/j2se/1.5.0/docs/guide/intl/encoding.doc.html">http://java.sun.com/j2se/1.5.0/docs/guide/intl/encoding.doc.html</a>.</p> | |||
| * @param encoding the encoding name | |||
| * | |||
| * @since Ant 1.9.5 | |||
| */ | |||
| public void setEncoding(final String encoding) { | |||
| this.encoding = encoding; | |||
| } | |||
| /** | |||
| * do the business | |||
| * @throws BuildException on error | |||
| @@ -304,7 +324,8 @@ public class Tar extends MatchingTask { | |||
| tOut = new TarOutputStream( | |||
| compression.compress( | |||
| new BufferedOutputStream( | |||
| new FileOutputStream(tarFile)))); | |||
| new FileOutputStream(tarFile))), | |||
| encoding); | |||
| tOut.setDebug(true); | |||
| if (longFileMode.isTruncateMode()) { | |||
| tOut.setLongFileMode(TarOutputStream.LONGFILE_TRUNCATE); | |||
| @@ -58,6 +58,10 @@ public class Untar extends Expand { | |||
| */ | |||
| private UntarCompressionMethod compression = new UntarCompressionMethod(); | |||
| public Untar() { | |||
| super(null); | |||
| } | |||
| /** | |||
| * Set decompression algorithm to use; default=none. | |||
| * | |||
| @@ -74,18 +78,6 @@ public class Untar extends Expand { | |||
| compression = method; | |||
| } | |||
| /** | |||
| * No encoding support in Untar. | |||
| * @param encoding not used | |||
| * @throws BuildException always | |||
| * @since Ant 1.6 | |||
| */ | |||
| public void setEncoding(String encoding) { | |||
| throw new BuildException("The " + getTaskName() | |||
| + " task doesn't support the encoding" | |||
| + " attribute", getLocation()); | |||
| } | |||
| /** | |||
| * No unicode extra fields in tar. | |||
| * | |||
| @@ -157,7 +149,8 @@ public class Untar extends Expand { | |||
| try { | |||
| tis = | |||
| new TarInputStream(compression.decompress(name, | |||
| new BufferedInputStream(stream))); | |||
| new BufferedInputStream(stream)), | |||
| getEncoding()); | |||
| log("Expanding: " + name + " into " + dir, Project.MSG_INFO); | |||
| TarEntry te = null; | |||
| boolean empty = true; | |||
| @@ -72,6 +72,8 @@ public abstract class ArchiveFileSet extends FileSet { | |||
| private boolean errorOnMissingArchive = true; | |||
| private String encoding = null; | |||
| /** Constructor for ArchiveFileSet */ | |||
| public ArchiveFileSet() { | |||
| super(); | |||
| @@ -100,6 +102,7 @@ public abstract class ArchiveFileSet extends FileSet { | |||
| fileModeHasBeenSet = fileset.fileModeHasBeenSet; | |||
| dirModeHasBeenSet = fileset.dirModeHasBeenSet; | |||
| errorOnMissingArchive = fileset.errorOnMissingArchive; | |||
| encoding = fileset.encoding; | |||
| } | |||
| /** | |||
| @@ -267,6 +270,33 @@ public abstract class ArchiveFileSet extends FileSet { | |||
| return fullpath; | |||
| } | |||
| /** | |||
| * Set the encoding used for this ZipFileSet. | |||
| * @param enc encoding as String. | |||
| * @since Ant 1.9.5 | |||
| */ | |||
| public void setEncoding(String enc) { | |||
| checkAttributesAllowed(); | |||
| this.encoding = enc; | |||
| } | |||
| /** | |||
| * Get the encoding used for this ZipFileSet. | |||
| * @return String encoding. | |||
| * @since Ant 1.9.5 | |||
| */ | |||
| public String getEncoding() { | |||
| if (isReference()) { | |||
| AbstractFileSet ref = getRef(getProject()); | |||
| if (ref instanceof ArchiveFileSet) { | |||
| return ((ArchiveFileSet) ref).getEncoding(); | |||
| } else { | |||
| return null; | |||
| } | |||
| } | |||
| return encoding; | |||
| } | |||
| /** | |||
| * Creates a scanner for this type of archive. | |||
| * @return the scanner. | |||
| @@ -180,6 +180,7 @@ public class TarFileSet extends ArchiveFileSet { | |||
| */ | |||
| protected ArchiveScanner newArchiveScanner() { | |||
| TarScanner zs = new TarScanner(); | |||
| zs.setEncoding(getEncoding()); | |||
| return zs; | |||
| } | |||
| @@ -58,7 +58,7 @@ public class TarScanner extends ArchiveScanner { | |||
| try { | |||
| try { | |||
| ti = new TarInputStream(src.getInputStream()); | |||
| ti = new TarInputStream(src.getInputStream(), encoding); | |||
| } catch (IOException ex) { | |||
| throw new BuildException("problem opening " + srcFile, ex); | |||
| } | |||
| @@ -84,4 +84,4 @@ public class TarScanner extends ArchiveScanner { | |||
| FileUtils.close(ti); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -33,8 +33,6 @@ import org.apache.tools.ant.Project; | |||
| */ | |||
| public class ZipFileSet extends ArchiveFileSet { | |||
| private String encoding = null; | |||
| /** Constructor for ZipFileSet */ | |||
| public ZipFileSet() { | |||
| super(); | |||
| @@ -54,34 +52,6 @@ public class ZipFileSet extends ArchiveFileSet { | |||
| */ | |||
| protected ZipFileSet(ZipFileSet fileset) { | |||
| super(fileset); | |||
| encoding = fileset.encoding; | |||
| } | |||
| /** | |||
| * Set the encoding used for this ZipFileSet. | |||
| * @param enc encoding as String. | |||
| * @since Ant 1.7 | |||
| */ | |||
| public void setEncoding(String enc) { | |||
| checkZipFileSetAttributesAllowed(); | |||
| this.encoding = enc; | |||
| } | |||
| /** | |||
| * Get the encoding used for this ZipFileSet. | |||
| * @return String encoding. | |||
| * @since Ant 1.7 | |||
| */ | |||
| public String getEncoding() { | |||
| if (isReference()) { | |||
| AbstractFileSet ref = getRef(getProject()); | |||
| if (ref instanceof ZipFileSet) { | |||
| return ((ZipFileSet) ref).getEncoding(); | |||
| } else { | |||
| return null; | |||
| } | |||
| } | |||
| return encoding; | |||
| } | |||
| /** | |||
| @@ -90,7 +60,7 @@ public class ZipFileSet extends ArchiveFileSet { | |||
| */ | |||
| protected ArchiveScanner newArchiveScanner() { | |||
| ZipScanner zs = new ZipScanner(); | |||
| zs.setEncoding(encoding); | |||
| zs.setEncoding(getEncoding()); | |||
| return zs; | |||
| } | |||
| @@ -34,4 +34,15 @@ | |||
| </copy> | |||
| </target> | |||
| <target name="test-refid-check-encoding"> | |||
| <tarfileset id="test-refid2" | |||
| encoding="utf-8" | |||
| dir="${basedir}"/> | |||
| <au:expectfailure> | |||
| <tarfileset id="ref4" | |||
| encoding="utf-8" | |||
| refid="test-refid2"/> | |||
| </au:expectfailure> | |||
| </target> | |||
| </project> | |||
| @@ -84,12 +84,10 @@ public class UntarTest { | |||
| @Test | |||
| public void testEncoding() { | |||
| try { | |||
| buildRule.executeTarget("encoding"); | |||
| fail("<untar> overrides setEncoding."); | |||
| } catch (BuildException ex) { | |||
| assertEquals("The untar task doesn't support the encoding attribute", ex.getMessage()); | |||
| } | |||
| buildRule.executeTarget("encodingTest"); | |||
| String filename = buildRule.getProject().getProperty("output") + "/untartestout/foo"; | |||
| assertTrue("foo has been properly named", | |||
| buildRule.getProject().resolveFile(filename).exists()); | |||
| } | |||
| @Test | |||