package com.github.dockerjava.core.util; import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; import com.google.common.io.Closeables; public class TarDirWalker extends SimpleFileVisitor<Path> { private Path basePath; private TarArchiveOutputStream tarArchiveOutputStream; public TarDirWalker(Path basePath, TarArchiveOutputStream tarArchiveOutputStream) { this.basePath = basePath; this.tarArchiveOutputStream = tarArchiveOutputStream; } @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { if (!dir.equals(basePath)) { tarArchiveOutputStream.putArchiveEntry(new TarArchiveEntry(FilePathUtil.relativize(basePath, dir))); tarArchiveOutputStream.closeArchiveEntry(); } return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { TarArchiveEntry tarEntry = new TarArchiveEntry(FilePathUtil.relativize(basePath, file)); if (file.toFile().canExecute()) { tarEntry.setMode(tarEntry.getMode() | 0755); } CompressArchiveUtil.putTarEntry(tarArchiveOutputStream, tarEntry, file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { Closeables.close(tarArchiveOutputStream, true); throw exc; } }