Merge branch '2.7.x' into 3.0.x

Closes gh-38251
This commit is contained in:
Andy Wilkinson 2023-11-07 11:22:49 +00:00
commit 36161719e3
5 changed files with 80 additions and 27 deletions

View File

@ -62,7 +62,8 @@ public class BomPlugin implements Plugin<Project> {
createApiEnforcedConfiguration(project);
BomExtension bom = project.getExtensions()
.create("bom", BomExtension.class, project.getDependencies(), project);
project.getTasks().create("bomrCheck", CheckBom.class, bom);
CheckBom checkBom = project.getTasks().create("bomrCheck", CheckBom.class, bom);
project.getTasks().named("check").configure((check) -> check.dependsOn(checkBom));
project.getTasks().create("bomrUpgrade", UpgradeBom.class, bom);
project.getTasks().create("moveToSnapshots", MoveToSnapshots.class, bom);
new PublishingCustomizer(project, bom).customize();

View File

@ -16,18 +16,25 @@
package org.springframework.boot.build.bom;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;
import javax.inject.Inject;
import org.apache.maven.artifact.versioning.ArtifactVersion;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.apache.maven.artifact.versioning.Restriction;
import org.apache.maven.artifact.versioning.VersionRange;
import org.gradle.api.DefaultTask;
import org.gradle.api.InvalidUserDataException;
import org.gradle.api.GradleException;
import org.gradle.api.tasks.TaskAction;
import org.springframework.boot.build.bom.Library.Group;
import org.springframework.boot.build.bom.Library.Module;
import org.springframework.boot.build.bom.Library.ProhibitedVersion;
import org.springframework.boot.build.bom.bomr.version.DependencyVersion;
/**
@ -46,18 +53,41 @@ public class CheckBom extends DefaultTask {
@TaskAction
void checkBom() {
List<String> errors = new ArrayList<>();
for (Library library : this.bom.getLibraries()) {
for (Group group : library.getGroups()) {
for (Module module : group.getModules()) {
if (!module.getExclusions().isEmpty()) {
checkExclusions(group.getId(), module, library.getVersion().getVersion());
}
checkLibrary(library, errors);
}
if (!errors.isEmpty()) {
System.out.println();
errors.forEach(System.out::println);
System.out.println();
throw new GradleException("Bom check failed. See previous output for details.");
}
}
private void checkLibrary(Library library, List<String> errors) {
List<String> libraryErrors = new ArrayList<>();
checkExclusions(library, libraryErrors);
checkProhibitedVersions(library, libraryErrors);
if (!libraryErrors.isEmpty()) {
errors.add(library.getName());
for (String libraryError : libraryErrors) {
errors.add(" - " + libraryError);
}
}
}
private void checkExclusions(Library library, List<String> errors) {
for (Group group : library.getGroups()) {
for (Module module : group.getModules()) {
if (!module.getExclusions().isEmpty()) {
checkExclusions(group.getId(), module, library.getVersion().getVersion(), errors);
}
}
}
}
private void checkExclusions(String groupId, Module module, DependencyVersion version) {
private void checkExclusions(String groupId, Module module, DependencyVersion version, List<String> errors) {
Set<String> resolved = getProject().getConfigurations()
.detachedConfiguration(
getProject().getDependencies().create(groupId + ":" + module.getName() + ":" + version))
@ -87,8 +117,34 @@ public class CheckBom extends DefaultTask {
}
exclusions.removeAll(resolved);
if (!unused.isEmpty()) {
throw new InvalidUserDataException(
"Unnecessary exclusions on " + groupId + ":" + module.getName() + ": " + exclusions);
errors.add("Unnecessary exclusions on " + groupId + ":" + module.getName() + ": " + exclusions);
}
}
private void checkProhibitedVersions(Library library, List<String> errors) {
ArtifactVersion currentVersion = new DefaultArtifactVersion(library.getVersion().getVersion().toString());
for (ProhibitedVersion prohibited : library.getProhibitedVersions()) {
if (prohibited.isProhibited(library.getVersion().getVersion().toString())) {
errors.add("Current version " + currentVersion + " is prohibited");
}
else {
VersionRange versionRange = prohibited.getRange();
if (versionRange != null) {
for (Restriction restriction : versionRange.getRestrictions()) {
ArtifactVersion upperBound = restriction.getUpperBound();
if (upperBound == null) {
return;
}
int comparison = currentVersion.compareTo(upperBound);
if ((restriction.isUpperBoundInclusive() && comparison <= 0)
|| ((!restriction.isUpperBoundInclusive()) && comparison < 0)) {
return;
}
}
errors.add("Version range " + versionRange + " is ineffective as the current version, "
+ currentVersion + ", is greater than its upper bound");
}
}
}
}

View File

@ -20,6 +20,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Locale;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.apache.maven.artifact.versioning.VersionRange;
import org.springframework.boot.build.bom.bomr.version.DependencyVersion;
@ -141,6 +142,16 @@ public class Library {
return this.reason;
}
public boolean isProhibited(String candidate) {
boolean result = false;
result = result
|| (this.range != null && this.range.containsVersion(new DefaultArtifactVersion(candidate)));
result = result || this.startsWith.stream().anyMatch(candidate::startsWith);
result = result || this.endsWith.stream().anyMatch(candidate::endsWith);
result = result || this.contains.stream().anyMatch(candidate::contains);
return result;
}
}
public static class LibraryVersion {

View File

@ -33,8 +33,6 @@ import java.util.regex.Pattern;
import javax.inject.Inject;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.apache.maven.artifact.versioning.VersionRange;
import org.gradle.api.DefaultTask;
import org.gradle.api.InvalidUserDataException;
import org.gradle.api.internal.tasks.userinput.UserInputHandler;
@ -48,7 +46,6 @@ import org.gradle.api.tasks.options.Option;
import org.springframework.boot.build.bom.BomExtension;
import org.springframework.boot.build.bom.Library;
import org.springframework.boot.build.bom.Library.ProhibitedVersion;
import org.springframework.boot.build.bom.bomr.github.GitHub;
import org.springframework.boot.build.bom.bomr.github.GitHubRepository;
import org.springframework.boot.build.bom.bomr.github.Issue;
@ -246,17 +243,7 @@ public abstract class UpgradeDependencies extends DefaultTask {
private boolean isNotProhibited(Library library, DependencyVersion candidate) {
return !library.getProhibitedVersions()
.stream()
.anyMatch((prohibited) -> isProhibited(prohibited, candidate.toString()));
}
private boolean isProhibited(ProhibitedVersion prohibited, String candidate) {
boolean result = false;
VersionRange range = prohibited.getRange();
result = result || (range != null && range.containsVersion(new DefaultArtifactVersion(candidate)));
result = result || prohibited.getStartsWith().stream().anyMatch(candidate::startsWith);
result = result || prohibited.getStartsWith().stream().anyMatch(candidate::endsWith);
result = result || prohibited.getStartsWith().stream().anyMatch(candidate::contains);
return result;
.anyMatch((prohibited) -> prohibited.isProhibited(candidate.toString()));
}
private List<Library> matchingLibraries() {

View File

@ -123,9 +123,7 @@ bom {
"java-driver-bom"
]
modules = [
"java-driver-core" {
exclude group: "org.slf4j", module: "jcl-over-slf4j"
}
"java-driver-core"
]
}
}