From a1690519317068d9855174752d22ff45f0e4c962 Mon Sep 17 00:00:00 2001 From: Zhijie Shen Date: Wed, 8 Oct 2014 15:35:24 -0700 Subject: [PATCH] HADOOP-11179. Java untar should handle the case that the file entry comes without its parent directory entry. Contributed by Craig Welch. --- hadoop-common-project/hadoop-common/CHANGES.txt | 3 +++ .../src/main/java/org/apache/hadoop/fs/FileUtil.java | 6 +++--- .../src/test/java/org/apache/hadoop/fs/TestFileUtil.java | 6 +++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 5cd71ab0ee..404d978886 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -952,6 +952,9 @@ Release 2.6.0 - UNRELEASED HADOOP-11163. MetricsSystemImpl may miss a registered source. (Chuan Liu via cnauroth) + HADOOP-11179. Java untar should handle the case that the file entry comes + without its parent directory entry. (Craig Welch via zjshen) + Release 2.5.1 - 2014-09-05 INCOMPATIBLE CHANGES diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileUtil.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileUtil.java index 8aa84230dd..2b0529356e 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileUtil.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileUtil.java @@ -707,7 +707,7 @@ private static void unpackEntries(TarArchiveInputStream tis, TarArchiveEntry entry, File outputDir) throws IOException { if (entry.isDirectory()) { File subDir = new File(outputDir, entry.getName()); - if (!subDir.mkdir() && !subDir.isDirectory()) { + if (!subDir.mkdirs() && !subDir.isDirectory()) { throw new IOException("Mkdirs failed to create tar internal dir " + outputDir); } @@ -720,8 +720,8 @@ private static void unpackEntries(TarArchiveInputStream tis, } File outputFile = new File(outputDir, entry.getName()); - if (!outputDir.exists()) { - if (!outputDir.mkdirs()) { + if (!outputFile.getParentFile().exists()) { + if (!outputFile.getParentFile().mkdirs()) { throw new IOException("Mkdirs failed to create tar internal dir " + outputDir); } diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFileUtil.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFileUtil.java index 2234f2f453..2a039887c0 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFileUtil.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFileUtil.java @@ -619,7 +619,7 @@ public void testUnTar() throws IOException { OutputStream os = new FileOutputStream(simpleTar); TarOutputStream tos = new TarOutputStream(os); try { - TarEntry te = new TarEntry("foo"); + TarEntry te = new TarEntry("/bar/foo"); byte[] data = "some-content".getBytes("UTF-8"); te.setSize(data.length); tos.putNextEntry(te); @@ -634,8 +634,8 @@ public void testUnTar() throws IOException { // successfully untar it into an existing dir: FileUtil.unTar(simpleTar, tmp); // check result: - assertTrue(new File(tmp, "foo").exists()); - assertEquals(12, new File(tmp, "foo").length()); + assertTrue(new File(tmp, "/bar/foo").exists()); + assertEquals(12, new File(tmp, "/bar/foo").length()); final File regularFile = new File(tmp, "QuickBrownFoxJumpsOverTheLazyDog"); regularFile.createNewFile();