package org.testcontainers.utility;
import lombok.NonNull;
import lombok.experimental.UtilityClass;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
/**
* Filesystem operation utility methods.
*/
@UtilityClass
public class PathUtils {
/**
* Recursively delete a directory and all its subdirectories and files.
*
* @param directory path to the directory to delete.
*/
public static void recursiveDeleteDir(final @NonNull Path directory) {
try {
Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
});
} catch (IOException ignored) {
}
}
/**
* Make a directory, plus any required parent directories.
*
* @param directory the directory path to make
*/
public static void mkdirp(Path directory) {
boolean result = directory.toFile().mkdirs();
if (!result) {
throw new IllegalStateException("Failed to create directory at: " + directory);
}
}
/**
* Create a MinGW compatible path based on usual Windows path
*
* @param path a usual windows path
* @return a MinGW compatible path
*/
public static String createMinGWPath(String path) {
String mingwPath = path.replace('\\', '/');
int driveLetterIndex = 1;
if (mingwPath.matches("^[a-zA-Z]:\\/.*")) {
driveLetterIndex = 0;
}
// drive-letter must be lower case
mingwPath = "//" + Character.toLowerCase(mingwPath.charAt(driveLetterIndex)) +
mingwPath.substring(driveLetterIndex + 1);
mingwPath = mingwPath.replace(":", "");
return mingwPath;
}
}