From c8afa398f1bc62f3982d168a8fb54456df07e59e Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 3 Feb 2025 11:35:40 +0000 Subject: [PATCH] Improve issues and commit messages for moving to non-patch snapshots Closes gh-43045 --- .../bom/bomr/InteractiveUpgradeResolver.java | 2 +- .../boot/build/bom/bomr/MoveToSnapshots.java | 40 +++++++++++-------- .../bomr/StandardLibraryUpdateResolver.java | 29 ++++++++------ .../boot/build/bom/bomr/Upgrade.java | 15 +------ .../build/bom/bomr/UpgradeDependencies.java | 15 +++++-- .../boot/build/bom/bomr/VersionOption.java | 28 +++++++++++++ .../bom/bomr/UpgradeApplicatorTests.java | 14 +++---- .../boot/build/bom/bomr/UpgradeTests.java | 8 ++-- 8 files changed, 94 insertions(+), 57 deletions(-) diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/InteractiveUpgradeResolver.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/InteractiveUpgradeResolver.java index ac6515749f57..1148a773de60 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/InteractiveUpgradeResolver.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/InteractiveUpgradeResolver.java @@ -71,7 +71,7 @@ private Upgrade resolveUpgrade(LibraryWithVersionOptions libraryWithVersionOptio } VersionOption defaultOption = new VersionOption(library.getVersion().getVersion()); VersionOption selected = selectOption(defaultOption, library, versionOptions); - return (selected.equals(defaultOption)) ? null : new Upgrade(library, selected.getVersion()); + return (selected.equals(defaultOption)) ? null : selected.upgrade(library); } private VersionOption selectOption(VersionOption defaultOption, Library library, 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 a4147a74ee52..cecc5394be37 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 @@ -19,7 +19,7 @@ import java.time.OffsetDateTime; import java.util.List; import java.util.Map; -import java.util.function.BiPredicate; +import java.util.function.BiFunction; import javax.inject.Inject; @@ -77,27 +77,35 @@ protected boolean eligible(Library library) { } @Override - protected List> determineUpdatePredicates(Milestone milestone) { + protected BiFunction createVersionOptionResolver(Milestone milestone) { return switch (this.buildType) { - case OPEN_SOURCE -> determineOpenSourceUpdatePredicates(milestone); - case COMMERCIAL -> super.determineUpdatePredicates(milestone); + case OPEN_SOURCE -> createOpenSourceVersionOptionResolver(milestone); + case COMMERCIAL -> super.createVersionOptionResolver(milestone); }; } - private List> determineOpenSourceUpdatePredicates(Milestone milestone) { + private BiFunction createOpenSourceVersionOptionResolver( + Milestone milestone) { Map> scheduledReleases = getScheduledOpenSourceReleases(milestone); - List> predicates = super.determineUpdatePredicates(milestone); - predicates.add((library, candidate) -> { - List releases = scheduledReleases.get(library.getCalendarName()); - boolean match = (releases != null) - && releases.stream().anyMatch((release) -> candidate.isSnapshotFor(release.getVersion())); - if (logger.isInfoEnabled() && !match) { - logger.info("Ignoring {}. No release of {} scheduled before {}", candidate, library.getName(), - milestone.getDueOn()); + BiFunction resolver = super.createVersionOptionResolver(milestone); + return (library, dependencyVersion) -> { + VersionOption versionOption = resolver.apply(library, dependencyVersion); + if (versionOption != null) { + List releases = scheduledReleases.get(library.getCalendarName()); + List matches = releases.stream() + .filter((release) -> dependencyVersion.isSnapshotFor(release.getVersion())) + .toList(); + if (matches.isEmpty()) { + if (logger.isInfoEnabled()) { + logger.info("Ignoring {}. No release of {} scheduled before {}", dependencyVersion, + library.getName(), milestone.getDueOn()); + } + return null; + } + return new VersionOption.SnapshotVersionOption(versionOption.getVersion(), matches.get(0).getVersion()); } - return match; - }); - return predicates; + return versionOption; + }; } private Map> getScheduledOpenSourceReleases(Milestone milestone) { diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/StandardLibraryUpdateResolver.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/StandardLibraryUpdateResolver.java index 78fde9f147b3..e6812e95095e 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/StandardLibraryUpdateResolver.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/StandardLibraryUpdateResolver.java @@ -24,7 +24,7 @@ import java.util.Map; import java.util.Set; import java.util.SortedSet; -import java.util.function.BiPredicate; +import java.util.function.BiFunction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,13 +46,12 @@ class StandardLibraryUpdateResolver implements LibraryUpdateResolver { private final VersionResolver versionResolver; - private final BiPredicate predicate; + private final BiFunction versionOptionResolver; StandardLibraryUpdateResolver(VersionResolver versionResolver, - List> predicates) { + BiFunction versionOptionResolver) { this.versionResolver = versionResolver; - this.predicate = (library, dependencyVersion) -> predicates.stream() - .allMatch((predicate) -> predicate.test(library, dependencyVersion)); + this.versionOptionResolver = versionOptionResolver; } @Override @@ -111,14 +110,18 @@ private List determineResolvedVersionOptions(Library library) { getLaterVersionsForModule(group.getId(), plugin, library)); } } - return moduleVersions.values() - .stream() - .flatMap(SortedSet::stream) - .distinct() - .filter((dependencyVersion) -> this.predicate.test(library, dependencyVersion)) - .map((version) -> (VersionOption) new VersionOption.ResolvedVersionOption(version, - getMissingModules(moduleVersions, version))) - .toList(); + List versionOptions = new ArrayList<>(); + moduleVersions.values().stream().flatMap(SortedSet::stream).distinct().forEach((dependencyVersion) -> { + VersionOption versionOption = this.versionOptionResolver.apply(library, dependencyVersion); + if (versionOption != null) { + List missingModules = getMissingModules(moduleVersions, dependencyVersion); + if (!missingModules.isEmpty()) { + versionOption = new VersionOption.ResolvedVersionOption(versionOption.getVersion(), missingModules); + } + versionOptions.add(versionOption); + } + }); + return versionOptions; } private List getMissingModules(Map> moduleVersions, diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/Upgrade.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/Upgrade.java index 4ce6a8cfbefd..565dd53a8c46 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/Upgrade.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/Upgrade.java @@ -17,8 +17,6 @@ package org.springframework.boot.build.bom.bomr; import org.springframework.boot.build.bom.Library; -import org.springframework.boot.build.bom.Library.LibraryVersion; -import org.springframework.boot.build.bom.bomr.version.DependencyVersion; /** * An upgrade to change a {@link Library} to use a new version. @@ -31,19 +29,8 @@ */ record Upgrade(Library from, Library to, Library toRelease) { - Upgrade(Library from, DependencyVersion to) { - this(from, from.withVersion(new LibraryVersion(to))); - } - Upgrade(Library from, Library to) { - this(from, to, withReleaseVersion(to)); - } - - private static Library withReleaseVersion(Library to) { - String version = to.getVersion().toString(); - version = version.replace(".BUILD-SNAPSHOT", ""); - version = version.replace("-SNAPSHOT", ""); - return to.withVersion(new LibraryVersion(DependencyVersion.parse(version))); + this(from, to, to); } } 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 713a6b51e0de..96cc439d0c63 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 @@ -24,9 +24,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Properties; import java.util.Set; +import java.util.function.BiFunction; import java.util.function.BiPredicate; import java.util.function.Predicate; import java.util.regex.Pattern; @@ -231,7 +233,7 @@ private List resolveUpgrades(Milestone milestone) { private LibraryUpdateResolver getLibraryUpdateResolver(Milestone milestone) { VersionResolver versionResolver = new MavenMetadataVersionResolver(getRepositories()); LibraryUpdateResolver libraryResolver = new StandardLibraryUpdateResolver(versionResolver, - determineUpdatePredicates(milestone)); + createVersionOptionResolver(milestone)); return new MultithreadedLibraryUpdateResolver(getThreads().get(), libraryResolver); } @@ -246,12 +248,19 @@ private List asRepositories(List repositoryName .toList(); } - protected List> determineUpdatePredicates(Milestone milestone) { + protected BiFunction createVersionOptionResolver(Milestone milestone) { List> updatePredicates = new ArrayList<>(); updatePredicates.add(this::compliesWithUpgradePolicy); updatePredicates.add(this::isAnUpgrade); updatePredicates.add(this::isNotProhibited); - return updatePredicates; + return (library, dependencyVersion) -> { + if (this.compliesWithUpgradePolicy(library, dependencyVersion) + && this.isAnUpgrade(library, dependencyVersion) + && this.isNotProhibited(library, dependencyVersion)) { + return new VersionOption.ResolvedVersionOption(dependencyVersion, Collections.emptyList()); + } + return null; + }; } private boolean compliesWithUpgradePolicy(Library library, DependencyVersion candidate) { diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/VersionOption.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/VersionOption.java index d1d33fd82389..39f1443ff761 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/VersionOption.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/VersionOption.java @@ -18,6 +18,8 @@ import java.util.List; +import org.springframework.boot.build.bom.Library; +import org.springframework.boot.build.bom.Library.LibraryVersion; import org.springframework.boot.build.bom.Library.VersionAlignment; import org.springframework.boot.build.bom.bomr.version.DependencyVersion; import org.springframework.util.StringUtils; @@ -44,6 +46,10 @@ public String toString() { return this.version.toString(); } + Upgrade upgrade(Library library) { + return new Upgrade(library, library.withVersion(new LibraryVersion(this.version))); + } + static final class AlignedVersionOption extends VersionOption { private final VersionAlignment alignedWith; @@ -80,4 +86,26 @@ public String toString() { } + static final class SnapshotVersionOption extends VersionOption { + + private final DependencyVersion releaseVersion; + + SnapshotVersionOption(DependencyVersion version, DependencyVersion releaseVersion) { + super(version); + this.releaseVersion = releaseVersion; + } + + @Override + public String toString() { + return super.toString() + " (for " + this.releaseVersion + ")"; + } + + @Override + Upgrade upgrade(Library library) { + return new Upgrade(library, library.withVersion(new LibraryVersion(super.version)), + library.withVersion(new LibraryVersion(this.releaseVersion))); + } + + } + } 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 b83742ad3691..e1ec54c1d3d4 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 @@ -52,11 +52,10 @@ void whenUpgradeIsAppliedToLibraryWithVersionThenBomIsUpdated() throws IOExcepti String originalContents = Files.readString(bom.toPath()); 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("ActiveMQ", null, new LibraryVersion(DependencyVersion.parse("5.15.11")), null, - null, false, null, null, null, Collections.emptyMap()), - DependencyVersion.parse("5.16"))); + Library activeMq = new Library("ActiveMQ", null, new LibraryVersion(DependencyVersion.parse("5.15.11")), null, + null, false, null, null, null, Collections.emptyMap()); + new UpgradeApplicator(bom.toPath(), gradleProperties.toPath()) + .apply(new Upgrade(activeMq, activeMq.withVersion(new LibraryVersion(DependencyVersion.parse("5.16"))))); String bomContents = Files.readString(bom.toPath()); assertThat(bomContents).hasSize(originalContents.length() - 3); } @@ -67,9 +66,10 @@ void whenUpgradeIsAppliedToLibraryWithVersionPropertyThenGradlePropertiesIsUpdat 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); + Library kotlin = new Library("Kotlin", null, new LibraryVersion(DependencyVersion.parse("1.3.70")), null, null, + false, null, null, null, Collections.emptyMap()); 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"))); + .apply(new Upgrade(kotlin, kotlin.withVersion(new LibraryVersion(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 ee7a0c3e9b47..245589a9c593 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 @@ -1,5 +1,5 @@ /* - * Copyright 2024-2024 the original author or authors. + * Copyright 2024-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,7 +35,7 @@ class UpgradeTests { void createToRelease() { Library from = new Library("Test", null, new LibraryVersion(DependencyVersion.parse("1.0.0")), null, null, false, null, null, null, null); - Upgrade upgrade = new Upgrade(from, DependencyVersion.parse("1.0.1")); + Upgrade upgrade = new Upgrade(from, from.withVersion(new LibraryVersion(DependencyVersion.parse("1.0.1")))); assertThat(upgrade.from().getNameAndVersion()).isEqualTo("Test 1.0.0"); assertThat(upgrade.to().getNameAndVersion()).isEqualTo("Test 1.0.1"); assertThat(upgrade.toRelease().getNameAndVersion()).isEqualTo("Test 1.0.1"); @@ -45,7 +45,9 @@ void createToRelease() { void createToSnapshot() { Library from = new Library("Test", null, new LibraryVersion(DependencyVersion.parse("1.0.0")), null, null, false, null, null, null, null); - Upgrade upgrade = new Upgrade(from, DependencyVersion.parse("1.0.1-SNAPSHOT")); + Upgrade upgrade = new Upgrade(from, + from.withVersion(new LibraryVersion(DependencyVersion.parse("1.0.1-SNAPSHOT"))), + from.withVersion(new LibraryVersion(DependencyVersion.parse("1.0.1")))); assertThat(upgrade.from().getNameAndVersion()).isEqualTo("Test 1.0.0"); assertThat(upgrade.to().getNameAndVersion()).isEqualTo("Test 1.0.1-SNAPSHOT"); assertThat(upgrade.toRelease().getNameAndVersion()).isEqualTo("Test 1.0.1");