Skip to content

Commit abd4ceb

Browse files
authored
Cleanups for v1.0 release (#78)
* Handle null component.moduleVersion * Track project dependencies more correctly * Update list of tested versions to include 8.3.1 * Improve filtering of unsupported versions from test * Bump org.junit.jupiter:junit-jupiter from 5.10.0 to 5.10.1
1 parent 03dc2f1 commit abd4ceb

File tree

7 files changed

+35
-38
lines changed

7 files changed

+35
-38
lines changed

.github/workflows/gradle.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,9 @@ jobs:
3030
strategy:
3131
fail-fast: false
3232
matrix:
33-
# Test latest version 5.x, 6.x and 7.x, plus oldest patched 7.x
34-
# Test all patched minor versions of 8.x
33+
# Test latest version 5.x, 6.x and 7.x, as well as all patched minor versions of 8.x
3534
# Latest 8.x is tested in 'quick-check' job
36-
gradle-version: [ "5.6.4", "6.9.4", "7.0.2", "7.6.2", "8.0.2", "8.1.1", "8.2.1"]
35+
gradle-version: [ "5.6.4", "6.9.4", "7.6.3", "8.0.2", "8.1.1", "8.2.1", "8.3"]
3736
runs-on: ubuntu-latest
3837
env:
3938
GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }}

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ github-packageurl = { group = "com.github.package-url", name = "packageurl-java"
1717
spock-core = { group = "org.spockframework", name = "spock-core", version.ref = "spock" }
1818
spock-junit4 = { group = "org.spockframework", name = "spock-junit4", version.ref = "spock" }
1919
junit-junit4 = { group = "junit", name = "junit", version = "4.13.2" }
20-
junit-jupiter = { group = "org.junit.jupiter", name = "junit-jupiter", version = "5.10.0" }
20+
junit-jupiter = { group = "org.junit.jupiter", name = "junit-jupiter", version = "5.10.1" }
2121

2222
groovy-json = { group = "org.codehaus.groovy", name = "groovy-json", version = "3.0.19" }
2323
json-schema-validator = { group = "com.networknt", name = "json-schema-validator", version = "1.0.87" }

plugin-test/src/test/groovy/org/gradle/github/dependencygraph/SampleProjectDependencyExtractorTest.groovy

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package org.gradle.github.dependencygraph
22

33
import org.apache.commons.io.FileUtils
4+
import org.gradle.util.GradleVersion
45
import spock.lang.IgnoreIf
56

6-
@IgnoreIf({ System.getProperty("testGradleVersion") == "5.6.4" })
77
// Samples aren't designed to run on Gradle 5.x
8+
@IgnoreIf({ GradleVersion.version(testGradleVersion) < GradleVersion.version("6.0") })
89
class SampleProjectDependencyExtractorTest extends BaseExtractorTest {
910
def setup() {
1011
applyDependencyGraphPlugin()
@@ -65,9 +66,8 @@ class SampleProjectDependencyExtractorTest extends BaseExtractorTest {
6566
])
6667
}
6768

68-
// Temporarily disable test that hangs on Gradle < 7.6
69-
// TODO: Re-enable this test
70-
@IgnoreIf({ System.getProperty("testGradleVersion") != null })
69+
// Test hangs on Gradle < 7 (but cannot reproduce this outside of TestKit)
70+
@IgnoreIf({ GradleVersion.version(testGradleVersion) < GradleVersion.version("7.0") })
7171
def "check java-included-builds sample"() {
7272
def sampleDir = new File("../sample-projects/java-included-builds")
7373

plugin/src/main/kotlin/org/gradle/dependencygraph/extractor/DependencyExtractor.kt

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.gradle.dependencygraph.extractor
22

33
import org.gradle.api.GradleException
4+
import org.gradle.api.artifacts.component.ProjectComponentIdentifier
45
import org.gradle.api.artifacts.result.ResolvedComponentResult
56
import org.gradle.api.artifacts.result.ResolvedDependencyResult
67
import org.gradle.api.internal.artifacts.DefaultProjectComponentIdentifier
@@ -144,8 +145,9 @@ abstract class DependencyExtractor :
144145
}
145146
val projectIdentityPath = (rootComponent.id as? DefaultProjectComponentIdentifier)?.identityPath?.path
146147

147-
// TODO: At this point, any resolution not bound to a particular project will be assigned to the root "build :"
148+
// At this point, any resolution not bound to a particular project will be assigned to the root "build :"
148149
// This is because `details.buildPath` is always ':', which isn't correct in a composite build.
150+
// This is inconsequential for GitHub Dependency Graph, since all dependencies are mapped to a single manifest.
149151
// It is possible to do better. By tracking the current build operation context, we can assign more precisely.
150152
// See the Gradle Enterprise Build Scan Plugin: `ConfigurationResolutionCapturer_5_0`
151153
val rootPath = projectIdentityPath ?: details.buildPath
@@ -159,17 +161,17 @@ abstract class DependencyExtractor :
159161
val rootSource = DependencySource(rootId, rootPath)
160162
val resolvedConfiguration = ResolvedConfiguration(rootSource, details.configurationName)
161163

162-
for (directDependency in getResolvedDependencies(rootComponent)) {
164+
for (dependencyComponent in getResolvedDependencies(rootComponent)) {
163165
val directDep = createComponentNode(
164-
componentId(directDependency),
166+
componentId(dependencyComponent),
165167
rootSource,
166168
true,
167-
directDependency,
169+
dependencyComponent,
168170
repositoryLookup
169171
)
170172
resolvedConfiguration.addDependency(directDep)
171173

172-
walkComponentDependencies(directDependency, directDep.source, repositoryLookup, resolvedConfiguration)
174+
walkComponentDependencies(dependencyComponent, directDep.source, repositoryLookup, resolvedConfiguration)
173175
}
174176

175177
resolvedConfigurations.add(resolvedConfiguration)
@@ -184,11 +186,11 @@ abstract class DependencyExtractor :
184186
val componentSource = getSource(component, parentSource)
185187
val direct = componentSource != parentSource
186188

187-
val dependencyComponents = getResolvedDependencies(component)
188-
for (dependencyComponent in dependencyComponents) {
189+
for (dependencyComponent in getResolvedDependencies(component)) {
189190
val dependencyId = componentId(dependencyComponent)
190191
if (!resolvedConfiguration.hasDependency(dependencyId)) {
191-
val dependencyNode = createComponentNode(dependencyId, componentSource, direct, dependencyComponent, repositoryLookup)
192+
val dependencyNode =
193+
createComponentNode(dependencyId, componentSource, direct, dependencyComponent, repositoryLookup)
192194
resolvedConfiguration.addDependency(dependencyNode)
193195

194196
walkComponentDependencies(dependencyComponent, componentSource, repositoryLookup, resolvedConfiguration)
@@ -208,13 +210,15 @@ abstract class DependencyExtractor :
208210
return component.dependencies.filterIsInstance<ResolvedDependencyResult>().map { it.selected }.filter { it != component }
209211
}
210212

211-
private fun createComponentNode(componentId: String, source: DependencySource, direct: Boolean, component: ResolvedComponentResult, repositoryLookup: RepositoryUrlLookup): ResolvedDependency {
213+
private fun createComponentNode(componentId: String, source: DependencySource, isDirectDependency: Boolean, component: ResolvedComponentResult, repositoryLookup: RepositoryUrlLookup): ResolvedDependency {
212214
val componentDependencies = component.dependencies.filterIsInstance<ResolvedDependencyResult>().map { componentId(it.selected) }
213215
val repositoryUrl = repositoryLookup.doLookup(component)
216+
val isProjectDependency = component.id is ProjectComponentIdentifier
214217
return ResolvedDependency(
215218
componentId,
216219
source,
217-
direct,
220+
isDirectDependency,
221+
isProjectDependency,
218222
coordinates(component),
219223
repositoryUrl,
220224
componentDependencies
@@ -226,13 +230,12 @@ abstract class DependencyExtractor :
226230
}
227231

228232
private fun coordinates(component: ResolvedComponentResult): DependencyCoordinates {
229-
// TODO: Consider and handle null moduleVersion
230-
val moduleVersionIdentifier = component.moduleVersion!!
231-
return DependencyCoordinates(
232-
moduleVersionIdentifier.group,
233-
moduleVersionIdentifier.name,
234-
moduleVersionIdentifier.version
235-
)
233+
val mv = component.moduleVersion
234+
return if (mv != null) {
235+
DependencyCoordinates(mv.group, mv.name, mv.version)
236+
} else {
237+
DependencyCoordinates("unknown", "unknown", "unknown")
238+
}
236239
}
237240

238241
private class RepositoryUrlLookup(

plugin/src/main/kotlin/org/gradle/dependencygraph/model/ResolvedDependency.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ private const val DEFAULT_MAVEN_REPOSITORY_URL = "https://repo.maven.apache.org/
77
data class ResolvedDependency(
88
val id: String,
99
val source: DependencySource,
10-
val direct: Boolean,
10+
val isDirect: Boolean,
11+
val isProject: Boolean,
1112
val coordinates: DependencyCoordinates,
1213
val repositoryUrl: String?,
1314
val dependencies: List<String>
@@ -17,7 +18,7 @@ data class ResolvedDependency(
1718
PackageURLBuilder
1819
.aPackageURL()
1920
.withType("maven")
20-
.withNamespace(coordinates.group.ifEmpty { coordinates.module }) // TODO: This is a sign of broken mapping from component -> PURL
21+
.withNamespace(coordinates.group.ifEmpty { coordinates.module })
2122
.withName(coordinates.module)
2223
.withVersion(coordinates.version)
2324
.also {

plugin/src/main/kotlin/org/gradle/forceresolve/ForceDependencyResolutionPlugin.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import org.gradle.api.invocation.Gradle
77
import org.gradle.api.tasks.TaskProvider
88
import org.gradle.util.GradleVersion
99

10-
// TODO: Rename these
1110
private const val RESOLVE_PROJECT_TASK = "ForceDependencyResolutionPlugin_resolveProjectDependencies"
1211
private const val RESOLVE_ALL_TASK = "ForceDependencyResolutionPlugin_resolveAllDependencies"
1312

@@ -40,10 +39,10 @@ class ForceDependencyResolutionPlugin : Plugin<Gradle> {
4039
private fun getResolveProjectDependenciesTaskFactory(): ResolveProjectDependenciesTaskFactory {
4140
val gradleVersion = GradleVersion.current()
4241
val gradle8 = GradleVersion.version("8.0")
43-
if (gradleVersion >= gradle8) {
44-
return ResolveProjectDependenciesTaskFactory.Current
42+
return if (gradleVersion >= gradle8) {
43+
ResolveProjectDependenciesTaskFactory.Current
4544
} else {
46-
return ResolveProjectDependenciesTaskFactory.Legacy
45+
ResolveProjectDependenciesTaskFactory.Legacy
4746
}
4847
}
4948

plugin/src/main/kotlin/org/gradle/github/dependencygraph/GitHubRepositorySnapshotBuilder.kt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class GitHubRepositorySnapshotBuilder(
2424
for (resolutionRoot in resolvedConfigurations) {
2525
for (dependency in resolutionRoot.allDependencies) {
2626
// Ignore project dependencies (transitive deps of projects will be reported with project)
27-
if (isProject(dependency)) continue
27+
if (dependency.isProject) continue
2828

2929
dependencyCollector.addResolved(dependency)
3030
}
@@ -51,11 +51,6 @@ class GitHubRepositorySnapshotBuilder(
5151
}
5252
}
5353

54-
// TODO:DAZ Model this better
55-
private fun isProject(dependency: ResolvedDependency): Boolean {
56-
return dependency.id.startsWith("project ")
57-
}
58-
5954
fun buildSnapshot(manifest: GitHubManifest): GitHubRepositorySnapshot {
6055
return GitHubRepositorySnapshot(
6156
job = job,
@@ -90,7 +85,7 @@ class GitHubRepositorySnapshotBuilder(
9085
}
9186

9287
private fun relationship(component: ResolvedDependency) =
93-
if (component.direct) GitHubDependency.Relationship.direct else GitHubDependency.Relationship.indirect
88+
if (component.isDirect) GitHubDependency.Relationship.direct else GitHubDependency.Relationship.indirect
9489

9590
private class GitHubDependencyBuilder(val package_url: String) {
9691
var relationship: GitHubDependency.Relationship = GitHubDependency.Relationship.indirect

0 commit comments

Comments
 (0)