Merge branch '3.2.x' into 3.3.x

Closes gh-42930
This commit is contained in:
Andy Wilkinson 2024-10-29 17:54:55 +00:00
commit c8b0e7f66a
11 changed files with 84 additions and 41 deletions

View File

@ -31,6 +31,8 @@ import org.apache.maven.artifact.versioning.Restriction;
import org.apache.maven.artifact.versioning.VersionRange;
import org.gradle.api.DefaultTask;
import org.gradle.api.GradleException;
import org.gradle.api.artifacts.ConfigurationContainer;
import org.gradle.api.artifacts.dsl.DependencyHandler;
import org.gradle.api.tasks.TaskAction;
import org.springframework.boot.build.bom.Library.Group;
@ -47,11 +49,17 @@ import org.springframework.boot.build.bom.bomr.version.DependencyVersion;
*/
public abstract class CheckBom extends DefaultTask {
private final ConfigurationContainer configurations;
private final DependencyHandler dependencies;
private final BomExtension bom;
@Inject
public CheckBom(BomExtension bom) {
this.bom = bom;
this.configurations = getProject().getConfigurations();
this.dependencies = getProject().getDependencies();
}
@TaskAction
@ -93,9 +101,8 @@ public abstract class CheckBom extends DefaultTask {
}
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))
Set<String> resolved = this.configurations
.detachedConfiguration(this.dependencies.create(groupId + ":" + module.getName() + ":" + version))
.getResolvedConfiguration()
.getResolvedArtifacts()
.stream()
@ -202,8 +209,7 @@ public abstract class CheckBom extends DefaultTask {
private File resolveBom(Library library, String alignsWithBom) {
String coordinates = alignsWithBom + ":" + library.getVersion().getVersion() + "@pom";
Set<File> files = getProject().getConfigurations()
.detachedConfiguration(getProject().getDependencies().create(coordinates))
Set<File> files = this.configurations.detachedConfiguration(this.dependencies.create(coordinates))
.getResolvedConfiguration()
.getFiles();
if (files.size() != 1) {

View File

@ -35,6 +35,7 @@ import org.springframework.boot.build.bom.bomr.ReleaseSchedule.Release;
import org.springframework.boot.build.bom.bomr.github.Milestone;
import org.springframework.boot.build.bom.bomr.version.DependencyVersion;
import org.springframework.boot.build.properties.BuildProperties;
import org.springframework.boot.build.properties.BuildType;
/**
* A {@link Task} to move to snapshot dependencies.
@ -45,6 +46,8 @@ public abstract class MoveToSnapshots extends UpgradeDependencies {
private static final Logger logger = LoggerFactory.getLogger(MoveToSnapshots.class);
private final BuildType buildType = BuildProperties.get(getProject()).buildType();
@Inject
public MoveToSnapshots(BomExtension bom) {
super(bom, true);
@ -87,7 +90,7 @@ public abstract class MoveToSnapshots extends UpgradeDependencies {
@Override
protected List<BiPredicate<Library, DependencyVersion>> determineUpdatePredicates(Milestone milestone) {
return switch (BuildProperties.get(getProject()).buildType()) {
return switch (this.buildType) {
case OPEN_SOURCE -> determineOpenSourceUpdatePredicates(milestone);
case COMMERCIAL -> super.determineUpdatePredicates(milestone);
};

View File

@ -20,6 +20,7 @@ import javax.inject.Inject;
import org.gradle.api.Task;
import org.gradle.api.artifacts.ArtifactRepositoryContainer;
import org.gradle.api.artifacts.dsl.RepositoryHandler;
import org.gradle.api.artifacts.repositories.MavenArtifactRepository;
import org.springframework.boot.build.bom.BomExtension;
@ -37,14 +38,14 @@ public abstract class UpgradeBom extends UpgradeDependencies {
public UpgradeBom(BomExtension bom) {
super(bom);
switch (BuildProperties.get(getProject()).buildType()) {
case OPEN_SOURCE -> addOpenSourceRepositories();
case OPEN_SOURCE -> addOpenSourceRepositories(getProject().getRepositories());
case COMMERCIAL -> addCommercialRepositories();
}
}
private void addOpenSourceRepositories() {
private void addOpenSourceRepositories(RepositoryHandler repositories) {
getRepositoryNames().add(ArtifactRepositoryContainer.DEFAULT_MAVEN_CENTRAL_REPO_NAME);
getProject().getRepositories().withType(MavenArtifactRepository.class, (repository) -> {
repositories.withType(MavenArtifactRepository.class, (repository) -> {
String name = repository.getName();
if (name.startsWith("spring-") && !name.endsWith("-snapshot")) {
getRepositoryNames().add(name);

View File

@ -35,6 +35,7 @@ import javax.inject.Inject;
import org.gradle.api.DefaultTask;
import org.gradle.api.InvalidUserDataException;
import org.gradle.api.artifacts.dsl.RepositoryHandler;
import org.gradle.api.artifacts.repositories.MavenArtifactRepository;
import org.gradle.api.internal.tasks.userinput.UserInputHandler;
import org.gradle.api.provider.ListProperty;
@ -66,6 +67,10 @@ public abstract class UpgradeDependencies extends DefaultTask {
private final boolean movingToSnapshots;
private final UpgradeApplicator upgradeApplicator;
private final RepositoryHandler repositories;
@Inject
public UpgradeDependencies(BomExtension bom) {
this(bom, false);
@ -75,6 +80,9 @@ public abstract class UpgradeDependencies extends DefaultTask {
this.bom = bom;
getThreads().convention(2);
this.movingToSnapshots = movingToSnapshots;
this.upgradeApplicator = new UpgradeApplicator(getProject().getBuildFile().toPath(),
new File(getProject().getRootProject().getProjectDir(), "gradle.properties").toPath());
this.repositories = getProject().getRepositories();
}
@Input
@ -106,9 +114,6 @@ public abstract class UpgradeDependencies extends DefaultTask {
private void applyUpgrades(GitHubRepository repository, List<String> issueLabels, Milestone milestone,
List<Upgrade> upgrades) {
Path buildFile = getProject().getBuildFile().toPath();
Path gradleProperties = new File(getProject().getRootProject().getProjectDir(), "gradle.properties").toPath();
UpgradeApplicator upgradeApplicator = new UpgradeApplicator(buildFile, gradleProperties);
List<Issue> existingUpgradeIssues = repository.findIssues(issueLabels, milestone);
System.out.println("Applying upgrades...");
System.out.println("");
@ -117,7 +122,7 @@ public abstract class UpgradeDependencies extends DefaultTask {
String title = issueTitle(upgrade);
Issue existingUpgradeIssue = findExistingUpgradeIssue(existingUpgradeIssues, upgrade);
try {
Path modified = upgradeApplicator.apply(upgrade);
Path modified = this.upgradeApplicator.apply(upgrade);
int issueNumber = getOrOpenUpgradeIssue(repository, issueLabels, milestone, title,
existingUpgradeIssue);
if (existingUpgradeIssue != null && existingUpgradeIssue.getState() == Issue.State.CLOSED) {
@ -236,7 +241,7 @@ public abstract class UpgradeDependencies extends DefaultTask {
private List<MavenArtifactRepository> asRepositories(List<String> repositoryNames) {
return repositoryNames.stream()
.map(getProject().getRepositories()::getByName)
.map(this.repositories::getByName)
.map(MavenArtifactRepository.class::cast)
.toList();
}

View File

@ -59,7 +59,7 @@ public abstract class CheckClasspathForUnnecessaryExclusions extends DefaultTask
private final Dependency platform;
private final DependencyHandler dependencyHandler;
private final DependencyHandler dependencies;
private final ConfigurationContainer configurations;
@ -68,10 +68,10 @@ public abstract class CheckClasspathForUnnecessaryExclusions extends DefaultTask
@Inject
public CheckClasspathForUnnecessaryExclusions(DependencyHandler dependencyHandler,
ConfigurationContainer configurations) {
this.dependencyHandler = getProject().getDependencies();
this.dependencies = getProject().getDependencies();
this.configurations = getProject().getConfigurations();
this.platform = this.dependencyHandler
.create(this.dependencyHandler.platform(this.dependencyHandler.project(SPRING_BOOT_DEPENDENCIES_PROJECT)));
this.platform = this.dependencies
.create(this.dependencies.platform(this.dependencies.project(SPRING_BOOT_DEPENDENCIES_PROJECT)));
getOutputs().upToDateWhen((task) -> true);
}
@ -101,7 +101,7 @@ public abstract class CheckClasspathForUnnecessaryExclusions extends DefaultTask
.collect(Collectors.toCollection(TreeSet::new));
this.exclusionsByDependencyId.put(dependencyId, exclusions);
if (!exclusions.isEmpty()) {
this.dependencyById.put(dependencyId, getProject().getDependencies().create(dependencyId));
this.dependencyById.put(dependencyId, this.dependencies.create(dependencyId));
}
}

View File

@ -54,6 +54,8 @@ public abstract class HomebrewFormula extends DefaultTask {
private final FileSystemOperations fileSystemOperations;
private final BuildType buildType;
@Inject
public HomebrewFormula(FileSystemOperations fileSystemOperations) {
this.fileSystemOperations = fileSystemOperations;
@ -62,6 +64,7 @@ public abstract class HomebrewFormula extends DefaultTask {
properties.put("hash", getArchive().map((archive) -> sha256(archive.getAsFile())));
getProperties().put("repo", ArtifactRelease.forProject(project).getDownloadRepo());
getProperties().put("version", project.getVersion().toString());
this.buildType = BuildProperties.get(getProject()).buildType();
}
private String sha256(File file) {
@ -90,8 +93,7 @@ public abstract class HomebrewFormula extends DefaultTask {
@TaskAction
void createFormula() {
BuildType buildType = BuildProperties.get(getProject()).buildType();
if (buildType != BuildType.OPEN_SOURCE) {
if (this.buildType != BuildType.OPEN_SOURCE) {
logger.debug("Skipping Homebrew formula for non open source build type");
return;
}

View File

@ -62,17 +62,18 @@ public abstract class ExtractVersionConstraints extends DefaultTask {
private final List<BomExtension> boms = new ArrayList<>();
private final DependencyHandler dependencies;
public ExtractVersionConstraints() {
DependencyHandler dependencies = getProject().getDependencies();
this.dependencies = getProject().getDependencies();
this.configuration = getProject().getConfigurations().create(getName());
dependencies.getComponents().all(this::processMetadataDetails);
this.dependencies.getComponents().all(this::processMetadataDetails);
}
public void enforcedPlatform(String projectPath) {
this.configuration.getDependencies()
.add(getProject().getDependencies()
.enforcedPlatform(
getProject().getDependencies().project(Collections.singletonMap("path", projectPath))));
.add(this.dependencies
.enforcedPlatform(this.dependencies.project(Collections.singletonMap("path", projectPath))));
Project project = getProject().project(projectPath);
project.getPlugins().withType(BomPlugin.class).all((plugin) -> {
this.boms.add(project.getExtensions().getByType(BomExtension.class));

View File

@ -30,6 +30,7 @@ import java.util.Arrays;
import java.util.Properties;
import java.util.function.BiConsumer;
import javax.inject.Inject;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
@ -334,6 +335,13 @@ public class MavenPluginPlugin implements Plugin<Project> {
public abstract static class FormatHelpMojoSource extends DefaultTask {
private final ObjectFactory objectFactory;
@Inject
public FormatHelpMojoSource(ObjectFactory objectFactory) {
this.objectFactory = objectFactory;
}
private Task generator;
void setGenerator(Task generator) {
@ -350,7 +358,7 @@ public class MavenPluginPlugin implements Plugin<Project> {
void syncAndFormat() {
FileFormatter formatter = new FileFormatter();
for (File output : this.generator.getOutputs().getFiles()) {
formatter.formatFiles(getProject().fileTree(output), StandardCharsets.UTF_8)
formatter.formatFiles(this.objectFactory.fileTree().from(output), StandardCharsets.UTF_8)
.forEach((edit) -> save(output, edit));
}
}

View File

@ -16,14 +16,21 @@
package org.springframework.boot.build.mavenplugin;
import java.util.Set;
import java.util.stream.Collectors;
import javax.inject.Inject;
import org.gradle.api.DefaultTask;
import org.gradle.api.Task;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.ConfigurationContainer;
import org.gradle.api.artifacts.dsl.DependencyHandler;
import org.gradle.api.file.ArchiveOperations;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.file.FileSystemOperations;
import org.gradle.api.file.FileTree;
import org.gradle.api.provider.Provider;
import org.gradle.api.provider.SetProperty;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.OutputDirectory;
@ -38,12 +45,19 @@ public abstract class PrepareMavenBinaries extends DefaultTask {
private final FileSystemOperations fileSystemOperations;
private final ArchiveOperations archiveOperations;
private final Provider<Set<FileTree>> binaries;
@Inject
public PrepareMavenBinaries(FileSystemOperations fileSystemOperations, ArchiveOperations archiveOperations) {
this.fileSystemOperations = fileSystemOperations;
this.archiveOperations = archiveOperations;
ConfigurationContainer configurations = getProject().getConfigurations();
DependencyHandler dependencies = getProject().getDependencies();
this.binaries = getVersions().map((versions) -> versions.stream()
.map((version) -> configurations
.detachedConfiguration(dependencies.create("org.apache.maven:apache-maven:" + version + ":bin@zip")))
.map(Configuration::getSingleFile)
.map(archiveOperations::zipTree)
.collect(Collectors.toSet()));
}
@OutputDirectory
@ -56,14 +70,8 @@ public abstract class PrepareMavenBinaries extends DefaultTask {
public void prepareBinaries() {
this.fileSystemOperations.sync((sync) -> {
sync.into(getOutputDir());
for (String version : getVersions().get()) {
Configuration configuration = getProject().getConfigurations()
.detachedConfiguration(getProject().getDependencies()
.create("org.apache.maven:apache-maven:" + version + ":bin@zip"));
sync.from(this.archiveOperations.zipTree(configuration.getSingleFile()));
}
this.binaries.get().forEach(sync::from);
});
}
}

View File

@ -36,11 +36,14 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import javax.inject.Inject;
import org.gradle.api.DefaultTask;
import org.gradle.api.Task;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.file.FileCollection;
import org.gradle.api.file.RegularFileProperty;
import org.gradle.api.model.ObjectFactory;
import org.gradle.api.tasks.Classpath;
import org.gradle.api.tasks.InputFile;
import org.gradle.api.tasks.InputFiles;
@ -65,13 +68,17 @@ import org.springframework.util.StringUtils;
*/
public abstract class TestSliceMetadata extends DefaultTask {
private final ObjectFactory objectFactory;
private FileCollection classpath;
private FileCollection importsFiles;
private FileCollection classesDirs;
public TestSliceMetadata() {
@Inject
public TestSliceMetadata(ObjectFactory objectFactory) {
this.objectFactory = objectFactory;
Configuration testSliceMetadata = getProject().getConfigurations().maybeCreate("testSliceMetadata");
getProject().afterEvaluate((evaluated) -> evaluated.getArtifacts()
.add(testSliceMetadata.getName(), getOutputFile(), (artifact) -> artifact.builtBy(this)));
@ -79,8 +86,9 @@ public abstract class TestSliceMetadata extends DefaultTask {
public void setSourceSet(SourceSet sourceSet) {
this.classpath = sourceSet.getRuntimeClasspath();
this.importsFiles = getProject().fileTree(new File(sourceSet.getOutput().getResourcesDir(), "META-INF/spring"),
(tree) -> tree.filter((file) -> file.getName().endsWith(".imports")));
this.importsFiles = this.objectFactory.fileTree()
.from(new File(sourceSet.getOutput().getResourcesDir(), "META-INF/spring"));
this.importsFiles.filter((file) -> file.getName().endsWith(".imports"));
getSpringFactories().set(new File(sourceSet.getOutput().getResourcesDir(), "META-INF/spring.factories"));
this.classesDirs = sourceSet.getOutput().getClassesDirs();
}

View File

@ -32,10 +32,11 @@ task syncIntegrationTestSources(type: Sync) {
}
processResources {
def version = project.version
eachFile {
filter { it.replace('${spring-boot.version}', project.version) }
filter { it.replace('${spring-boot.version}', version) }
}
inputs.property "version", project.version
inputs.property "version", version
}
task integrationTest {