From cc0aa831da618ffb83215353047cc685497f2493 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 10 Jul 2025 11:37:13 +0100 Subject: [PATCH] Add support for per-library upgrade policies Closes gh-46369 --- .../boot/build/bom/BomExtension.java | 12 +++++++++--- .../boot/build/bom/Library.java | 19 +++++++++++++++---- .../build/bom/bomr/UpgradeDependencies.java | 7 ++++++- .../antora/AntoraAsciidocAttributesTests.java | 2 +- .../boot/build/bom/LibraryTests.java | 4 ++-- .../bomr/InteractiveUpgradeResolverTests.java | 2 +- .../bom/bomr/UpgradeApplicatorTests.java | 10 ++++++---- .../boot/build/bom/bomr/UpgradeTests.java | 4 ++-- 8 files changed, 42 insertions(+), 18 deletions(-) diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/BomExtension.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/BomExtension.java index 0d7c4eb3243..aa2ab0cb369 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/BomExtension.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/BomExtension.java @@ -111,9 +111,9 @@ public class BomExtension { action.execute(libraryHandler); LibraryVersion libraryVersion = new LibraryVersion(DependencyVersion.parse(libraryHandler.version)); addLibrary(new Library(name, libraryHandler.calendarName, libraryVersion, libraryHandler.groups, - libraryHandler.prohibitedVersions, libraryHandler.considerSnapshots, versionAlignment(libraryHandler), - libraryHandler.alignWith.dependencyManagementDeclaredIn, libraryHandler.linkRootName, - libraryHandler.links)); + libraryHandler.upgradePolicy, libraryHandler.prohibitedVersions, libraryHandler.considerSnapshots, + versionAlignment(libraryHandler), libraryHandler.alignWith.dependencyManagementDeclaredIn, + libraryHandler.linkRootName, libraryHandler.links)); } private VersionAlignment versionAlignment(LibraryHandler libraryHandler) { @@ -196,6 +196,8 @@ public class BomExtension { private final List groups = new ArrayList<>(); + private UpgradePolicy upgradePolicy; + private final List prohibitedVersions = new ArrayList<>(); private final AlignWithHandler alignWith; @@ -236,6 +238,10 @@ public class BomExtension { .add(new Group(groupHandler.id, groupHandler.modules, groupHandler.plugins, groupHandler.imports)); } + public void setUpgradePolicy(UpgradePolicy upgradePolicy) { + this.upgradePolicy = upgradePolicy; + } + public void prohibit(Action action) { ProhibitedHandler handler = new ProhibitedHandler(); action.execute(handler); diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java index 287b934fd03..314e483742a 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java @@ -66,6 +66,8 @@ public class Library { private final String versionProperty; + private final UpgradePolicy upgradePolicy; + private final List prohibitedVersions; private final boolean considerSnapshots; @@ -86,6 +88,8 @@ public class Library { * be {@code null} in which case the {@code name} is used. * @param version version of the library * @param groups groups in the library + * @param upgradePolicy the upgrade policy of the library, or {@code null} to use the + * containing bom's policy * @param prohibitedVersions version of the library that are prohibited * @param considerSnapshots whether to consider snapshots * @param versionAlignment version alignment, if any, for the library @@ -96,14 +100,16 @@ public class Library { * @param links a list of HTTP links relevant to the library */ public Library(String name, String calendarName, LibraryVersion version, List groups, - List prohibitedVersions, boolean considerSnapshots, VersionAlignment versionAlignment, - String alignsWithBom, String linkRootName, Map> links) { + UpgradePolicy upgradePolicy, List prohibitedVersions, boolean considerSnapshots, + VersionAlignment versionAlignment, String alignsWithBom, String linkRootName, + Map> links) { this.name = name; this.calendarName = (calendarName != null) ? calendarName : name; this.version = version; this.groups = groups; this.versionProperty = "Spring Boot".equals(name) ? null : name.toLowerCase(Locale.ENGLISH).replace(' ', '-') + ".version"; + this.upgradePolicy = upgradePolicy; this.prohibitedVersions = prohibitedVersions; this.considerSnapshots = considerSnapshots; this.versionAlignment = versionAlignment; @@ -136,6 +142,10 @@ public class Library { return this.versionProperty; } + public UpgradePolicy getUpgradePolicy() { + return this.upgradePolicy; + } + public List getProhibitedVersions() { return this.prohibitedVersions; } @@ -180,8 +190,9 @@ public class Library { } public Library withVersion(LibraryVersion version) { - return new Library(this.name, this.calendarName, version, this.groups, this.prohibitedVersions, - this.considerSnapshots, this.versionAlignment, this.alignsWithBom, this.linkRootName, this.links); + return new Library(this.name, this.calendarName, version, this.groups, this.upgradePolicy, + this.prohibitedVersions, this.considerSnapshots, this.versionAlignment, this.alignsWithBom, + this.linkRootName, this.links); } /** 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 1b509c9e3af..6e73e262cbf 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 @@ -48,6 +48,7 @@ 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.UpgradePolicy; 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; @@ -255,7 +256,11 @@ public abstract class UpgradeDependencies extends DefaultTask { } private boolean compliesWithUpgradePolicy(Library library, DependencyVersion candidate) { - return this.bom.getUpgrade().getPolicy().test(candidate, library.getVersion().getVersion()); + UpgradePolicy upgradePolicy = library.getUpgradePolicy(); + if (upgradePolicy == null) { + upgradePolicy = this.bom.getUpgrade().getPolicy(); + } + return upgradePolicy.test(candidate, library.getVersion().getVersion()); } private boolean isAnUpgrade(Library library, DependencyVersion candidate) { diff --git a/buildSrc/src/test/java/org/springframework/boot/build/antora/AntoraAsciidocAttributesTests.java b/buildSrc/src/test/java/org/springframework/boot/build/antora/AntoraAsciidocAttributesTests.java index 69fd80b22be..51b89c5b88f 100644 --- a/buildSrc/src/test/java/org/springframework/boot/build/antora/AntoraAsciidocAttributesTests.java +++ b/buildSrc/src/test/java/org/springframework/boot/build/antora/AntoraAsciidocAttributesTests.java @@ -237,7 +237,7 @@ class AntoraAsciidocAttributesTests { VersionAlignment versionAlignment = null; String alignsWithBom = null; String linkRootName = null; - Library library = new Library(name, calendarName, version, groups, prohibitedVersion, considerSnapshots, + Library library = new Library(name, calendarName, version, groups, null, prohibitedVersion, considerSnapshots, versionAlignment, alignsWithBom, linkRootName, links); return library; } diff --git a/buildSrc/src/test/java/org/springframework/boot/build/bom/LibraryTests.java b/buildSrc/src/test/java/org/springframework/boot/build/bom/LibraryTests.java index 15bc04fc889..85750195992 100644 --- a/buildSrc/src/test/java/org/springframework/boot/build/bom/LibraryTests.java +++ b/buildSrc/src/test/java/org/springframework/boot/build/bom/LibraryTests.java @@ -50,7 +50,7 @@ class LibraryTests { String alignsWithBom = null; String linkRootName = null; Map> links = Collections.emptyMap(); - Library library = new Library(name, calendarName, version, groups, prohibitedVersion, considerSnapshots, + Library library = new Library(name, calendarName, version, groups, null, prohibitedVersion, considerSnapshots, versionAlignment, alignsWithBom, linkRootName, links); assertThat(library.getLinkRootName()).isEqualTo("spring-framework"); } @@ -67,7 +67,7 @@ class LibraryTests { String alignsWithBom = null; String linkRootName = "spring-data"; Map> links = Collections.emptyMap(); - Library library = new Library(name, calendarName, version, groups, prohibitedVersion, considerSnapshots, + Library library = new Library(name, calendarName, version, groups, null, prohibitedVersion, considerSnapshots, versionAlignment, alignsWithBom, linkRootName, links); assertThat(library.getLinkRootName()).isEqualTo("spring-data"); } diff --git a/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/InteractiveUpgradeResolverTests.java b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/InteractiveUpgradeResolverTests.java index 72ac70f5a23..cc9726bf028 100644 --- a/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/InteractiveUpgradeResolverTests.java +++ b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/InteractiveUpgradeResolverTests.java @@ -48,7 +48,7 @@ class InteractiveUpgradeResolverTests { List libraries = new ArrayList<>(); DependencyVersion version = DependencyVersion.parse("1.0.0"); LibraryVersion libraryVersion = new LibraryVersion(version); - Library library = new Library("test", null, libraryVersion, null, null, false, null, null, null, null); + Library library = new Library("test", null, libraryVersion, null, null, null, false, null, null, null, null); libraries.add(library); List librariesToUpgrade = new ArrayList<>(); librariesToUpgrade.add(library); diff --git a/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/UpgradeApplicatorTests.java b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/UpgradeApplicatorTests.java index 077c9aee707..8ddb1fa0e7b 100644 --- a/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/UpgradeApplicatorTests.java +++ b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/UpgradeApplicatorTests.java @@ -55,7 +55,7 @@ class UpgradeApplicatorTests { new UpgradeApplicator(bom.toPath(), gradleProperties.toPath()).apply( new Upgrade( new Library("ActiveMQ", null, new LibraryVersion(DependencyVersion.parse("5.15.11")), null, - null, false, null, null, null, Collections.emptyMap()), + null, null, false, null, null, null, Collections.emptyMap()), DependencyVersion.parse("5.16"))); String bomContents = Files.readString(bom.toPath()); assertThat(bomContents).hasSize(originalContents.length() - 3); @@ -67,9 +67,11 @@ class UpgradeApplicatorTests { FileCopyUtils.copy(new File("src/test/resources/bom.gradle"), bom); File gradleProperties = new File(this.temp, "gradle.properties"); FileCopyUtils.copy(new File("src/test/resources/gradle.properties"), gradleProperties); - new UpgradeApplicator(bom.toPath(), gradleProperties.toPath()) - .apply(new Upgrade(new Library("Kotlin", null, new LibraryVersion(DependencyVersion.parse("1.3.70")), null, - null, false, null, null, null, Collections.emptyMap()), DependencyVersion.parse("1.4"))); + new UpgradeApplicator(bom.toPath(), gradleProperties.toPath()).apply( + new Upgrade( + new Library("Kotlin", null, new LibraryVersion(DependencyVersion.parse("1.3.70")), null, null, + null, false, null, null, null, Collections.emptyMap()), + DependencyVersion.parse("1.4"))); Properties properties = new Properties(); try (InputStream in = new FileInputStream(gradleProperties)) { properties.load(in); diff --git a/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/UpgradeTests.java b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/UpgradeTests.java index 50f868f6996..71dc18ce41c 100644 --- a/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/UpgradeTests.java +++ b/buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/UpgradeTests.java @@ -33,7 +33,7 @@ class UpgradeTests { @Test void createToRelease() { - Library from = new Library("Test", null, new LibraryVersion(DependencyVersion.parse("1.0.0")), null, null, + Library from = new Library("Test", null, new LibraryVersion(DependencyVersion.parse("1.0.0")), null, null, null, false, null, null, null, null); Upgrade upgrade = new Upgrade(from, DependencyVersion.parse("1.0.1")); assertThat(upgrade.from().getNameAndVersion()).isEqualTo("Test 1.0.0"); @@ -43,7 +43,7 @@ class UpgradeTests { @Test void createToSnapshot() { - Library from = new Library("Test", null, new LibraryVersion(DependencyVersion.parse("1.0.0")), null, null, + Library from = new Library("Test", null, new LibraryVersion(DependencyVersion.parse("1.0.0")), null, null, null, false, null, null, null, null); Upgrade upgrade = new Upgrade(from, DependencyVersion.parse("1.0.1-SNAPSHOT")); assertThat(upgrade.from().getNameAndVersion()).isEqualTo("Test 1.0.0");