diff --git a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetector.kt b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetector.kt index 05237ed..157ce6d 100644 --- a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetector.kt +++ b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetector.kt @@ -147,7 +147,7 @@ abstract class AffectedModuleDetector { rootProject.extensions.findByType(AffectedModuleConfiguration::class.java) ) { "Root project ${rootProject.path} must have the AffectedModuleConfiguration " + - "extension added." + "extension added." } val logger = @@ -415,6 +415,10 @@ class AffectedModuleDetectorImpl constructor( top = top, includeUncommitted = includeUncommitted ).forEach { fileName -> + if (isIgnoredFile(fileName)) { + // Skip ignored files + return@forEach + } if (affectsAllModules(fileName)) { return allProjects } @@ -429,13 +433,13 @@ class AffectedModuleDetectorImpl constructor( unknownFiles.add(filePath) logger?.info( "Couldn't find containing project for file$filePath. " + - "Adding to unknownFiles." + "Adding to unknownFiles." ) } else { changedProjects.add(containingProject) logger?.info( "For file $filePath containing project is $containingProject. " + - "Adding to changedProjects." + "Adding to changedProjects." ) } } @@ -443,6 +447,10 @@ class AffectedModuleDetectorImpl constructor( return changedProjects } + private fun isIgnoredFile(filePath: String): Boolean { + return config.ignoredFiles.any { filePath.matches(it.toRegex()) } + } + /** * Gets all dependent projects from the set of changedProjects. This doesn't include the * original changedProjects. Always build is still here to ensure at least 1 thing is built @@ -475,13 +483,13 @@ class AffectedModuleDetectorImpl constructor( var buildAll = false - // Should only trigger if there are no changedFiles - if (changedProjects.isEmpty() && unknownFiles.isEmpty()) { + // Should only trigger if there are no changedFiles and no changes in non-ignored files + if (changedProjects.isEmpty() && unknownFiles.isEmpty() && changedFiles.isEmpty()) { buildAll = true } logger?.info( "unknownFiles: $unknownFiles, changedProjects: $changedProjects, buildAll: " + - "$buildAll" + "$buildAll" ) // If we're in a buildAll state, we return allProjects unless it's the changed target, diff --git a/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetectorImplTest.kt b/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetectorImplTest.kt index ee27255..0a7f9e7 100644 --- a/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetectorImplTest.kt +++ b/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetectorImplTest.kt @@ -223,6 +223,7 @@ class AffectedModuleDetectorImplTest { affectedModuleConfiguration = AffectedModuleConfiguration().also { it.baseDir = tmpDir.absolutePath it.pathsAffectingAllModules = pathsAffectingAllModules + it.ignoredFiles = setOf(".*\\.md", ".*\\.txt", ".*README") } } @@ -1522,6 +1523,69 @@ class AffectedModuleDetectorImplTest { ) } + @Test + fun changeInIgnoredFile() { + val detector = AffectedModuleDetectorImpl( + rootProject = root, + logger = logger, + ignoreUnknownProjects = false, + projectSubset = ProjectSubset.ALL_AFFECTED_PROJECTS, + injectedGitClient = MockGitClient( + changedFiles = listOf("README.md"), + tmpFolder = tmpFolder.root + ), + config = affectedModuleConfiguration + ) + MatcherAssert.assertThat( + detector.affectedProjects, + CoreMatchers.`is`( + emptySet() + ) + ) + } + + @Test + fun changeInIgnoredFileWithDependentProjects() { + val detector = AffectedModuleDetectorImpl( + rootProject = root, + logger = logger, + ignoreUnknownProjects = false, + projectSubset = ProjectSubset.DEPENDENT_PROJECTS, + injectedGitClient = MockGitClient( + changedFiles = listOf("README.md"), + tmpFolder = tmpFolder.root + ), + config = affectedModuleConfiguration + ) + MatcherAssert.assertThat( + detector.affectedProjects, + CoreMatchers.`is`( + emptySet() + ) + ) + } + + @Test + fun changeInIgnoredFileWithChangedProjects() { + val detector = AffectedModuleDetectorImpl( + rootProject = root, + logger = logger, + ignoreUnknownProjects = false, + projectSubset = ProjectSubset.CHANGED_PROJECTS, + injectedGitClient = MockGitClient( + changedFiles = listOf("README.md"), + tmpFolder = tmpFolder.root + ), + config = affectedModuleConfiguration + ) + MatcherAssert.assertThat( + detector.affectedProjects, + CoreMatchers.`is`( + emptySet() + ) + ) + } + // For both Linux/Windows fun convertToFilePath(vararg list: String): String { return list.toList().joinToString(File.separator)