package bo.gotthardt.deploy; import com.google.common.io.Files; import org.codehaus.plexus.archiver.gzip.GZipArchiver; import org.codehaus.plexus.archiver.tar.TarArchiver; import org.codehaus.plexus.archiver.tar.TarGZipUnArchiver; import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.logging.console.ConsoleLogger; import java.io.File; import java.io.IOException; import java.util.Set; public class TarGzArchive { /** * Unpack a .tar.gz archive and return the folder it was unpacked in. * * @param tarGz The archive * @return The unpacked folder */ public static File unpack(File tarGz) { File unpackDir = Files.createTempDir(); unpackDir.deleteOnExit(); TarGZipUnArchiver unArchiver = new TarGZipUnArchiver(tarGz); // Needed to avoid a null pointer... unArchiver.enableLogging(new ConsoleLogger(Logger.LEVEL_DISABLED, "console")); unArchiver.setDestDirectory(unpackDir); unArchiver.extract(); return unpackDir; } /** * Create a .tar.gz archive file that contains the specified files. * The archive will be located in a temporary folder. * * @param files The files * @param folder The folder name to place the files in, inside the archive. * @return The archive * @throws IOException */ public static File create(Set<File> files, String folder) throws IOException { return gz(tar(files, folder)); } private static File tar(Set<File> files, String folder) throws IOException { TarArchiver tarArchive = new TarArchiver(); tarArchive.enableLogging(new ConsoleLogger(Logger.LEVEL_DISABLED, "console")); for (File file : files) { // The starting ./ in the folder name is required for Heroku to be able to unpack the files correctly. if (file.isFile()) { tarArchive.addFile(file, "./" + folder + "/" + file.getName()); } else if (file.isDirectory()) { tarArchive.addDirectory(file, "./" + folder + "/" + file.getName() + "/"); } } File tarFile = File.createTempFile("TarGzArchive", ".tar"); tarArchive.setDestFile(tarFile); tarArchive.createArchive(); return tarFile; } private static File gz(File input) throws IOException { GZipArchiver gzipArchive = new GZipArchiver(); gzipArchive.addFile(input, input.getName()); File gzFile = File.createTempFile("TarGzArchive", ".tgz"); gzipArchive.setDestFile(gzFile); gzipArchive.createArchive(); return gzFile; } }