Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -112,12 +112,17 @@ private boolean hasDependency(Tree tree) {
if (mavenResult != null) {
Scope requestedScope = scope == null ? null : Scope.fromName(scope);
List<ResolvedDependency> dependencies = mavenResult.findDependencies(groupIdPattern, artifactIdPattern, requestedScope);
Set<String> resolvedGAs = new HashSet<>();
for (ResolvedDependency dependency : dependencies) {
resolvedGAs.add(dependency.getGroupId() + ":" + dependency.getArtifactId());
if (versionComparator == null || versionComparator.isValid(null, dependency.getVersion())) {
return true;
}
}
for (Dependency requested : mavenResult.getPom().getRequestedDependencies()) {
if (resolvedGAs.contains(requested.getGroupId() + ":" + requested.getArtifactId())) {
continue;
}
if (matchesRequested(requested, requestedScope, versionComparator)) {
return true;
}
Expand All @@ -127,16 +132,23 @@ private boolean hasDependency(Tree tree) {

GradleProject gp = tree.getMarkers().findFirst(GradleProject.class).orElse(null);
if (gp != null) {
Set<String> resolvedGAs = new HashSet<>();
for (GradleDependencyConfiguration c : gp.getConfigurations()) {
for (ResolvedDependency resolvedDependency : c.getDirectResolved()) {
ResolvedDependency found = resolvedDependency.findDependency(groupIdPattern, artifactIdPattern);
if (found != null && (versionComparator == null || versionComparator.isValid(null, found.getVersion()))) {
return true;
if (found != null) {
resolvedGAs.add(found.getGroupId() + ":" + found.getArtifactId());
if (versionComparator == null || versionComparator.isValid(null, found.getVersion())) {
return true;
}
}
}
}
for (GradleDependencyConfiguration c : gp.getConfigurations()) {
for (Dependency requested : c.getRequested()) {
if (resolvedGAs.contains(requested.getGroupId() + ":" + requested.getArtifactId())) {
continue;
}
if (matchesRequested(requested, null, versionComparator)) {
return true;
}
Expand Down Expand Up @@ -166,10 +178,10 @@ private boolean matchesRequested(Dependency dep, @Nullable Scope requestedScope,
}

private static boolean versionMatches(@Nullable String version, @Nullable VersionComparator cmp) {
if (cmp == null || version == null) {
if (cmp == null) {
return true;
}
if (version.startsWith("${")) {
if (version == null || version.startsWith("${")) {
return false;
}
return cmp.isValid(null, version);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@
import org.openrewrite.semver.Semver;
import org.openrewrite.semver.VersionComparator;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;

@EqualsAndHashCode(callSuper = false)
Expand Down Expand Up @@ -107,12 +109,17 @@ private boolean hasDependency(Tree tree) {
if (mavenResult != null) {
Scope requestedScope = scope == null ? null : Scope.fromName(scope);
List<ResolvedDependency> dependencies = mavenResult.findDependencies(groupIdPattern, artifactIdPattern, requestedScope);
Set<String> resolvedGAs = new HashSet<>();
for (ResolvedDependency dependency : dependencies) {
resolvedGAs.add(dependency.getGroupId() + ":" + dependency.getArtifactId());
if (versionComparator == null || versionComparator.isValid(null, dependency.getVersion())) {
return true;
}
}
for (Dependency requested : mavenResult.getPom().getRequestedDependencies()) {
if (resolvedGAs.contains(requested.getGroupId() + ":" + requested.getArtifactId())) {
continue;
}
if (matchesRequested(requested, requestedScope, versionComparator)) {
return true;
}
Expand All @@ -122,16 +129,23 @@ private boolean hasDependency(Tree tree) {

GradleProject gp = tree.getMarkers().findFirst(GradleProject.class).orElse(null);
if (gp != null) {
Set<String> resolvedGAs = new HashSet<>();
for (GradleDependencyConfiguration c : gp.getConfigurations()) {
for (ResolvedDependency resolvedDependency : c.getDirectResolved()) {
ResolvedDependency found = resolvedDependency.findDependency(groupIdPattern, artifactIdPattern);
if (found != null && (versionComparator == null || versionComparator.isValid(null, found.getVersion()))) {
return true;
if (found != null) {
resolvedGAs.add(found.getGroupId() + ":" + found.getArtifactId());
if (versionComparator == null || versionComparator.isValid(null, found.getVersion())) {
return true;
}
}
}
}
for (GradleDependencyConfiguration c : gp.getConfigurations()) {
for (Dependency requested : c.getRequested()) {
if (resolvedGAs.contains(requested.getGroupId() + ":" + requested.getArtifactId())) {
continue;
}
if (matchesRequested(requested, null, versionComparator)) {
return true;
}
Expand Down Expand Up @@ -161,10 +175,10 @@ private boolean matchesRequested(Dependency dep, @Nullable Scope requestedScope,
}

private static boolean versionMatches(@Nullable String version, @Nullable VersionComparator cmp) {
if (cmp == null || version == null) {
if (cmp == null) {
return true;
}
if (version.startsWith("${")) {
if (version == null || version.startsWith("${")) {
return false;
}
return cmp.isValid(null, version);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,100 @@ void gradleVersionRangeOnRequestedDoesNotMatchWhenOutOfRange() {
)
);
}

@Language("groovy")
private final static String GradleNoRepositoriesNoVersion = """
plugins {
id 'java-library'
}
dependencies {
implementation 'org.springframework:spring-beans'
}
""";

@Test
void gradleRequestedWithoutVersionAndConstraintDoesNotMatch() {
// Force resolution failure (no repositories), so the requested fallback fires.
rewriteRun(
spec -> spec.recipe(new ModuleHasDependency(GroupId, ArtifactId, null, "[1.0,)", null)),
mavenProject("project-gradle",
buildGradle(GradleNoRepositoriesNoVersion),
java(GradleJava)
)
);
}
}

@Nested
class WhenResolvedVersionIsSourceOfTruth {

@Language("groovy")
private final static String GradleForcedOutOfRange = """
plugins {
id 'java-library'
}
repositories {
mavenCentral()
}
configurations.all {
resolutionStrategy {
force 'org.springframework:spring-beans:6.0.0'
}
}
dependencies {
implementation 'org.springframework:spring-beans:5.3.0'
}
""";

@Test
void gradleVersionRangeDoesNotMatchDeclaredWhenResolvedVersionIsOutOfRange() {
// The declared-dependency fallback must be skipped for an already-resolved coordinate (resolutionStrategy).
rewriteRun(
spec -> spec.recipe(new ModuleHasDependency(GroupId, ArtifactId, null, "[5.0,6.0)", null)),
mavenProject("project-gradle",
buildGradle(GradleForcedOutOfRange),
java(GradleJava)
)
);
}

@Language("xml")
private final static String MavenBomManagedOutOfRange = """
<project>
<groupId>com.example</groupId>
<artifactId>foo</artifactId>
<version>1.0.0</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
</dependencies>
</project>
""";

@Test
void mavenVersionRangeDoesNotMatchBomManagedDependencyWhenResolvedIsOutOfRange() {
// Regression for rewrite-third-party#76: BOM-managed version (null on requested) must not match the range.
rewriteRun(
spec -> spec.recipe(new ModuleHasDependency(GroupId, ArtifactId, null, "[5.0,6.0)", null)),
mavenProject("project-maven",
pomXml(MavenBomManagedOutOfRange),
java(MavenJava)
)
);
}
}

@Nested
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,15 @@
*/
package org.openrewrite.java.dependencies.search;

import org.intellij.lang.annotations.Language;
import org.junit.jupiter.api.Test;
import org.openrewrite.DocumentExample;
import org.openrewrite.test.RecipeSpec;
import org.openrewrite.test.RewriteTest;

import static org.openrewrite.gradle.Assertions.buildGradle;
import static org.openrewrite.gradle.toolingapi.Assertions.withToolingApi;
import static org.openrewrite.java.Assertions.java;
import static org.openrewrite.java.Assertions.mavenProject;
import static org.openrewrite.maven.Assertions.pomXml;

Expand Down Expand Up @@ -84,4 +87,92 @@ void usedAsDeclarativePrecondition() {
)
);
}

@Language("java")
private final static String GradleJava = """
public class AGradle {}
""";

@Test
void gradleVersionRangeDoesNotMatchDeclaredWhenResolvedVersionIsOutOfRange() {
// The declared-dependency fallback must be skipped for an already-resolved coordinate (resolutionStrategy).
rewriteRun(
spec -> spec.recipe(new RepositoryHasDependency("org.springframework", "spring-beans", null, "[5.0,6.0)")),
mavenProject("project-gradle",
//language=groovy
buildGradle("""
plugins {
id 'java-library'
}
repositories {
mavenCentral()
}
configurations.all {
resolutionStrategy {
force 'org.springframework:spring-beans:6.0.0'
}
}
dependencies {
implementation 'org.springframework:spring-beans:5.3.0'
}
"""),
java(GradleJava)
)
);
}

@Test
void mavenVersionRangeDoesNotMatchBomManagedDependencyWhenResolvedIsOutOfRange() {
// Regression for rewrite-third-party#76: BOM-managed version (null on requested) must not match the range.
rewriteRun(
spec -> spec.recipe(new RepositoryHasDependency("org.springframework", "spring-beans", null, "[5.0,6.0)")),
mavenProject("project-maven",
//language=xml
pomXml("""
<project>
<groupId>com.example</groupId>
<artifactId>foo</artifactId>
<version>1.0.0</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
</dependencies>
</project>
""")
)
);
}

@Test
void gradleRequestedWithoutVersionAndConstraintDoesNotMatch() {
// Force resolution failure (no repositories), so the requested fallback fires.
rewriteRun(
spec -> spec.recipe(new RepositoryHasDependency("org.springframework", "spring-beans", null, "[1.0,)")),
mavenProject("project-gradle",
//language=groovy
buildGradle("""
plugins {
id 'java-library'
}
dependencies {
implementation 'org.springframework:spring-beans'
}
"""),
java(GradleJava)
)
);
}
}
Loading