Skip to content

Commit

Permalink
Use settings file location for build-scoped manifest
Browse files Browse the repository at this point in the history
Fixes #48
  • Loading branch information
bigdaz committed Jul 12, 2023
1 parent 6aaa29b commit eb1ebc9
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@ class PluginDependencyExtractorTest extends BaseExtractorTest {
manifestNames == ["build :", "project :", "project :a"]
// Project ':b' is not reported, since the plugin is loaded in parent project

manifestHasSettingsPlugin("build :")
manifestHasPlugin1("project :")
manifestHasPlugin2("project :a")
manifestHasSettingsPlugin()
manifestHasPlugin1("project :", "build.gradle")
manifestHasPlugin2("project :a", "a/build.gradle")
}

def "extracts all plugin dependencies from multi project buildSrc build"() {
Expand All @@ -55,9 +55,9 @@ class PluginDependencyExtractorTest extends BaseExtractorTest {

then:
manifestNames == ["build :", "project :buildSrc", "project :buildSrc:a"]
manifestHasSettingsPlugin("build :")
manifestHasPlugin1("project :buildSrc")
manifestHasPlugin2("project :buildSrc:a")
manifestHasSettingsPlugin()
manifestHasPlugin1("project :buildSrc", "buildSrc/build.gradle")
manifestHasPlugin2("project :buildSrc:a", "buildSrc/a/build.gradle")
}

def "extracts all plugin dependencies from multi project included build"() {
Expand All @@ -72,9 +72,9 @@ class PluginDependencyExtractorTest extends BaseExtractorTest {

then:
manifestNames == ["build :", "project :included-child", "project :included-child:a"]
manifestHasSettingsPlugin("build :")
manifestHasPlugin1("project :included-child")
manifestHasPlugin2("project :included-child:a")
manifestHasSettingsPlugin()
manifestHasPlugin1("project :included-child", "included-child/build.gradle")
manifestHasPlugin2("project :included-child:a", "included-child/a/build.gradle")
}

def "extracts all plugin dependencies from multi project included plugin build"() {
Expand All @@ -93,9 +93,9 @@ class PluginDependencyExtractorTest extends BaseExtractorTest {

then:
manifestNames == ["build :", "project :included-plugin", "project :included-plugin:a"]
manifestHasSettingsPlugin("build :")
manifestHasPlugin1("project :included-plugin")
manifestHasPlugin2("project :included-plugin:a")
manifestHasSettingsPlugin()
manifestHasPlugin1("project :included-plugin", "included-plugin/build.gradle")
manifestHasPlugin2("project :included-plugin:a", "included-plugin/a/build.gradle")
}

private void createMultiProjectBuildWithPlugins(TestFile rootDir) {
Expand Down Expand Up @@ -134,9 +134,11 @@ class PluginDependencyExtractorTest extends BaseExtractorTest {
"""
}

private void manifestHasSettingsPlugin(String manifestName) {
private void manifestHasSettingsPlugin() {
def settingsManifest = gitHubManifest("build :")
assert settingsManifest.sourceFile == 'settings.gradle'
if (settingsPluginsAreSupported()) {
gitHubManifest(manifestName).assertResolved([
settingsManifest.assertResolved([
"my.settings.plugin:my.settings.plugin.gradle.plugin:1.0": [
relationship: "direct",
dependencies: ["com.example:settingPlugin:1.0"]
Expand All @@ -161,7 +163,7 @@ class PluginDependencyExtractorTest extends BaseExtractorTest {
]
])
} else {
gitHubManifest(manifestName).assertResolved([
settingsManifest.assertResolved([
// The project plugins are resolved at build level without any transitive deps
"my.project.plugin1:my.project.plugin1.gradle.plugin:1.0": [
relationship: "direct",
Expand All @@ -176,8 +178,10 @@ class PluginDependencyExtractorTest extends BaseExtractorTest {
}
}

private void manifestHasPlugin1(String manifestName) {
gitHubManifest(manifestName).assertResolved([
private void manifestHasPlugin1(String manifestName, String sourceFile) {
def manifest = gitHubManifest(manifestName)
assert manifest.sourceFile == sourceFile
manifest.assertResolved([
"my.project.plugin1:my.project.plugin1.gradle.plugin:1.0": [
relationship: "direct",
dependencies: ["com.example:plugin1:1.0"]
Expand All @@ -189,8 +193,10 @@ class PluginDependencyExtractorTest extends BaseExtractorTest {
])
}

private void manifestHasPlugin2(String manifestName) {
gitHubManifest(manifestName).assertResolved([
private void manifestHasPlugin2(String manifestName, String sourceFile) {
def manifest = gitHubManifest(manifestName)
assert manifest.sourceFile == sourceFile
manifest.assertResolved([
"my.project.plugin2:my.project.plugin2.gradle.plugin:1.0": [
relationship: "direct",
dependencies: ["com.example:plugin2:1.0"]
Expand All @@ -205,9 +211,4 @@ class PluginDependencyExtractorTest extends BaseExtractorTest {
]
])
}

private void manifestIsEmpty(String manifestName) {
gitHubManifest(manifestName).assertResolved([:])
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ class SingleProjectDependencyExtractorTest extends BaseExtractorTest {
then:
manifestNames == ["build :"]
def settingsManifest = gitHubManifest("build :")
settingsManifest.sourceFile == "build.gradle"
settingsManifest.sourceFile == "settings.gradle"

settingsManifest.assertResolved([
"org.test:baz:1.0": [
Expand Down Expand Up @@ -368,7 +368,7 @@ class SingleProjectDependencyExtractorTest extends BaseExtractorTest {
then:
manifestNames == ["build :", "project :"]
def buildManifest = gitHubManifest("build :")
buildManifest.sourceFile == "build.gradle"
buildManifest.sourceFile == "settings.gradle"
buildManifest.assertResolved([
"my.project.plugin:my.project.plugin.gradle.plugin:1.0": [
package_url : purlFor("my.project.plugin", "my.project.plugin.gradle.plugin", "1.0"),
Expand Down Expand Up @@ -414,7 +414,7 @@ class SingleProjectDependencyExtractorTest extends BaseExtractorTest {
then:
manifestNames == ["build :"]
def buildManifest = gitHubManifest("build :")
buildManifest.sourceFile == "build.gradle"
buildManifest.sourceFile == "settings.gradle"
buildManifest.assertResolved([
"my.settings.plugin:my.settings.plugin.gradle.plugin:1.0": [
package_url : purlFor("my.settings.plugin", "my.settings.plugin.gradle.plugin", "1.0"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,35 @@ import java.nio.file.Paths
import java.util.concurrent.ConcurrentHashMap

class BuildLayout(val gitWorkspaceDirectory: Path) {
private val projectToRelativeBuildFile = ConcurrentHashMap<String, String>()
private val buildPathToSettingsFile = ConcurrentHashMap<String, String>()
private val projectPathToBuildFile = ConcurrentHashMap<String, String>()

fun addSettings(identityPath: String, settingsFilePath: String) {
buildPathToSettingsFile[identityPath] = gitWorkspaceDirectory.relativize(Paths.get(settingsFilePath)).toString()
}

fun addProject(identityPath: String, buildFileAbsolutePath: String) {
val buildFilePath = Paths.get(buildFileAbsolutePath)
projectToRelativeBuildFile[identityPath] = gitWorkspaceDirectory.relativize(buildFilePath).toString()
projectPathToBuildFile[identityPath] = gitWorkspaceDirectory.relativize(buildFilePath).toString()
}

fun getBuildFile(dependencySource: DependencySource): GitHubManifestFile? {
return projectToRelativeBuildFile[dependencySource.path]?.let {
return getSourcePath(dependencySource)?.let {
// Cleanup the path for Windows systems
val sourceLocation = it.replace('\\', '/')
GitHubManifestFile(sourceLocation = sourceLocation)
}
}

private fun getSourcePath(dependencySource: DependencySource): String? {
if (isProject(dependencySource)) {
return projectPathToBuildFile[dependencySource.path]
}
return buildPathToSettingsFile[dependencySource.path]
}

// TODO:DAZ Model this better
private fun isProject(dependencySource: DependencySource): Boolean {
return dependencySource.id.startsWith("project ")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import org.gradle.github.dependencygraph.internal.model.DependencyCoordinates
import org.gradle.github.dependencygraph.internal.model.DependencySource
import org.gradle.github.dependencygraph.internal.model.ResolvedDependency
import org.gradle.github.dependencygraph.internal.model.ResolvedConfiguration
import org.gradle.initialization.EvaluateSettingsBuildOperationType
import org.gradle.internal.exceptions.DefaultMultiCauseException
import org.gradle.internal.operations.*
import java.io.File
Expand Down Expand Up @@ -68,7 +69,11 @@ abstract class DependencyExtractor :

handleBuildOperationType<
LoadProjectsBOT.Details,
LoadProjectsBOT.Result>(buildOperation, finishEvent) { details, result -> extractProjects(details, result) }
LoadProjectsBOT.Result>(buildOperation, finishEvent) { _, result -> extractProjects(result) }

handleBuildOperationType<
EvaluateSettingsBuildOperationType.Details,
EvaluateSettingsBuildOperationType.Result>(buildOperation, finishEvent) { details, _ -> extractSettings(details) }
}

private inline fun <reified D, reified R> handleBuildOperationType(
Expand All @@ -84,8 +89,16 @@ abstract class DependencyExtractor :
}
}

private fun extractSettings(
details: EvaluateSettingsBuildOperationType.Details
) {
val settingsFile = details.settingsFile
if (settingsFile != null) {
buildLayout.addSettings(details.buildPath, settingsFile)
}
}

private fun extractProjects(
@Suppress("UNUSED_PARAMETER") details: LoadProjectsBOT.Details,
result: LoadProjectsBOT.Result
) {
tailrec fun recursivelyExtractProjects(projects: Set<LoadProjectsBOT.Result.Project>) {
Expand Down

0 comments on commit eb1ebc9

Please sign in to comment.