From 415492bfbfa46f9d49eccd6b4f6dbe6b5acc0c92 Mon Sep 17 00:00:00 2001 From: nhannebicque Date: Fri, 24 May 2019 17:40:15 +0200 Subject: [PATCH] Add symlinks as symlinks in tar archive --- .../core/util/CompressArchiveUtil.java | 33 ++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java index 97471d7fe..05b095542 100644 --- a/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java +++ b/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java @@ -18,6 +18,7 @@ import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; +import org.apache.commons.compress.archivers.tar.TarConstants; import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream; import org.apache.commons.io.FileUtils; @@ -95,17 +96,27 @@ public static File archiveTARFiles(File base, Iterable files, String archi new FileOutputStream(tarFile))))) { tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); for (File file : files) { - TarArchiveEntry tarEntry = new TarArchiveEntry(file); - tarEntry.setName(relativize(base, file)); - - if (!file.isDirectory() && file.canExecute()) { - tarEntry.setMode(tarEntry.getMode() | 0755); - } - - tos.putArchiveEntry(tarEntry); - - if (!file.isDirectory()) { - FileUtils.copyFile(file, tos); + // If file is a symbolic link + if (Files.isSymbolicLink(file.toPath())) { + Path target = Files.readSymbolicLink(file.toPath()); + String targetEntryName = target.toFile().getName(); + TarArchiveEntry tarEntry = new TarArchiveEntry(relativize(base.toPath(), file.toPath()), TarConstants.LF_SYMLINK); + tarEntry.setLinkName(targetEntryName); + tos.putArchiveEntry(tarEntry); + + } else { + TarArchiveEntry tarEntry = new TarArchiveEntry(file); + tarEntry.setName(relativize(base, file)); + + if (!file.isDirectory() && file.canExecute()) { + tarEntry.setMode(tarEntry.getMode() | 0755); + } + + tos.putArchiveEntry(tarEntry); + + if (!file.isDirectory()) { + FileUtils.copyFile(file, tos); + } } tos.closeArchiveEntry(); }