Browse Source

xz support in tar - PR 60350

master
Stefan Bodewig 8 years ago
parent
commit
f479b5f52f
2 changed files with 78 additions and 2 deletions
  1. +34
    -2
      src/main/org/apache/tools/ant/taskdefs/Tar.java
  2. +44
    -0
      src/tests/antunit/taskdefs/tar-test.xml

+ 34
- 2
src/main/org/apache/tools/ant/taskdefs/Tar.java View File

@@ -24,6 +24,8 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
@@ -230,6 +232,7 @@ public class Tar extends MatchingTask {
* <li> none - no compression
* <li> gzip - Gzip compression
* <li> bzip2 - Bzip2 compression
* <li>xz - XZ compression, requires XZ for Java
* </ul>
* @param mode the compression method.
*/
@@ -971,7 +974,11 @@ public class Tar extends MatchingTask {
* BZIP2 compression
*/
private static final String BZIP2 = "bzip2";

/**
* XZ compression
* @since 1.10.1
*/
private static final String XZ = "xz";

/**
* Default constructor
@@ -987,7 +994,7 @@ public class Tar extends MatchingTask {
*/
@Override
public String[] getValues() {
return new String[] {NONE, GZIP, BZIP2 };
return new String[] {NONE, GZIP, BZIP2, XZ };
}

/**
@@ -1003,6 +1010,8 @@ public class Tar extends MatchingTask {
final String v = getValue();
if (GZIP.equals(v)) {
return new GZIPOutputStream(ostream);
} else if (XZ.equals(v)) {
return newXZOutputStream(ostream);
} else {
if (BZIP2.equals(v)) {
ostream.write('B');
@@ -1012,5 +1021,28 @@ public class Tar extends MatchingTask {
}
return ostream;
}

private static OutputStream newXZOutputStream(OutputStream ostream)
throws BuildException {
try {
Class<?> fClazz = Class.forName("org.tukaani.xz.FilterOptions");
Class<?> oClazz = Class.forName("org.tukaani.xz.LZMA2Options");
Class<? extends OutputStream> sClazz =
Class.forName("org.tukaani.xz.XZOutputStream")
.asSubclass(OutputStream.class);
Constructor<? extends OutputStream> c =
sClazz.getConstructor(OutputStream.class, fClazz);
return c.newInstance(ostream, oClazz.newInstance());
} catch (ClassNotFoundException ex) {
throw new BuildException("xz compression requires the XZ for Java library",
ex);
} catch (NoSuchMethodException
| InstantiationException
| IllegalAccessException
| InvocationTargetException
ex) {
throw new BuildException("failed to create XZOutputStream", ex);
}
}
}
}

+ 44
- 0
src/tests/antunit/taskdefs/tar-test.xml View File

@@ -24,6 +24,7 @@
<target name="setUp">
<mkdir dir="${input}" />
<mkdir dir="${output}" />
<available property="xz.present" classname="org.tukaani.xz.XZOutputStream"/>
</target>

<target name="testTarFilesetHandlesFilesetReferences" depends="setUp">
@@ -115,4 +116,47 @@
<untar dest="${output}" src="${output}/x.tar"/>
<au:assertFileExists file="${output}/${longfile.file.name}"/>
</target>

<target name="testGzipCompression" depends="setUp">
<au:assertFileExists file="../../../etc/testcases/asf-logo.gif"/>
<tar destfile="${input}/asf-logo.gif.tar.gz" compression="gzip">
<file file="../../../etc/testcases/asf-logo.gif"/>
</tar>
<gunzip dest="${input}/asf-logo.gif.tar">
<file file="${input}/asf-logo.gif.tar.gz"/>
</gunzip>
<untar src="${input}/asf-logo.gif.tar" dest="${output}"/>
<au:assertFilesMatch
expected="../../../etc/testcases/asf-logo.gif"
actual="${output}/asf-logo.gif"/>
</target>

<target name="testBzip2Compression" depends="setUp">
<au:assertFileExists file="../../../etc/testcases/asf-logo.gif"/>
<tar destfile="${input}/asf-logo.gif.tar.bz2" compression="bzip2">
<file file="../../../etc/testcases/asf-logo.gif"/>
</tar>
<bunzip2 dest="${input}/asf-logo.gif.tar">
<file file="${input}/asf-logo.gif.tar.bz2"/>
</bunzip2>
<untar src="${input}/asf-logo.gif.tar" dest="${output}"/>
<au:assertFilesMatch
expected="../../../etc/testcases/asf-logo.gif"
actual="${output}/asf-logo.gif"/>
</target>

<target name="testXzCompression" depends="setUp" if="xz.present">
<au:assertFileExists file="../../../etc/testcases/asf-logo.gif"/>
<tar destfile="${input}/asf-logo.gif.tar.xz" compression="xz">
<file file="../../../etc/testcases/asf-logo.gif"/>
</tar>
<unxz dest="${input}/asf-logo.gif.tar">
<file file="${input}/asf-logo.gif.tar.xz"/>
</unxz>
<untar src="${input}/asf-logo.gif.tar" dest="${output}"/>
<au:assertFilesMatch
expected="../../../etc/testcases/asf-logo.gif"
actual="${output}/asf-logo.gif"/>
</target>

</project>

Loading…
Cancel
Save