You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by jl...@apache.org on 2018/02/02 17:34:27 UTC
hadoop git commit: HADOOP-15170. Add symlink support to
FileUtil#unTarUsingJava. Contributed by Ajay Kumar
Repository: hadoop
Updated Branches:
refs/heads/trunk 4aef8bd2e -> 460d77bd6
HADOOP-15170. Add symlink support to FileUtil#unTarUsingJava. Contributed by Ajay Kumar
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/460d77bd
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/460d77bd
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/460d77bd
Branch: refs/heads/trunk
Commit: 460d77bd646d03d3eb7670f9017aeeb5410c4a95
Parents: 4aef8bd
Author: Jason Lowe <jl...@apache.org>
Authored: Fri Feb 2 11:31:39 2018 -0600
Committer: Jason Lowe <jl...@apache.org>
Committed: Fri Feb 2 11:33:26 2018 -0600
----------------------------------------------------------------------
.../java/org/apache/hadoop/fs/FileUtil.java | 12 ++-
.../java/org/apache/hadoop/fs/TestFileUtil.java | 86 ++++++++++++++++++++
2 files changed, 97 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hadoop/blob/460d77bd/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileUtil.java
----------------------------------------------------------------------
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 bf9b146..8743be5 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
@@ -34,6 +34,8 @@ import java.net.URI;
import java.net.UnknownHostException;
import java.nio.charset.Charset;
import java.nio.file.AccessDeniedException;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
@@ -894,7 +896,7 @@ public class FileUtil {
}
}
- private static void unTarUsingJava(File inFile, File untarDir,
+ static void unTarUsingJava(File inFile, File untarDir,
boolean gzipped) throws IOException {
InputStream inputStream = null;
TarArchiveInputStream tis = null;
@@ -956,6 +958,14 @@ public class FileUtil {
return;
}
+ if (entry.isSymbolicLink()) {
+ // Create symbolic link relative to tar parent dir
+ Files.createSymbolicLink(FileSystems.getDefault()
+ .getPath(outputDir.getPath(), entry.getName()),
+ FileSystems.getDefault().getPath(entry.getLinkName()));
+ return;
+ }
+
File outputFile = new File(outputDir, entry.getName());
if (!outputFile.getParentFile().exists()) {
if (!outputFile.getParentFile().mkdirs()) {
http://git-wip-us.apache.org/repos/asf/hadoop/blob/460d77bd/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFileUtil.java
----------------------------------------------------------------------
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 0ad03fc..39f2f6b 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
@@ -26,6 +26,7 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@@ -37,6 +38,8 @@ import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.UnknownHostException;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -47,6 +50,9 @@ import java.util.jar.Manifest;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
+import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
+import org.apache.commons.io.FileUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.test.GenericTestUtils;
import org.apache.hadoop.util.StringUtils;
@@ -1173,4 +1179,84 @@ public class TestFileUtil {
assertEquals(FileUtil.compareFs(fs3,fs4),true);
assertEquals(FileUtil.compareFs(fs1,fs6),false);
}
+
+ @Test(timeout = 8000)
+ public void testCreateSymbolicLinkUsingJava() throws IOException {
+ setupDirs();
+ final File simpleTar = new File(del, FILE);
+ OutputStream os = new FileOutputStream(simpleTar);
+ TarArchiveOutputStream tos = new TarArchiveOutputStream(os);
+ File untarFile = null;
+ try {
+ // Files to tar
+ final String tmpDir = "tmp/test";
+ File tmpDir1 = new File(tmpDir, "dir1/");
+ File tmpDir2 = new File(tmpDir, "dir2/");
+ // Delete the directories if they already exist
+ tmpDir1.mkdirs();
+ tmpDir2.mkdirs();
+
+ java.nio.file.Path symLink = FileSystems
+ .getDefault().getPath(tmpDir1.getPath() + "/sl");
+
+ // Create Symbolic Link
+ Files.createSymbolicLink(symLink,
+ FileSystems.getDefault().getPath(tmpDir2.getPath())).toString();
+ assertTrue(Files.isSymbolicLink(symLink.toAbsolutePath()));
+ // put entries in tar file
+ putEntriesInTar(tos, tmpDir1.getParentFile());
+ tos.close();
+
+ untarFile = new File(tmpDir, "2");
+ // Untar using java
+ FileUtil.unTarUsingJava(simpleTar, untarFile, false);
+
+ // Check symbolic link and other directories are there in untar file
+ assertTrue(Files.exists(untarFile.toPath()));
+ assertTrue(Files.exists(FileSystems.getDefault().getPath(untarFile
+ .getPath(), tmpDir)));
+ assertTrue(Files.isSymbolicLink(FileSystems.getDefault().getPath(untarFile
+ .getPath().toString(), symLink.toString())));
+
+ } finally {
+ FileUtils.deleteDirectory(new File("tmp"));
+ tos.close();
+ }
+
+ }
+
+ private void putEntriesInTar(TarArchiveOutputStream tos, File f)
+ throws IOException {
+ if (Files.isSymbolicLink(f.toPath())) {
+ TarArchiveEntry tarEntry = new TarArchiveEntry(f.getPath(),
+ TarArchiveEntry.LF_SYMLINK);
+ tarEntry.setLinkName(Files.readSymbolicLink(f.toPath()).toString());
+ tos.putArchiveEntry(tarEntry);
+ tos.closeArchiveEntry();
+ return;
+ }
+
+ if (f.isDirectory()) {
+ tos.putArchiveEntry(new TarArchiveEntry(f));
+ tos.closeArchiveEntry();
+ for (File child : f.listFiles()) {
+ putEntriesInTar(tos, child);
+ }
+ }
+
+ if (f.isFile()) {
+ tos.putArchiveEntry(new TarArchiveEntry(f));
+ BufferedInputStream origin = new BufferedInputStream(
+ new FileInputStream(f));
+ int count;
+ byte[] data = new byte[2048];
+ while ((count = origin.read(data)) != -1) {
+ tos.write(data, 0, count);
+ }
+ tos.flush();
+ tos.closeArchiveEntry();
+ origin.close();
+ }
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org