From 08b617bdc925258238bdb399dbf3efd462cc7611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Warcha=C5=82?= Date: Tue, 8 Aug 2017 23:46:43 +0200 Subject: [PATCH] Include empty directories in build context --- .../core/dockerfile/Dockerfile.java | 40 ++++++++++++++++--- .../DockerfileAddMultipleFilesTest.java | 3 +- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java index 9dcd20199..848ae691e 100644 --- a/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java +++ b/src/main/java/com/github/dockerjava/core/dockerfile/Dockerfile.java @@ -12,7 +12,6 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; -import org.apache.commons.io.filefilter.TrueFileFilter; import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.core.GoLangFileMatch; @@ -186,16 +185,45 @@ public ScannedResult() throws IOException { "Dockerfile is excluded by pattern '%s' in .dockerignore file", matchingIgnorePattern)); } - Collection filesInBuildContext = FileUtils.listFiles(baseDirectory, TrueFileFilter.INSTANCE, - TrueFileFilter.INSTANCE); + addFilesInDirectory(baseDirectory); + } - for (File f : filesInBuildContext) { - if (effectiveMatchingIgnorePattern(f) == null) { - filesToAdd.add(f); + /** + * Adds all files found in directory and subdirectories to + * filesToAdd collection. It also adds any empty directories + * if found. + * + * @param directory directory + * @throws DockerClientException when IO error occurs + */ + private void addFilesInDirectory(File directory) { + File[] files = directory.listFiles(); + + if (files == null) { + throw new DockerClientException("Failed to read build context directory: " + baseDirectory.getAbsolutePath()); + } + + if (files.length != 0) { + for (File f : files) { + if (effectiveMatchingIgnorePattern(f) == null) { + if (f.isDirectory()) { + addFilesInDirectory(f); + } else { + filesToAdd.add(f); + } + } } + // base directory should at least contains Dockerfile, but better check + } else if (!isBaseDirectory(directory)) { + // add empty directory + filesToAdd.add(directory); } } + private boolean isBaseDirectory(File directory) { + return directory.compareTo(baseDirectory) == 0; + } + /** * Returns all matching ignore patterns for the given file name. */ diff --git a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java index b37754a6a..b58a0fcb0 100644 --- a/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java +++ b/src/test/java/com/github/dockerjava/core/dockerfile/DockerfileAddMultipleFilesTest.java @@ -59,11 +59,12 @@ public void ineffectiveIgnorePattern() throws Exception { @Test public void addFiles() throws IOException { File baseDir = fileFromBuildTestResource("ADD/files"); + new File(baseDir, "emptydir").mkdir(); Dockerfile dockerfile = new Dockerfile(new File(baseDir, "Dockerfile"), baseDir); Dockerfile.ScannedResult result = dockerfile.parse(); Collection filesToAdd = transform(result.filesToAdd, TO_FILE_NAMES); - assertThat(filesToAdd, containsInAnyOrder("Dockerfile", "src1", "src2")); + assertThat(filesToAdd, containsInAnyOrder("emptydir", "Dockerfile", "src1", "src2")); } private File fileFromBuildTestResource(String resource) {