Skip to content

Commit

Permalink
Rename model classes: Component -> Dependency
Browse files Browse the repository at this point in the history
  • Loading branch information
bigdaz committed Jul 14, 2023
1 parent 04cb3c1 commit 3449082
Show file tree
Hide file tree
Showing 9 changed files with 51 additions and 54 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.gradle.github.dependencygraph.internal

import org.gradle.github.dependencygraph.internal.json.GitHubManifestFile
import org.gradle.github.dependencygraph.internal.model.ResolutionRoot
import org.gradle.github.dependencygraph.internal.model.DependencySource
import java.nio.file.Path
import java.nio.file.Paths
import java.util.concurrent.ConcurrentHashMap
Expand All @@ -14,15 +14,11 @@ class BuildLayout(val gitWorkspaceDirectory: Path) {
projectToRelativeBuildFile[identityPath] = gitWorkspaceDirectory.relativize(buildFilePath).toString()
}

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

fun getBuildFile(rootComponent: ResolutionRoot): GitHubManifestFile? {
return buildFileForProject(rootComponent.path)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import org.gradle.api.artifacts.result.ResolvedDependencyResult
import org.gradle.api.internal.artifacts.DefaultProjectComponentIdentifier
import org.gradle.api.internal.artifacts.configurations.ResolveConfigurationDependenciesBuildOperationType
import org.gradle.github.GitHubDependencyGraphPlugin
import org.gradle.github.dependencygraph.internal.model.ComponentCoordinates
import org.gradle.github.dependencygraph.internal.model.ResolutionRoot
import org.gradle.github.dependencygraph.internal.model.ResolvedComponent
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.internal.exceptions.DefaultMultiCauseException
import org.gradle.internal.operations.*
Expand Down Expand Up @@ -118,72 +118,72 @@ abstract class DependencyExtractor :
val projectIdentityPath = (rootComponent.id as? DefaultProjectComponentIdentifier)?.identityPath?.path
val rootPath = projectIdentityPath ?: details.buildPath
val rootId = if (projectIdentityPath == null) "build $rootPath" else componentId(rootComponent)
val resolutionRoot = ResolutionRoot(rootId, rootPath)
val resolvedConfiguration = ResolvedConfiguration(resolutionRoot)
val rootSource = DependencySource(rootId, rootPath)
val resolvedConfiguration = ResolvedConfiguration(rootSource)

for (directDependency in getResolvedDependencies(rootComponent)) {
val directDep = createComponentNode(
componentId(directDependency),
resolutionRoot,
rootSource,
true,
directDependency,
repositoryLookup
)
resolvedConfiguration.addDependency(directDep)

walkComponentDependencies(directDependency, resolutionRoot, repositoryLookup, resolvedConfiguration)
walkComponentDependencies(directDependency, directDep.source, repositoryLookup, resolvedConfiguration)
}

resolvedConfigurations.add(resolvedConfiguration)
}

private fun walkComponentDependencies(
component: ResolvedComponentResult,
resolveContext: ResolutionRoot,
parentSource: DependencySource,
repositoryLookup: RepositoryUrlLookup,
resolvedConfiguration: ResolvedConfiguration
) {
val rootComponent = getResolutionRoot(component, resolveContext)
val direct = rootComponent != resolveContext
val componentSource = getSource(component, parentSource)
val direct = componentSource != parentSource

val dependencyComponents = getResolvedDependencies(component)
for (dependencyComponent in dependencyComponents) {
val dependencyId = componentId(dependencyComponent)
if (!resolvedConfiguration.hasDependency(dependencyId)) {
val dependencyNode = createComponentNode(dependencyId, rootComponent, direct, dependencyComponent, repositoryLookup)
val dependencyNode = createComponentNode(dependencyId, componentSource, direct, dependencyComponent, repositoryLookup)
resolvedConfiguration.addDependency(dependencyNode)

walkComponentDependencies(dependencyComponent, rootComponent, repositoryLookup, resolvedConfiguration)
walkComponentDependencies(dependencyComponent, componentSource, repositoryLookup, resolvedConfiguration)
}
}
}

private fun getResolutionRoot(component: ResolvedComponentResult, resolveContext: ResolutionRoot): ResolutionRoot {
private fun getSource(component: ResolvedComponentResult, source: DependencySource): DependencySource {
val componentId = component.id
if (componentId is DefaultProjectComponentIdentifier) {
return ResolutionRoot(componentId(component), componentId.identityPath.path)
return DependencySource(componentId(component), componentId.identityPath.path)
}
return resolveContext
return source
}

private fun getResolvedDependencies(component: ResolvedComponentResult): List<ResolvedComponentResult> {
return component.dependencies.filterIsInstance<ResolvedDependencyResult>().map { it.selected }.filter { it != component }
}

private fun createComponentNode(componentId: String, rootComponent: ResolutionRoot, direct: Boolean, component: ResolvedComponentResult, repositoryLookup: RepositoryUrlLookup): ResolvedComponent {
private fun createComponentNode(componentId: String, source: DependencySource, direct: Boolean, component: ResolvedComponentResult, repositoryLookup: RepositoryUrlLookup): ResolvedDependency {
val componentDependencies = component.dependencies.filterIsInstance<ResolvedDependencyResult>().map { componentId(it.selected) }
val repositoryUrl = repositoryLookup.doLookup(component)
return ResolvedComponent(componentId, rootComponent, direct, coordinates(component), repositoryUrl, componentDependencies)
return ResolvedDependency(componentId, source, direct, coordinates(component), repositoryUrl, componentDependencies)
}

private fun componentId(component: ResolvedComponentResult): String {
return component.id.displayName
}

private fun coordinates(component: ResolvedComponentResult): ComponentCoordinates {
private fun coordinates(component: ResolvedComponentResult): DependencyCoordinates {
// TODO: Consider and handle null moduleVersion
val moduleVersionIdentifier = component.moduleVersion!!
return ComponentCoordinates(moduleVersionIdentifier.group, moduleVersionIdentifier.name, moduleVersionIdentifier.version)
return DependencyCoordinates(moduleVersionIdentifier.group, moduleVersionIdentifier.name, moduleVersionIdentifier.version)
}

private class RepositoryUrlLookup(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package org.gradle.github.dependencygraph.internal

import com.github.packageurl.PackageURLBuilder
import org.gradle.github.dependencygraph.internal.model.ResolvedComponent
import org.gradle.github.dependencygraph.internal.model.ResolvedDependency
import org.gradle.github.dependencygraph.internal.model.ResolvedConfiguration
import org.gradle.github.dependencygraph.internal.json.*
import org.gradle.github.dependencygraph.internal.model.ResolutionRoot
import org.gradle.github.dependencygraph.internal.model.DependencySource

private const val DEFAULT_MAVEN_REPOSITORY_URL = "https://repo.maven.apache.org/maven2"

Expand Down Expand Up @@ -32,14 +32,14 @@ class GitHubRepositorySnapshotBuilder(
// Ignore project dependencies (transitive deps of projects will be reported with project)
if (isProject(dependency)) continue

val rootComponent = dependency.rootComponent
val dependencyCollector = manifestDependencies.getOrPut(rootComponent.id) { DependencyCollector(rootComponent) }
val source = dependency.source
val dependencyCollector = manifestDependencies.getOrPut(source.id) { DependencyCollector(source) }
dependencyCollector.addResolved(dependency)
}
}

val manifests = manifestDependencies.mapValues { (name, collector) ->
val manifestFile = buildLayout.getBuildFile(collector.rootComponent)
val manifestFile = buildLayout.getBuildFile(collector.dependencySource)

GitHubManifest(
name,
Expand All @@ -57,17 +57,17 @@ class GitHubRepositorySnapshotBuilder(
}

// TODO:DAZ Model this better
private fun isProject(dependency: ResolvedComponent): Boolean {
private fun isProject(dependency: ResolvedDependency): Boolean {
return dependency.id.startsWith("project ")
}

private class DependencyCollector(val rootComponent: ResolutionRoot) {
private class DependencyCollector(val dependencySource: DependencySource) {
private val dependencyBuilders: MutableMap<String, GitHubDependencyBuilder> = mutableMapOf()

/**
* Merge each resolved component with the same ID into a single GitHubDependency.
*/
fun addResolved(component: ResolvedComponent) {
fun addResolved(component: ResolvedDependency) {
val dep = dependencyBuilders.getOrPut(component.id) {
GitHubDependencyBuilder(packageUrl(component))
}
Expand All @@ -84,10 +84,10 @@ class GitHubRepositorySnapshotBuilder(
}
}

private fun relationship(component: ResolvedComponent) =
private fun relationship(component: ResolvedDependency) =
if (component.direct) GitHubDependency.Relationship.direct else GitHubDependency.Relationship.indirect

private fun packageUrl(component: ResolvedComponent) =
private fun packageUrl(component: ResolvedDependency) =
PackageURLBuilder
.aPackageURL()
.withType("maven")
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package org.gradle.github.dependencygraph.internal.model

data class DependencyCoordinates(val group: String, val module: String, val version: String)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.gradle.github.dependencygraph.internal.model

/**
* The source of a dependency declaration, representing where the direct dependency is declared,
* or where the parent dependency is declared for transitive dependencies.
* In most cases, this will be the project component that declares the dependency,
* but may also be a Version Catalog or the build as a whole.
* We attempt to map this to an actual source file location when building a dependency report.
*/
data class DependencySource(val id: String, val path: String)

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package org.gradle.github.dependencygraph.internal.model

data class ResolvedConfiguration(
val rootComponent: ResolutionRoot,
val allDependencies: MutableList<ResolvedComponent> = mutableListOf()
val rootSource: DependencySource,
val allDependencies: MutableList<ResolvedDependency> = mutableListOf()
) {
fun addDependency(component: ResolvedComponent) {
fun addDependency(component: ResolvedDependency) {
allDependencies.add(component)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package org.gradle.github.dependencygraph.internal.model

data class ResolvedComponent(
data class ResolvedDependency(
val id: String,
val rootComponent: ResolutionRoot,
val source: DependencySource,
val direct: Boolean,
val coordinates: ComponentCoordinates,
val coordinates: DependencyCoordinates,
val repositoryUrl: String?,
val dependencies: List<String>
)

0 comments on commit 3449082

Please sign in to comment.