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
The following commit(s) were added to refs/heads/master by this push: new 7cb298d COMPRESS-509 : add '/' to directories with long name in tar 7cb298d is described below commit 7cb298d943ec1a2811f1472824b7724d580a9217 Author: PeterAlfredLee <peteralfred...@gmail.com> AuthorDate: Wed May 6 16:32:58 2020 +0800 COMPRESS-509 : add '/' to directories with long name in tar Resolve the ambiguous behavior of the TarArchiveEntry.getName() method between directory with short name and long name. And improve the imports of some test classes. --- .../archivers/tar/TarArchiveInputStream.java | 8 ++- .../commons/compress/archivers/TarTestCase.java | 6 ++- .../archivers/tar/TarArchiveEntryTest.java | 2 - .../archivers/tar/TarArchiveInputStreamTest.java | 59 ++++++++++++++++++++-- 4 files changed, 67 insertions(+), 8 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 c02beda..716718d 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 @@ -393,7 +393,13 @@ public class TarArchiveInputStream extends ArchiveInputStream { // entry return null; } - currEntry.setName(zipEncoding.decode(longNameData)); + + // COMPRESS-509 : the name of directories should end with '/' + String name = zipEncoding.decode(longNameData); + if (currEntry.isDirectory() && !name.endsWith("/")) { + name += "/"; + } + currEntry.setName(name); } if (currEntry.isGlobalPaxHeader()){ // Process Global Pax headers diff --git a/src/test/java/org/apache/commons/compress/archivers/TarTestCase.java b/src/test/java/org/apache/commons/compress/archivers/TarTestCase.java index 19fa51a..27c1e9a 100644 --- a/src/test/java/org/apache/commons/compress/archivers/TarTestCase.java +++ b/src/test/java/org/apache/commons/compress/archivers/TarTestCase.java @@ -18,7 +18,11 @@ */ package org.apache.commons.compress.archivers; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.io.File; import java.io.FileInputStream; diff --git a/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveEntryTest.java b/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveEntryTest.java index 703d3a4..54b372e 100644 --- a/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveEntryTest.java +++ b/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveEntryTest.java @@ -32,8 +32,6 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; import java.util.Locale; import org.apache.commons.compress.AbstractTestCase; import org.junit.Test; diff --git a/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStreamTest.java b/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStreamTest.java index 661e66b..b1cee11 100644 --- a/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStreamTest.java +++ b/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStreamTest.java @@ -18,9 +18,6 @@ package org.apache.commons.compress.archivers.tar; -import static org.apache.commons.compress.AbstractTestCase.getFile; -import static org.apache.commons.compress.AbstractTestCase.mkdir; -import static org.apache.commons.compress.AbstractTestCase.rmdir; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -28,6 +25,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; @@ -41,12 +39,15 @@ import java.util.Map; import java.util.TimeZone; import java.util.zip.GZIPInputStream; +import org.apache.commons.compress.AbstractTestCase; import org.apache.commons.compress.archivers.ArchiveEntry; +import org.apache.commons.compress.archivers.ArchiveException; +import org.apache.commons.compress.archivers.ArchiveStreamFactory; import org.apache.commons.compress.utils.CharsetNames; import org.apache.commons.compress.utils.IOUtils; import org.junit.Test; -public class TarArchiveInputStreamTest { +public class TarArchiveInputStreamTest extends AbstractTestCase { @Test public void readSimplePaxHeader() throws Exception { @@ -373,6 +374,56 @@ public class TarArchiveInputStreamTest { } } + @Test + public void testDirectoryWithLongNameEndsWithSlash() throws IOException, ArchiveException { + final String rootPath = dir.getAbsolutePath(); + final String dirDirectory = "COMPRESS-509"; + final int count = 100; + File root = new File(rootPath + "/" + dirDirectory); + root.mkdirs(); + for (int i = 1; i < count; i++) { + // ----------------------- + // create empty dirs with incremental length + // ----------------------- + String subDir = ""; + for (int j = 0; j < i; j++) { + subDir += "a"; + } + File dir = new File(rootPath + "/" + dirDirectory, "/" + subDir); + dir.mkdir(); + + // ----------------------- + // tar these dirs + // ----------------------- + String fileName = "/" + dirDirectory + "/" + subDir; + File tarF = new File(rootPath + "/tar" + i + ".tar"); + FileOutputStream dest = new FileOutputStream(tarF); + TarArchiveOutputStream out = new TarArchiveOutputStream(new BufferedOutputStream(dest)); + out.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_STAR); + out.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); + + File file = new File(rootPath, fileName); + TarArchiveEntry entry = new TarArchiveEntry(file); + entry.setName(fileName); + out.putArchiveEntry(entry); + out.closeArchiveEntry(); + out.flush(); + out.close(); + + // ----------------------- + // untar these tars + // ----------------------- + InputStream is = new FileInputStream(tarF); + TarArchiveInputStream debInputStream = (TarArchiveInputStream) new ArchiveStreamFactory() + .createArchiveInputStream("tar", is); + TarArchiveEntry outEntry; + while ((outEntry = (TarArchiveEntry) debInputStream.getNextEntry()) != null) { + assertTrue(outEntry.getName().endsWith("/")); + } + debInputStream.close(); + } + } + private TarArchiveInputStream getTestStream(final String name) { return new TarArchiveInputStream( TarArchiveInputStreamTest.class.getResourceAsStream(name));