From 07df63980080503eda4f05abf235209eb01de051 Mon Sep 17 00:00:00 2001 From: Dmytro Rodionov Date: Mon, 22 Sep 2025 12:55:49 +0200 Subject: [PATCH 1/2] Make VcsClient configurable --- .../AffectedModuleConfiguration.kt | 36 ++++++ .../AffectedModuleDetector.kt | 26 ++-- .../commitshaproviders/CommitShaProvider.kt | 10 +- .../commitshaproviders/ForkCommit.kt | 6 +- .../commitshaproviders/PreviousCommit.kt | 6 +- .../SpecifiedBranchCommit.kt | 6 +- .../SpecifiedBranchCommitMergeBase.kt | 6 +- .../SpecifiedRawCommitSha.kt | 6 +- .../vcs/BaseVcsClient.kt | 14 +++ .../{ => vcs}/GitClient.kt | 95 ++++----------- .../affectedmoduledetector/vcs/VcsClient.kt | 33 ++++++ .../AffectedModuleConfigurationTest.kt | 54 ++++++++- .../AffectedModuleDetectorImplTest.kt | 111 +++++++++--------- .../mocks/MockCommandRunner.kt | 4 +- .../mocks/MockCommitShaProvider.kt | 6 +- 15 files changed, 249 insertions(+), 170 deletions(-) create mode 100644 affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/BaseVcsClient.kt rename affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/{ => vcs}/GitClient.kt (65%) create mode 100644 affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/VcsClient.kt diff --git a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleConfiguration.kt b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleConfiguration.kt index 71501663..2119a7ad 100644 --- a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleConfiguration.kt +++ b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleConfiguration.kt @@ -1,6 +1,15 @@ package com.dropbox.affectedmoduledetector +import com.dropbox.affectedmoduledetector.commitshaproviders.CommitShaProvider +import com.dropbox.affectedmoduledetector.commitshaproviders.CommitShaProviderConfiguration +import com.dropbox.affectedmoduledetector.commitshaproviders.ForkCommit +import com.dropbox.affectedmoduledetector.commitshaproviders.PreviousCommit +import com.dropbox.affectedmoduledetector.commitshaproviders.SpecifiedBranchCommit +import com.dropbox.affectedmoduledetector.commitshaproviders.SpecifiedBranchCommitMergeBase +import com.dropbox.affectedmoduledetector.commitshaproviders.SpecifiedRawCommitSha import com.dropbox.affectedmoduledetector.util.toOsSpecificPath +import com.dropbox.affectedmoduledetector.vcs.BaseVcsClient +import com.dropbox.affectedmoduledetector.vcs.GitClientImpl import java.io.File import java.io.Serializable @@ -80,6 +89,22 @@ class AffectedModuleConfiguration : Serializable { return field } + var commitShaProvider: CommitShaProvider = PreviousCommit() + + var vcsClientProvider: ( + workingDir: File, + logger: FileLogger?, + commitShaProviderConfiguration: CommitShaProviderConfiguration, + ignoredFiles: Set?, + ) -> BaseVcsClient = { workingDir: File, logger: FileLogger?, commitShaProviderConfiguration: CommitShaProviderConfiguration, ignoredFiles: Set? -> + GitClientImpl( + workingDir = workingDir, + logger = logger, + commitShaProviderConfiguration = commitShaProviderConfiguration, + ignoredFiles = ignoredFiles, + ) + } + var specifiedBranch: String? = null var specifiedRawCommitSha: String? = null @@ -100,11 +125,22 @@ class AffectedModuleConfiguration : Serializable { requireNotNull(specifiedBranch) { "Specify a branch using the configuration specifiedBranch" } + when (value) { + "SpecifiedBranchCommit" -> commitShaProvider = SpecifiedBranchCommit(specifiedBranch!!) + "SpecifiedBranchCommitMergeBase" -> commitShaProvider = SpecifiedBranchCommitMergeBase(specifiedBranch!!) + } } if (value == "SpecifiedRawCommitSha") { requireNotNull(specifiedRawCommitSha) { "Provide a Commit SHA for the specifiedRawCommitSha property when using SpecifiedRawCommitSha comparison strategy." } + commitShaProvider = SpecifiedRawCommitSha(specifiedRawCommitSha!!) + } + if (value == "PreviousCommit") { + commitShaProvider = PreviousCommit() + } + if (value == "ForkCommit") { + commitShaProvider = ForkCommit() } field = value } diff --git a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetector.kt b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetector.kt index aac4a488..da6d8a2a 100644 --- a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetector.kt +++ b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetector.kt @@ -200,17 +200,15 @@ abstract class AffectedModuleDetector(protected val logger: Logger?) { rootProject ) - val gitClient = GitClientImpl( + val vcsClient = config.vcsClientProvider( rootProject.projectDir, logger, - commitShaProviderConfiguration = CommitShaProviderConfiguration( - type = config.compareFrom, - specifiedBranch = config.specifiedBranch, - specifiedSha = config.specifiedRawCommitSha, + CommitShaProviderConfiguration( + provider = config.commitShaProvider, top = config.top, includeUncommitted = config.includeUncommitted ), - ignoredFiles = config.ignoredFiles + config.ignoredFiles, ) logger.lifecycle("projects evaluated") @@ -226,8 +224,8 @@ abstract class AffectedModuleDetector(protected val logger: Logger?) { parameters.projectSubset = subset parameters.modules = modules parameters.config = config - parameters.gitChangedFilesProvider = gitClient.findChangedFiles(rootProject) - parameters.gitRoot.set(gitClient.getGitRoot()) + parameters.changedFilesProvider = vcsClient.findChangedFiles(rootProject) + parameters.vcsRoot.set(vcsClient.getVcsRoot()) } logger.info("Using real detector with $subset") instance.wrapped = provider @@ -409,9 +407,9 @@ abstract class AffectedModuleDetectorLoader : var ignoreUnknownProjects: Boolean var projectSubset: ProjectSubset var modules: Set? - var gitChangedFilesProvider: Provider> + var changedFilesProvider: Provider> var config: AffectedModuleConfiguration - val gitRoot: DirectoryProperty + val vcsRoot: DirectoryProperty } val detector: AffectedModuleDetector by lazy { @@ -427,8 +425,8 @@ abstract class AffectedModuleDetectorLoader : projectSubset = parameters.projectSubset, modules = parameters.modules, config = parameters.config, - changedFilesProvider = parameters.gitChangedFilesProvider, - gitRoot = parameters.gitRoot.get().asFile + changedFilesProvider = parameters.changedFilesProvider, + vcsRoot = parameters.vcsRoot.get().asFile ) } } @@ -482,7 +480,7 @@ class AffectedModuleDetectorImpl( private val modules: Set? = null, private val config: AffectedModuleConfiguration, private val changedFilesProvider: Provider>, - private val gitRoot: File, + private val vcsRoot: File, ) : AffectedModuleDetector(logger) { init { @@ -651,7 +649,7 @@ class AffectedModuleDetectorImpl( } else { File(projectGraph.getRootProjectPath()!!.path) } - val pathSections = relativeFilePath.toPathSections(rootProjectDir, gitRoot) + val pathSections = relativeFilePath.toPathSections(rootProjectDir, vcsRoot) val projectRelativePath = pathSections.joinToString(File.separatorChar.toString()) return config.pathsAffectingAllModules.any { projectRelativePath.startsWith(it) } diff --git a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/CommitShaProvider.kt b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/CommitShaProvider.kt index 99e0ff9d..e7ff50e1 100644 --- a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/CommitShaProvider.kt +++ b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/CommitShaProvider.kt @@ -1,17 +1,15 @@ package com.dropbox.affectedmoduledetector.commitshaproviders -import com.dropbox.affectedmoduledetector.GitClient -import com.dropbox.affectedmoduledetector.Sha +import com.dropbox.affectedmoduledetector.vcs.VcsClient +import com.dropbox.affectedmoduledetector.vcs.Sha import java.io.Serializable interface CommitShaProvider : Serializable { - fun get(commandRunner: GitClient.CommandRunner): Sha + fun get(commandRunner: VcsClient.CommandRunner): Sha } data class CommitShaProviderConfiguration( - val type: String, - val specifiedBranch: String? = null, - val specifiedSha: String? = null, + val provider: CommitShaProvider, val top: Sha, val includeUncommitted: Boolean ) : Serializable diff --git a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/ForkCommit.kt b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/ForkCommit.kt index 8e632c00..3479dd8e 100644 --- a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/ForkCommit.kt +++ b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/ForkCommit.kt @@ -1,10 +1,10 @@ package com.dropbox.affectedmoduledetector.commitshaproviders -import com.dropbox.affectedmoduledetector.GitClient -import com.dropbox.affectedmoduledetector.Sha +import com.dropbox.affectedmoduledetector.vcs.VcsClient +import com.dropbox.affectedmoduledetector.vcs.Sha class ForkCommit : CommitShaProvider { - override fun get(commandRunner: GitClient.CommandRunner): Sha { + override fun get(commandRunner: VcsClient.CommandRunner): Sha { val currentBranch = commandRunner.executeAndParseFirst(CURRENT_BRANCH_CMD) val parentBranch = commandRunner.executeAndParse(SHOW_ALL_BRANCHES_CMD) diff --git a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/PreviousCommit.kt b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/PreviousCommit.kt index 79ffb7ce..267975e6 100644 --- a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/PreviousCommit.kt +++ b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/PreviousCommit.kt @@ -1,10 +1,10 @@ package com.dropbox.affectedmoduledetector.commitshaproviders -import com.dropbox.affectedmoduledetector.GitClient -import com.dropbox.affectedmoduledetector.Sha +import com.dropbox.affectedmoduledetector.vcs.VcsClient +import com.dropbox.affectedmoduledetector.vcs.Sha class PreviousCommit : CommitShaProvider { - override fun get(commandRunner: GitClient.CommandRunner): Sha { + override fun get(commandRunner: VcsClient.CommandRunner): Sha { return commandRunner.executeAndParseFirst(PREV_COMMIT_CMD) } companion object { diff --git a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/SpecifiedBranchCommit.kt b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/SpecifiedBranchCommit.kt index 11486c18..e3b20c83 100644 --- a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/SpecifiedBranchCommit.kt +++ b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/SpecifiedBranchCommit.kt @@ -1,11 +1,11 @@ package com.dropbox.affectedmoduledetector.commitshaproviders -import com.dropbox.affectedmoduledetector.GitClient -import com.dropbox.affectedmoduledetector.Sha +import com.dropbox.affectedmoduledetector.vcs.VcsClient +import com.dropbox.affectedmoduledetector.vcs.Sha class SpecifiedBranchCommit(private val branch: String) : CommitShaProvider { - override fun get(commandRunner: GitClient.CommandRunner): Sha { + override fun get(commandRunner: VcsClient.CommandRunner): Sha { return commandRunner.executeAndParseFirst("git rev-parse $branch") } } diff --git a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/SpecifiedBranchCommitMergeBase.kt b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/SpecifiedBranchCommitMergeBase.kt index 2c029a7e..283619f8 100644 --- a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/SpecifiedBranchCommitMergeBase.kt +++ b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/SpecifiedBranchCommitMergeBase.kt @@ -1,11 +1,11 @@ package com.dropbox.affectedmoduledetector.commitshaproviders -import com.dropbox.affectedmoduledetector.GitClient -import com.dropbox.affectedmoduledetector.Sha +import com.dropbox.affectedmoduledetector.vcs.VcsClient +import com.dropbox.affectedmoduledetector.vcs.Sha class SpecifiedBranchCommitMergeBase(private val specifiedBranch: String) : CommitShaProvider { - override fun get(commandRunner: GitClient.CommandRunner): Sha { + override fun get(commandRunner: VcsClient.CommandRunner): Sha { val currentBranch = commandRunner.executeAndParseFirst(CURRENT_BRANCH_CMD) return commandRunner.executeAndParseFirst("git merge-base $currentBranch $specifiedBranch") } diff --git a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/SpecifiedRawCommitSha.kt b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/SpecifiedRawCommitSha.kt index 5f6ef99b..a5da98fd 100644 --- a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/SpecifiedRawCommitSha.kt +++ b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/commitshaproviders/SpecifiedRawCommitSha.kt @@ -1,10 +1,10 @@ package com.dropbox.affectedmoduledetector.commitshaproviders -import com.dropbox.affectedmoduledetector.GitClient -import com.dropbox.affectedmoduledetector.Sha +import com.dropbox.affectedmoduledetector.vcs.VcsClient +import com.dropbox.affectedmoduledetector.vcs.Sha class SpecifiedRawCommitSha(private val commitSha: String) : CommitShaProvider { - override fun get(commandRunner: GitClient.CommandRunner): Sha { + override fun get(commandRunner: VcsClient.CommandRunner): Sha { return commitSha } } diff --git a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/BaseVcsClient.kt b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/BaseVcsClient.kt new file mode 100644 index 00000000..32e4fb81 --- /dev/null +++ b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/BaseVcsClient.kt @@ -0,0 +1,14 @@ +package com.dropbox.affectedmoduledetector.vcs + +import com.dropbox.affectedmoduledetector.FileLogger +import com.dropbox.affectedmoduledetector.commitshaproviders.CommitShaProviderConfiguration +import java.io.File + +typealias Sha = String + +abstract class BaseVcsClient( + protected val workingDir: File, + protected val logger: FileLogger?, + protected val commitShaProviderConfiguration: CommitShaProviderConfiguration, + protected val ignoredFiles: Set?, +): VcsClient diff --git a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/GitClient.kt b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/GitClient.kt similarity index 65% rename from affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/GitClient.kt rename to affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/GitClient.kt index 1d8a7ef1..0ae8f51e 100644 --- a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/GitClient.kt +++ b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/GitClient.kt @@ -18,15 +18,11 @@ * Copyright (c) 2020, Dropbox, Inc. All rights reserved. */ -package com.dropbox.affectedmoduledetector +package com.dropbox.affectedmoduledetector.vcs -import com.dropbox.affectedmoduledetector.GitClientImpl.Companion.CHANGED_FILES_CMD_PREFIX +import com.dropbox.affectedmoduledetector.FileLogger +import com.dropbox.affectedmoduledetector.vcs.GitClientImpl.Companion.CHANGED_FILES_CMD_PREFIX import com.dropbox.affectedmoduledetector.commitshaproviders.CommitShaProviderConfiguration -import com.dropbox.affectedmoduledetector.commitshaproviders.ForkCommit -import com.dropbox.affectedmoduledetector.commitshaproviders.PreviousCommit -import com.dropbox.affectedmoduledetector.commitshaproviders.SpecifiedBranchCommit -import com.dropbox.affectedmoduledetector.commitshaproviders.SpecifiedBranchCommitMergeBase -import com.dropbox.affectedmoduledetector.commitshaproviders.SpecifiedRawCommitSha import com.dropbox.affectedmoduledetector.util.toOsSpecificLineEnding import com.dropbox.affectedmoduledetector.util.toOsSpecificPath import org.gradle.api.Project @@ -39,35 +35,6 @@ import org.gradle.api.provider.ValueSourceParameters import java.io.File import java.util.concurrent.TimeUnit -interface GitClient { - fun findChangedFiles( - project: Project, - ): Provider> - - fun getGitRoot(): File - - /** - * Abstraction for running execution commands for testability - */ - interface CommandRunner { - /** - * Executes the given shell command and returns the stdout as a string. - */ - fun execute(command: String): String - - /** - * Executes the given shell command and returns the stdout by lines. - */ - fun executeAndParse(command: String): List - - /** - * Executes the given shell command and returns the first stdout line. - */ - fun executeAndParseFirst(command: String): String - } -} - -typealias Sha = String /** * A simple git client that uses system process commands to communicate with the git setup in the @@ -78,11 +45,16 @@ internal class GitClientImpl( /** * The root location for git */ - private val workingDir: File, - private val logger: FileLogger?, - private val commitShaProviderConfiguration: CommitShaProviderConfiguration, - private val ignoredFiles: Set? -) : GitClient { + workingDir: File, + logger: FileLogger?, + commitShaProviderConfiguration: CommitShaProviderConfiguration, + ignoredFiles: Set?, +) : BaseVcsClient( + workingDir = workingDir, + logger = logger, + commitShaProviderConfiguration = commitShaProviderConfiguration, + ignoredFiles = ignoredFiles, +) { /** * Finds changed file paths @@ -91,7 +63,7 @@ internal class GitClientImpl( project: Project, ): Provider> { return project.providers.of(GitChangedFilesSource::class.java) { - it.parameters.commitShaProvider = commitShaProviderConfiguration + it.parameters.commitShaProviderConfiguration = commitShaProviderConfiguration it.parameters.workingDir.set(workingDir) it.parameters.logger = logger it.parameters.ignoredFiles.set(ignoredFiles) @@ -109,7 +81,7 @@ internal class GitClientImpl( return null } - override fun getGitRoot(): File { + override fun getVcsRoot(): File { return findGitDirInParentFilepath(workingDir) ?: workingDir } @@ -122,7 +94,7 @@ internal class GitClientImpl( private class RealCommandRunner( private val workingDir: File, private val logger: Logger? -) : GitClient.CommandRunner { +) : VcsClient.CommandRunner { override fun execute(command: String): String { val parts = command.split("\\s".toRegex()) logger?.info("running command $command in $workingDir") @@ -176,7 +148,7 @@ private class RealCommandRunner( internal abstract class GitChangedFilesSource : ValueSource, GitChangedFilesSource.Parameters> { interface Parameters : ValueSourceParameters { - var commitShaProvider: CommitShaProviderConfiguration + var commitShaProviderConfiguration: CommitShaProviderConfiguration val workingDir: DirectoryProperty var logger: FileLogger? val ignoredFiles: SetProperty @@ -186,7 +158,7 @@ internal abstract class GitChangedFilesSource : findGitDirInParentFilepath(parameters.workingDir.get().asFile) } - private val commandRunner: GitClient.CommandRunner by lazy { + private val commandRunner: VcsClient.CommandRunner by lazy { RealCommandRunner( workingDir = gitRoot ?: parameters.workingDir.get().asFile, logger = null @@ -194,12 +166,12 @@ internal abstract class GitChangedFilesSource : } override fun obtain(): List { - val top = parameters.commitShaProvider.top + val top = parameters.commitShaProviderConfiguration.top val sha = getSha() // use this if we don't want local changes val changedFiles = commandRunner.executeAndParse( - if (parameters.commitShaProvider.includeUncommitted) { + if (parameters.commitShaProviderConfiguration.includeUncommitted) { "$CHANGED_FILES_CMD_PREFIX $sha" } else { "$CHANGED_FILES_CMD_PREFIX $top..$sha" @@ -227,31 +199,6 @@ internal abstract class GitChangedFilesSource : } private fun getSha(): Sha { - val specifiedBranch = parameters.commitShaProvider.specifiedBranch - val specifiedSha = parameters.commitShaProvider.specifiedSha - val type = when (parameters.commitShaProvider.type) { - "PreviousCommit" -> PreviousCommit() - "ForkCommit" -> ForkCommit() - "SpecifiedBranchCommit" -> { - requireNotNull(specifiedBranch) { - "Specified branch must be defined" - } - SpecifiedBranchCommit(specifiedBranch) - } - "SpecifiedBranchCommitMergeBase" -> { - requireNotNull(specifiedBranch) { - "Specified branch must be defined" - } - SpecifiedBranchCommitMergeBase(specifiedBranch) - } - "SpecifiedRawCommitSha" -> { - requireNotNull(specifiedSha) { - "Provide a Commit SHA for the specifiedRawCommitSha property when using SpecifiedRawCommitSha comparison strategy." - } - SpecifiedRawCommitSha(specifiedSha) - } - else -> throw IllegalArgumentException("Unsupported compareFrom type") - } - return type.get(commandRunner) + return parameters.commitShaProviderConfiguration.provider.get(commandRunner) } } diff --git a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/VcsClient.kt b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/VcsClient.kt new file mode 100644 index 00000000..98fb183c --- /dev/null +++ b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/VcsClient.kt @@ -0,0 +1,33 @@ +package com.dropbox.affectedmoduledetector.vcs + +import org.gradle.api.Project +import org.gradle.api.provider.Provider +import java.io.File + +interface VcsClient { + fun findChangedFiles( + project: Project, + ): Provider> + + fun getVcsRoot(): File + + /** + * Abstraction for running execution commands for testability + */ + interface CommandRunner { + /** + * Executes the given shell command and returns the stdout as a string. + */ + fun execute(command: String): String + + /** + * Executes the given shell command and returns the stdout by lines. + */ + fun executeAndParse(command: String): List + + /** + * Executes the given shell command and returns the first stdout line. + */ + fun executeAndParseFirst(command: String): String + } +} diff --git a/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleConfigurationTest.kt b/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleConfigurationTest.kt index ad006a7a..c56a85bd 100644 --- a/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleConfigurationTest.kt +++ b/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleConfigurationTest.kt @@ -1,5 +1,9 @@ package com.dropbox.affectedmoduledetector +import com.dropbox.affectedmoduledetector.commitshaproviders.ForkCommit +import com.dropbox.affectedmoduledetector.commitshaproviders.PreviousCommit +import com.dropbox.affectedmoduledetector.commitshaproviders.SpecifiedBranchCommitMergeBase +import com.dropbox.affectedmoduledetector.vcs.GitClientImpl import com.google.common.truth.Truth.assertThat import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue @@ -10,6 +14,7 @@ import org.junit.Test import org.junit.rules.TemporaryFolder import org.junit.runner.RunWith import org.junit.runners.JUnit4 +import org.mockito.kotlin.mock import java.io.File @RunWith(JUnit4::class) @@ -165,6 +170,13 @@ class AffectedModuleConfigurationTest { assertThat(AffectedModuleConfiguration.name).isEqualTo("affectedModuleDetector") } + @Test + fun `GIVEN AffectedModuleConfiguration WHEN commitShaProvider THEN is PreviousCommit`() { + val actual = config.commitShaProvider + + assertThat(actual).isInstanceOf(PreviousCommit::class.java) + } + @Test fun `GIVEN AffectedModuleConfiguration WHEN compareFrom THEN is PreviousCommit`() { val actual = config.compareFrom @@ -173,7 +185,21 @@ class AffectedModuleConfigurationTest { } @Test - fun `WHEN compareFrom is set to SpecifiedBranchCommitMergeBase AND specifiedBranch is set THEN return SpecifiedBranchCommitMergeBase`() { + fun `GIVEN AffectedModuleConfiguration WHEN compareFrom is set THEN commitShaProvider is set to class from compareFrom`() { + val providerClass = ForkCommit::class.java + val specifiedCompareFrom = providerClass.simpleName + + println(specifiedCompareFrom) + + config.compareFrom = specifiedCompareFrom + + val actual = config.commitShaProvider + + assertThat(actual).isInstanceOf(providerClass) + } + + @Test + fun `WHEN compareFrom is set to SpecifiedBranchCommitMergeBase AND specifiedBranch is set THEN compareFrom is equal to SpecifiedBranchCommitMergeBase`() { val specifiedBranchCommitMergeBase = "SpecifiedBranchCommitMergeBase" val specifiedBranch = "origin/dev" @@ -185,6 +211,20 @@ class AffectedModuleConfigurationTest { assertThat(actual).isEqualTo(specifiedBranchCommitMergeBase) } + @Test + fun `WHEN compareFrom is set to SpecifiedBranchCommitMergeBase AND specifiedBranch is set THEN commitShaProvider is equal to SpecifiedBranchCommitMergeBase`() { + val specifiedBranchCommitMergeBaseClass = SpecifiedBranchCommitMergeBase::class.java + val specifiedBranchCommitMergeBase = specifiedBranchCommitMergeBaseClass.simpleName + val specifiedBranch = "origin/dev" + + config.specifiedBranch = specifiedBranch + config.compareFrom = specifiedBranchCommitMergeBase + + val actual = config.commitShaProvider + + assertThat(actual).isInstanceOf(specifiedBranchCommitMergeBaseClass) + } + @Test fun `WHEN compareFrom is set to SpecifiedBranchCommitMergeBase AND specifiedBranch isn't set THEN throw exception`() { val specifiedBranchCommitMergeBase = "SpecifiedBranchCommitMergeBase" @@ -376,4 +416,16 @@ class AffectedModuleConfigurationTest { // THEN assertFalse(actual) } + + @Test + fun `GIVEN AffectedModuleConfiguration WHEN vcsClientProvider THEN is GitClientImpl`() { + val actual = config.vcsClientProvider( + tmpFolder.root, + mock(), + mock(), + mock(), + ) + + assertThat(actual).isInstanceOf(GitClientImpl::class.java) + } } diff --git a/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetectorImplTest.kt b/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetectorImplTest.kt index 2c8a4bed..9e1c0ee1 100644 --- a/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetectorImplTest.kt +++ b/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetectorImplTest.kt @@ -1,5 +1,6 @@ package com.dropbox.affectedmoduledetector +import com.dropbox.affectedmoduledetector.vcs.VcsClient import com.google.common.truth.Truth import org.gradle.api.Project import org.gradle.api.plugins.ExtraPropertiesExtension @@ -248,7 +249,7 @@ class AffectedModuleDetectorImplTest { logger = logger.toLogger(), ignoreUnknownProjects = false, projectSubset = ProjectSubset.ALL_AFFECTED_PROJECTS, - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration, changedFilesProvider = MockGitClient( changedFiles = emptyList(), @@ -286,7 +287,7 @@ class AffectedModuleDetectorImplTest { changedFiles = emptyList(), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -320,7 +321,7 @@ class AffectedModuleDetectorImplTest { changedFiles = emptyList(), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -343,7 +344,7 @@ class AffectedModuleDetectorImplTest { changedFiles = listOf(convertToFilePath("d1", "foo.java")), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -374,7 +375,7 @@ class AffectedModuleDetectorImplTest { changedFiles = emptyList(), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -397,7 +398,7 @@ class AffectedModuleDetectorImplTest { changedFiles = listOf(convertToFilePath("d1", "foo.java")), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -424,7 +425,7 @@ class AffectedModuleDetectorImplTest { changedFiles = listOf(convertToFilePath("d1", "foo.java")), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -450,7 +451,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -483,7 +484,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -514,7 +515,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -540,7 +541,7 @@ class AffectedModuleDetectorImplTest { changedFiles = listOf("foo.java"), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -563,7 +564,7 @@ class AffectedModuleDetectorImplTest { changedFiles = listOf("foo.java"), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -586,7 +587,7 @@ class AffectedModuleDetectorImplTest { changedFiles = listOf("foo.java", convertToFilePath("d7", "bar.java")), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -613,7 +614,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -640,7 +641,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -667,7 +668,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -694,7 +695,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -721,7 +722,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -748,7 +749,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -775,7 +776,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -802,7 +803,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -829,7 +830,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -856,7 +857,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -882,7 +883,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -908,7 +909,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -934,7 +935,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -960,7 +961,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -986,7 +987,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -1012,7 +1013,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -1037,7 +1038,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -1062,7 +1063,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -1087,7 +1088,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -1123,7 +1124,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) @@ -1152,7 +1153,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -1177,7 +1178,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -1205,7 +1206,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root2), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -1238,7 +1239,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -1264,7 +1265,7 @@ class AffectedModuleDetectorImplTest { changedFiles = listOf(convertToFilePath("d1", "foo.java")), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) // Verify expectations on affected projects @@ -1309,7 +1310,7 @@ class AffectedModuleDetectorImplTest { changedFiles = listOf(convertToFilePath("d1", "foo.java")), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) // Verify expectations on affected projects @@ -1358,7 +1359,7 @@ class AffectedModuleDetectorImplTest { changedFiles = listOf(convertToFilePath("d1", "foo.java")), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) // Verify expectations on affected projects @@ -1408,7 +1409,7 @@ class AffectedModuleDetectorImplTest { changedFiles = emptyList(), tmpFolder = root3.projectDir ).findChangedFiles(root3), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -1436,7 +1437,7 @@ class AffectedModuleDetectorImplTest { changedFiles = emptyList(), tmpFolder = root3.projectDir ).findChangedFiles(root3), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -1464,7 +1465,7 @@ class AffectedModuleDetectorImplTest { changedFiles = emptyList(), tmpFolder = root3.projectDir ).findChangedFiles(root3), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -1487,7 +1488,7 @@ class AffectedModuleDetectorImplTest { changedFiles = listOf(convertToFilePath("d14", "d16", "foo.java")), tmpFolder = root3.projectDir ).findChangedFiles(root3), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -1515,7 +1516,7 @@ class AffectedModuleDetectorImplTest { changedFiles = listOf(convertToFilePath("d15", "d18", "foo.java")), tmpFolder = root3.projectDir ).findChangedFiles(root3), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -1541,7 +1542,7 @@ class AffectedModuleDetectorImplTest { changedFiles = listOf(convertToFilePath("d15", "d19", "foo.java")), tmpFolder = root3.projectDir ).findChangedFiles(root3), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -1601,7 +1602,7 @@ class AffectedModuleDetectorImplTest { changedFiles = listOf(convertToFilePath("d1", "foo.java")), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) Truth.assertThat(detector.shouldInclude(p1.projectPath)).isTrue() @@ -1622,7 +1623,7 @@ class AffectedModuleDetectorImplTest { changedFiles = listOf(convertToFilePath("d1", "foo.java")), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) Truth.assertThat(detector.shouldInclude(p1.projectPath)).isFalse() @@ -1644,7 +1645,7 @@ class AffectedModuleDetectorImplTest { changedFiles = listOf(convertToFilePath("d1", "foo.java")), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) Truth.assertThat(detector.shouldInclude(p1.projectPath)).isTrue() @@ -1669,7 +1670,7 @@ class AffectedModuleDetectorImplTest { changedFiles = listOf(convertToFilePath("d1", "foo.java")), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) Truth.assertThat(detector.shouldInclude(p1.projectPath)).isFalse() @@ -1698,7 +1699,7 @@ class AffectedModuleDetectorImplTest { ), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) Truth.assertThat(detector.shouldInclude(p3.projectPath)).isTrue() @@ -1725,7 +1726,7 @@ class AffectedModuleDetectorImplTest { changedFiles = listOf(changedFile), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -1762,7 +1763,7 @@ class AffectedModuleDetectorImplTest { changedFiles = listOf(changedFile), tmpFolder = tmpFolder.root ).findChangedFiles(root), - gitRoot = tmpFolder.root, + vcsRoot = tmpFolder.root, config = affectedModuleConfiguration ) MatcherAssert.assertThat( @@ -1781,13 +1782,13 @@ class AffectedModuleDetectorImplTest { private class MockGitClient( val changedFiles: List, val tmpFolder: File - ) : GitClient { + ) : VcsClient { override fun findChangedFiles( project: Project, ): Provider> = project.provider { changedFiles } - override fun getGitRoot(): File { + override fun getVcsRoot(): File { return tmpFolder } } diff --git a/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/mocks/MockCommandRunner.kt b/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/mocks/MockCommandRunner.kt index 49d5f41c..72bbb411 100644 --- a/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/mocks/MockCommandRunner.kt +++ b/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/mocks/MockCommandRunner.kt @@ -1,9 +1,9 @@ package com.dropbox.affectedmoduledetector.mocks import com.dropbox.affectedmoduledetector.FileLogger -import com.dropbox.affectedmoduledetector.GitClient +import com.dropbox.affectedmoduledetector.vcs.VcsClient -internal class MockCommandRunner(private val logger: FileLogger) : GitClient.CommandRunner { +internal class MockCommandRunner(private val logger: FileLogger) : VcsClient.CommandRunner { private val replies = mutableMapOf>() fun addReply(command: String, response: String) { diff --git a/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/mocks/MockCommitShaProvider.kt b/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/mocks/MockCommitShaProvider.kt index 8fb15456..466dd127 100644 --- a/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/mocks/MockCommitShaProvider.kt +++ b/affectedmoduledetector/src/test/kotlin/com/dropbox/affectedmoduledetector/mocks/MockCommitShaProvider.kt @@ -1,7 +1,7 @@ package com.dropbox.affectedmoduledetector.mocks -import com.dropbox.affectedmoduledetector.GitClient -import com.dropbox.affectedmoduledetector.Sha +import com.dropbox.affectedmoduledetector.vcs.VcsClient +import com.dropbox.affectedmoduledetector.vcs.Sha import com.dropbox.affectedmoduledetector.commitshaproviders.CommitShaProvider class MockCommitShaProvider : CommitShaProvider { @@ -10,7 +10,7 @@ class MockCommitShaProvider : CommitShaProvider { fun addReply(sha: Sha) { replies.add(sha) } - override fun get(commandRunner: GitClient.CommandRunner): Sha { + override fun get(commandRunner: VcsClient.CommandRunner): Sha { return replies.first() } } From 3753712d8a741c59850ae47e36cb31bd53f98a15 Mon Sep 17 00:00:00 2001 From: Dmytro Rodionov Date: Wed, 24 Sep 2025 09:19:38 +0200 Subject: [PATCH 2/2] Fix configuration-cache support --- .../AffectedModuleConfiguration.kt | 19 +++---------------- .../AffectedModuleDetector.kt | 2 +- .../vcs/BaseVcsClient.kt | 10 ++++++++++ .../affectedmoduledetector/vcs/GitClient.kt | 16 ++++++++++++++++ .../affectedmoduledetector/vcs/VcsClient.kt | 3 ++- 5 files changed, 32 insertions(+), 18 deletions(-) diff --git a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleConfiguration.kt b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleConfiguration.kt index 2119a7ad..22c999ec 100644 --- a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleConfiguration.kt +++ b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleConfiguration.kt @@ -1,15 +1,14 @@ package com.dropbox.affectedmoduledetector import com.dropbox.affectedmoduledetector.commitshaproviders.CommitShaProvider -import com.dropbox.affectedmoduledetector.commitshaproviders.CommitShaProviderConfiguration import com.dropbox.affectedmoduledetector.commitshaproviders.ForkCommit import com.dropbox.affectedmoduledetector.commitshaproviders.PreviousCommit import com.dropbox.affectedmoduledetector.commitshaproviders.SpecifiedBranchCommit import com.dropbox.affectedmoduledetector.commitshaproviders.SpecifiedBranchCommitMergeBase import com.dropbox.affectedmoduledetector.commitshaproviders.SpecifiedRawCommitSha import com.dropbox.affectedmoduledetector.util.toOsSpecificPath -import com.dropbox.affectedmoduledetector.vcs.BaseVcsClient -import com.dropbox.affectedmoduledetector.vcs.GitClientImpl +import com.dropbox.affectedmoduledetector.vcs.BaseVcsClientProvider +import com.dropbox.affectedmoduledetector.vcs.GitClientProviderImpl import java.io.File import java.io.Serializable @@ -91,19 +90,7 @@ class AffectedModuleConfiguration : Serializable { var commitShaProvider: CommitShaProvider = PreviousCommit() - var vcsClientProvider: ( - workingDir: File, - logger: FileLogger?, - commitShaProviderConfiguration: CommitShaProviderConfiguration, - ignoredFiles: Set?, - ) -> BaseVcsClient = { workingDir: File, logger: FileLogger?, commitShaProviderConfiguration: CommitShaProviderConfiguration, ignoredFiles: Set? -> - GitClientImpl( - workingDir = workingDir, - logger = logger, - commitShaProviderConfiguration = commitShaProviderConfiguration, - ignoredFiles = ignoredFiles, - ) - } + var vcsClientProvider: BaseVcsClientProvider = GitClientProviderImpl() var specifiedBranch: String? = null diff --git a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetector.kt b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetector.kt index da6d8a2a..7e411f4e 100644 --- a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetector.kt +++ b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/AffectedModuleDetector.kt @@ -200,7 +200,7 @@ abstract class AffectedModuleDetector(protected val logger: Logger?) { rootProject ) - val vcsClient = config.vcsClientProvider( + val vcsClient = config.vcsClientProvider.get( rootProject.projectDir, logger, CommitShaProviderConfiguration( diff --git a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/BaseVcsClient.kt b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/BaseVcsClient.kt index 32e4fb81..162ee36a 100644 --- a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/BaseVcsClient.kt +++ b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/BaseVcsClient.kt @@ -3,6 +3,7 @@ package com.dropbox.affectedmoduledetector.vcs import com.dropbox.affectedmoduledetector.FileLogger import com.dropbox.affectedmoduledetector.commitshaproviders.CommitShaProviderConfiguration import java.io.File +import java.io.Serializable typealias Sha = String @@ -12,3 +13,12 @@ abstract class BaseVcsClient( protected val commitShaProviderConfiguration: CommitShaProviderConfiguration, protected val ignoredFiles: Set?, ): VcsClient + +abstract class BaseVcsClientProvider: Serializable { + abstract fun get( + workingDir: File, + logger: FileLogger?, + commitShaProviderConfiguration: CommitShaProviderConfiguration, + ignoredFiles: Set? + ): BaseVcsClient +} diff --git a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/GitClient.kt b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/GitClient.kt index 0ae8f51e..a6e867fb 100644 --- a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/GitClient.kt +++ b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/GitClient.kt @@ -91,6 +91,22 @@ internal class GitClientImpl( } } +internal class GitClientProviderImpl: BaseVcsClientProvider() { + override fun get( + workingDir: File, + logger: FileLogger?, + commitShaProviderConfiguration: CommitShaProviderConfiguration, + ignoredFiles: Set? + ): BaseVcsClient { + return GitClientImpl( + workingDir = workingDir, + logger = logger, + commitShaProviderConfiguration = commitShaProviderConfiguration, + ignoredFiles = ignoredFiles, + ) + } +} + private class RealCommandRunner( private val workingDir: File, private val logger: Logger? diff --git a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/VcsClient.kt b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/VcsClient.kt index 98fb183c..ca894e4f 100644 --- a/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/VcsClient.kt +++ b/affectedmoduledetector/src/main/kotlin/com/dropbox/affectedmoduledetector/vcs/VcsClient.kt @@ -3,8 +3,9 @@ package com.dropbox.affectedmoduledetector.vcs import org.gradle.api.Project import org.gradle.api.provider.Provider import java.io.File +import java.io.Serializable -interface VcsClient { +interface VcsClient: Serializable { fun findChangedFiles( project: Project, ): Provider>