From 4a424936754e033086c89c29de3142e6943b024a Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 5 Oct 2026 10:13:53 +0100 Subject: [PATCH] Use --release-train as source of release date When the milestone is unscheduled, use the configured release train as a source of the release date. This allows moveToSnapshots to be used before joining the train, when the milestone is typically unscheduled. Fixes gh-51942 --- .../boot/build/bom/bomr/MoveToSnapshots.java | 24 +++++++++++++++---- .../boot/build/bom/bomr/UpgradeBom.java | 8 +++++++ .../build/bom/bomr/UpgradeDependencies.java | 11 ++++----- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/MoveToSnapshots.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/MoveToSnapshots.java index af10d3ce3d5..f1ad4c5b00f 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/MoveToSnapshots.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/MoveToSnapshots.java @@ -16,7 +16,11 @@ package org.springframework.boot.build.bom.bomr; +import java.time.LocalDate; +import java.time.LocalTime; import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; import java.util.function.BiFunction; @@ -36,6 +40,7 @@ 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; +import org.springframework.util.Assert; /** * A {@link Task} to move to snapshot dependencies. @@ -89,7 +94,11 @@ public abstract class MoveToSnapshots extends UpgradeDependencies { private BiFunction createOpenSourceVersionOptionResolver( Milestone milestone) { - Map> scheduledReleases = getScheduledOpenSourceReleases(milestone); + OffsetDateTime releaseDate = (milestone.getDueOn() != null) ? milestone.getDueOn() : releaseTrainDate(); + Assert.state(releaseDate != null, + "No release date available. Schedule the %s milestone or use --release-train to provide a release date" + .formatted(milestone.getName())); + Map> scheduledReleases = getScheduledOpenSourceReleases(releaseDate); BiFunction resolver = super.createVersionOptionResolver(milestone); return (library, dependencyVersion) -> { VersionOption versionOption = resolver.apply(library, dependencyVersion); @@ -106,16 +115,23 @@ public abstract class MoveToSnapshots extends UpgradeDependencies { } if (logger.isInfoEnabled()) { logger.info("Ignoring {}. No release of {} scheduled before {}", dependencyVersion, - library.getName(), milestone.getDueOn()); + library.getName(), releaseDate); } } return null; }; } - private Map> getScheduledOpenSourceReleases(Milestone milestone) { + private OffsetDateTime releaseTrainDate() { + return getReleaseTrain() + .map((releaseTrain) -> LocalDate.parse(releaseTrain, DateTimeFormatter.ofPattern("yyyy.MM.dd"))) + .map((date) -> OffsetDateTime.of(date, LocalTime.of(23, 59, 59), ZoneOffset.UTC)) + .getOrNull(); + } + + private Map> getScheduledOpenSourceReleases(OffsetDateTime releaseDate) { ReleaseSchedule releaseSchedule = new ReleaseSchedule(); - return releaseSchedule.releasesBetween(OffsetDateTime.now(), milestone.getDueOn()); + return releaseSchedule.releasesBetween(OffsetDateTime.now(), releaseDate); } } diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeBom.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeBom.java index 6b337ed6f2d..24d49e32f70 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeBom.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeBom.java @@ -88,4 +88,12 @@ public abstract class UpgradeBom extends UpgradeDependencies { System.out.println(); } + @Override + protected VersionResolver getVersionResolver() { + String releaseTrain = getReleaseTrain().getOrNull(); + return (releaseTrain != null) + ? new ReleaseTrainVersionResolver(createGitHub("bomr.github.release-train-token"), releaseTrain) + : super.getVersionResolver(); + } + } diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeDependencies.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeDependencies.java index 106f281b379..eae7e603d3e 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeDependencies.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeDependencies.java @@ -43,6 +43,7 @@ import org.gradle.api.internal.tasks.userinput.UserInputHandler; import org.gradle.api.provider.ListProperty; import org.gradle.api.provider.Property; import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.Internal; import org.gradle.api.tasks.Optional; import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.TaskExecutionException; @@ -215,7 +216,7 @@ public abstract class UpgradeDependencies extends DefaultTask { return issueLabels; } - private GitHub createGitHub(String passwordProperty) { + protected GitHub createGitHub(String passwordProperty) { Properties bomrProperties = new Properties(); try (Reader reader = new FileReader(new File(System.getProperty("user.home"), ".bomr.properties"))) { bomrProperties.load(reader); @@ -268,11 +269,9 @@ public abstract class UpgradeDependencies extends DefaultTask { return new MultithreadedLibraryUpdateResolver(getThreads().get(), libraryResolver); } - private VersionResolver getVersionResolver() { - String releaseTrain = getReleaseTrain().getOrNull(); - return (releaseTrain != null) - ? new ReleaseTrainVersionResolver(createGitHub("bomr.github.release-train-token"), releaseTrain) - : new MavenMetadataVersionResolver(getRepositories()); + @Internal + protected VersionResolver getVersionResolver() { + return new MavenMetadataVersionResolver(getRepositories()); } private Collection getRepositories() {