You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by pe...@apache.org on 2020/11/30 01:45:36 UTC
[commons-compress] 01/03: COMPRESS-560: Do not return false if the
entry is a tar sparse entry
This is an automated email from the ASF dual-hosted git repository.
peterlee pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-compress.git
commit b86feb61e7d96e36c9348b4c4ac9ead331fc714a
Author: theobisproject <th...@gmail.com>
AuthorDate: Sun Nov 22 14:07:21 2020 +0100
COMPRESS-560: Do not return false if the entry is a tar sparse entry
---
.../archivers/tar/TarArchiveInputStream.java | 8 +--
.../compress/archivers/tar/SparseFilesTest.java | 59 +++++++++++++---------
2 files changed, 37 insertions(+), 30 deletions(-)
diff --git a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
index cdaf692..ea68d7c 100644
--- a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
@@ -1006,15 +1006,11 @@ public class TarArchiveInputStream extends ArchiveInputStream {
/**
* Whether this class is able to read the given entry.
*
- * <p>May return false if the current entry is a sparse file.</p>
+ * @return The implementation will return true if the {@link ArchiveEntry} is an instance of {@link TarArchiveEntry}
*/
@Override
public boolean canReadEntryData(final ArchiveEntry ae) {
- if (ae instanceof TarArchiveEntry) {
- final TarArchiveEntry te = (TarArchiveEntry) ae;
- return !te.isSparse();
- }
- return false;
+ return ae instanceof TarArchiveEntry;
}
/**
diff --git a/src/test/java/org/apache/commons/compress/archivers/tar/SparseFilesTest.java b/src/test/java/org/apache/commons/compress/archivers/tar/SparseFilesTest.java
index d528b65..49f49e1 100644
--- a/src/test/java/org/apache/commons/compress/archivers/tar/SparseFilesTest.java
+++ b/src/test/java/org/apache/commons/compress/archivers/tar/SparseFilesTest.java
@@ -45,7 +45,7 @@ public class SparseFilesTest extends AbstractTestCase {
assertTrue(ae.isOldGNUSparse());
assertTrue(ae.isGNUSparse());
assertFalse(ae.isPaxGNUSparse());
- assertFalse(tin.canReadEntryData(ae));
+ assertTrue(tin.canReadEntryData(ae));
final List<TarArchiveStructSparse> sparseHeaders = ae.getSparseHeaders();
assertEquals(3, sparseHeaders.size());
@@ -82,27 +82,33 @@ public class SparseFilesTest extends AbstractTestCase {
try (TarArchiveInputStream paxGNUSparseInputStream = new TarArchiveInputStream(new FileInputStream(paxGNUSparseTar))) {
// compare between old GNU and PAX 0.0
- paxGNUSparseInputStream.getNextTarEntry();
+ TarArchiveEntry paxGNUEntry = paxGNUSparseInputStream.getNextTarEntry();
+ assertTrue(paxGNUSparseInputStream.canReadEntryData(paxGNUEntry));
try (TarArchiveInputStream oldGNUSparseInputStream = new TarArchiveInputStream(new FileInputStream(oldGNUSparseTar))) {
- oldGNUSparseInputStream.getNextTarEntry();
+ final TarArchiveEntry oldGNUEntry = oldGNUSparseInputStream.getNextTarEntry();
+ assertTrue(oldGNUSparseInputStream.canReadEntryData(oldGNUEntry));
assertArrayEquals(IOUtils.toByteArray(oldGNUSparseInputStream),
- IOUtils.toByteArray(paxGNUSparseInputStream));
+ IOUtils.toByteArray(paxGNUSparseInputStream));
}
// compare between old GNU and PAX 0.1
- paxGNUSparseInputStream.getNextTarEntry();
+ paxGNUEntry = paxGNUSparseInputStream.getNextTarEntry();
+ assertTrue(paxGNUSparseInputStream.canReadEntryData(paxGNUEntry));
try (TarArchiveInputStream oldGNUSparseInputStream = new TarArchiveInputStream(new FileInputStream(oldGNUSparseTar))) {
- oldGNUSparseInputStream.getNextTarEntry();
+ final TarArchiveEntry oldGNUEntry = oldGNUSparseInputStream.getNextTarEntry();
+ assertTrue(oldGNUSparseInputStream.canReadEntryData(oldGNUEntry));
assertArrayEquals(IOUtils.toByteArray(oldGNUSparseInputStream),
- IOUtils.toByteArray(paxGNUSparseInputStream));
+ IOUtils.toByteArray(paxGNUSparseInputStream));
}
// compare between old GNU and PAX 1.0
- paxGNUSparseInputStream.getNextTarEntry();
+ paxGNUEntry = paxGNUSparseInputStream.getNextTarEntry();
+ assertTrue(paxGNUSparseInputStream.canReadEntryData(paxGNUEntry));
try (TarArchiveInputStream oldGNUSparseInputStream = new TarArchiveInputStream(new FileInputStream(oldGNUSparseTar))) {
- oldGNUSparseInputStream.getNextTarEntry();
+ final TarArchiveEntry oldGNUEntry = oldGNUSparseInputStream.getNextTarEntry();
+ assertTrue(oldGNUSparseInputStream.canReadEntryData(oldGNUEntry));
assertArrayEquals(IOUtils.toByteArray(oldGNUSparseInputStream),
- IOUtils.toByteArray(paxGNUSparseInputStream));
+ IOUtils.toByteArray(paxGNUSparseInputStream));
}
}
}
@@ -114,13 +120,14 @@ public class SparseFilesTest extends AbstractTestCase {
}
try {
- final File file = getFile("oldgnu_sparse.tar");
- try (InputStream sparseFileInputStream = extractTarAndGetInputStream(file, "sparsefile");
- TarArchiveInputStream tin = new TarArchiveInputStream(new FileInputStream(file))) {
- tin.getNextTarEntry();
- assertArrayEquals(IOUtils.toByteArray(tin),
- IOUtils.toByteArray(sparseFileInputStream));
- }
+ final File file = getFile("oldgnu_sparse.tar");
+ try (InputStream sparseFileInputStream = extractTarAndGetInputStream(file, "sparsefile");
+ TarArchiveInputStream tin = new TarArchiveInputStream(new FileInputStream(file))) {
+ final TarArchiveEntry entry = tin.getNextTarEntry();
+ assertTrue(tin.canReadEntryData(entry));
+ assertArrayEquals(IOUtils.toByteArray(tin),
+ IOUtils.toByteArray(sparseFileInputStream));
+ }
} catch (RuntimeException | IOException ex) {
ex.printStackTrace();
throw ex;
@@ -137,6 +144,7 @@ public class SparseFilesTest extends AbstractTestCase {
try (InputStream sparseFileInputStream = extractTarAndGetInputStream(file, "sparse6");
TarArchiveInputStream tin = new TarArchiveInputStream(new FileInputStream(file))) {
final TarArchiveEntry ae = tin.getNextTarEntry();
+ assertTrue(tin.canReadEntryData(ae));
assertArrayEquals(IOUtils.toByteArray(tin),
IOUtils.toByteArray(sparseFileInputStream));
@@ -176,24 +184,27 @@ public class SparseFilesTest extends AbstractTestCase {
final File file = getFile("pax_gnu_sparse.tar");
try (TarArchiveInputStream tin = new TarArchiveInputStream(new FileInputStream(file))) {
- tin.getNextTarEntry();
+ TarArchiveEntry paxGNUEntry = tin.getNextTarEntry();
+ assertTrue(tin.canReadEntryData(paxGNUEntry));
try (InputStream sparseFileInputStream = extractTarAndGetInputStream(file, "sparsefile-0.0")) {
assertArrayEquals(IOUtils.toByteArray(tin),
- IOUtils.toByteArray(sparseFileInputStream));
+ IOUtils.toByteArray(sparseFileInputStream));
}
// TODO : it's wired that I can only get a 0 size sparsefile-0.1 on my Ubuntu 16.04
// using "tar -xf pax_gnu_sparse.tar"
- tin.getNextTarEntry();
+ paxGNUEntry = tin.getNextTarEntry();
+ assertTrue(tin.canReadEntryData(paxGNUEntry));
try (InputStream sparseFileInputStream = extractTarAndGetInputStream(file, "sparsefile-0.0")) {
assertArrayEquals(IOUtils.toByteArray(tin),
- IOUtils.toByteArray(sparseFileInputStream));
+ IOUtils.toByteArray(sparseFileInputStream));
}
- tin.getNextTarEntry();
+ paxGNUEntry = tin.getNextTarEntry();
+ assertTrue(tin.canReadEntryData(paxGNUEntry));
try (InputStream sparseFileInputStream = extractTarAndGetInputStream(file, "sparsefile-1.0")) {
assertArrayEquals(IOUtils.toByteArray(tin),
- IOUtils.toByteArray(sparseFileInputStream));
+ IOUtils.toByteArray(sparseFileInputStream));
}
}
}
@@ -204,7 +215,7 @@ public class SparseFilesTest extends AbstractTestCase {
assertTrue(ae.isGNUSparse());
assertTrue(ae.isPaxGNUSparse());
assertFalse(ae.isOldGNUSparse());
- assertFalse(tin.canReadEntryData(ae));
+ assertTrue(tin.canReadEntryData(ae));
final List<TarArchiveStructSparse> sparseHeaders = ae.getSparseHeaders();
assertEquals(3, sparseHeaders.size());