Skip to content

Commit c8afa39

Browse files
committed
Improve issues and commit messages for moving to non-patch snapshots
Closes gh-43045
1 parent e207e7c commit c8afa39

File tree

8 files changed

+94
-57
lines changed

8 files changed

+94
-57
lines changed

buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/InteractiveUpgradeResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ private Upgrade resolveUpgrade(LibraryWithVersionOptions libraryWithVersionOptio
7171
}
7272
VersionOption defaultOption = new VersionOption(library.getVersion().getVersion());
7373
VersionOption selected = selectOption(defaultOption, library, versionOptions);
74-
return (selected.equals(defaultOption)) ? null : new Upgrade(library, selected.getVersion());
74+
return (selected.equals(defaultOption)) ? null : selected.upgrade(library);
7575
}
7676

7777
private VersionOption selectOption(VersionOption defaultOption, Library library,

buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/MoveToSnapshots.java

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import java.time.OffsetDateTime;
2020
import java.util.List;
2121
import java.util.Map;
22-
import java.util.function.BiPredicate;
22+
import java.util.function.BiFunction;
2323

2424
import javax.inject.Inject;
2525

@@ -77,27 +77,35 @@ protected boolean eligible(Library library) {
7777
}
7878

7979
@Override
80-
protected List<BiPredicate<Library, DependencyVersion>> determineUpdatePredicates(Milestone milestone) {
80+
protected BiFunction<Library, DependencyVersion, VersionOption> createVersionOptionResolver(Milestone milestone) {
8181
return switch (this.buildType) {
82-
case OPEN_SOURCE -> determineOpenSourceUpdatePredicates(milestone);
83-
case COMMERCIAL -> super.determineUpdatePredicates(milestone);
82+
case OPEN_SOURCE -> createOpenSourceVersionOptionResolver(milestone);
83+
case COMMERCIAL -> super.createVersionOptionResolver(milestone);
8484
};
8585
}
8686

87-
private List<BiPredicate<Library, DependencyVersion>> determineOpenSourceUpdatePredicates(Milestone milestone) {
87+
private BiFunction<Library, DependencyVersion, VersionOption> createOpenSourceVersionOptionResolver(
88+
Milestone milestone) {
8889
Map<String, List<Release>> scheduledReleases = getScheduledOpenSourceReleases(milestone);
89-
List<BiPredicate<Library, DependencyVersion>> predicates = super.determineUpdatePredicates(milestone);
90-
predicates.add((library, candidate) -> {
91-
List<Release> releases = scheduledReleases.get(library.getCalendarName());
92-
boolean match = (releases != null)
93-
&& releases.stream().anyMatch((release) -> candidate.isSnapshotFor(release.getVersion()));
94-
if (logger.isInfoEnabled() && !match) {
95-
logger.info("Ignoring {}. No release of {} scheduled before {}", candidate, library.getName(),
96-
milestone.getDueOn());
90+
BiFunction<Library, DependencyVersion, VersionOption> resolver = super.createVersionOptionResolver(milestone);
91+
return (library, dependencyVersion) -> {
92+
VersionOption versionOption = resolver.apply(library, dependencyVersion);
93+
if (versionOption != null) {
94+
List<Release> releases = scheduledReleases.get(library.getCalendarName());
95+
List<Release> matches = releases.stream()
96+
.filter((release) -> dependencyVersion.isSnapshotFor(release.getVersion()))
97+
.toList();
98+
if (matches.isEmpty()) {
99+
if (logger.isInfoEnabled()) {
100+
logger.info("Ignoring {}. No release of {} scheduled before {}", dependencyVersion,
101+
library.getName(), milestone.getDueOn());
102+
}
103+
return null;
104+
}
105+
return new VersionOption.SnapshotVersionOption(versionOption.getVersion(), matches.get(0).getVersion());
97106
}
98-
return match;
99-
});
100-
return predicates;
107+
return versionOption;
108+
};
101109
}
102110

103111
private Map<String, List<Release>> getScheduledOpenSourceReleases(Milestone milestone) {

buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/StandardLibraryUpdateResolver.java

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import java.util.Map;
2525
import java.util.Set;
2626
import java.util.SortedSet;
27-
import java.util.function.BiPredicate;
27+
import java.util.function.BiFunction;
2828

2929
import org.slf4j.Logger;
3030
import org.slf4j.LoggerFactory;
@@ -46,13 +46,12 @@ class StandardLibraryUpdateResolver implements LibraryUpdateResolver {
4646

4747
private final VersionResolver versionResolver;
4848

49-
private final BiPredicate<Library, DependencyVersion> predicate;
49+
private final BiFunction<Library, DependencyVersion, VersionOption> versionOptionResolver;
5050

5151
StandardLibraryUpdateResolver(VersionResolver versionResolver,
52-
List<BiPredicate<Library, DependencyVersion>> predicates) {
52+
BiFunction<Library, DependencyVersion, VersionOption> versionOptionResolver) {
5353
this.versionResolver = versionResolver;
54-
this.predicate = (library, dependencyVersion) -> predicates.stream()
55-
.allMatch((predicate) -> predicate.test(library, dependencyVersion));
54+
this.versionOptionResolver = versionOptionResolver;
5655
}
5756

5857
@Override
@@ -111,14 +110,18 @@ private List<VersionOption> determineResolvedVersionOptions(Library library) {
111110
getLaterVersionsForModule(group.getId(), plugin, library));
112111
}
113112
}
114-
return moduleVersions.values()
115-
.stream()
116-
.flatMap(SortedSet::stream)
117-
.distinct()
118-
.filter((dependencyVersion) -> this.predicate.test(library, dependencyVersion))
119-
.map((version) -> (VersionOption) new VersionOption.ResolvedVersionOption(version,
120-
getMissingModules(moduleVersions, version)))
121-
.toList();
113+
List<VersionOption> versionOptions = new ArrayList<>();
114+
moduleVersions.values().stream().flatMap(SortedSet::stream).distinct().forEach((dependencyVersion) -> {
115+
VersionOption versionOption = this.versionOptionResolver.apply(library, dependencyVersion);
116+
if (versionOption != null) {
117+
List<String> missingModules = getMissingModules(moduleVersions, dependencyVersion);
118+
if (!missingModules.isEmpty()) {
119+
versionOption = new VersionOption.ResolvedVersionOption(versionOption.getVersion(), missingModules);
120+
}
121+
versionOptions.add(versionOption);
122+
}
123+
});
124+
return versionOptions;
122125
}
123126

124127
private List<String> getMissingModules(Map<String, SortedSet<DependencyVersion>> moduleVersions,

buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/Upgrade.java

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717
package org.springframework.boot.build.bom.bomr;
1818

1919
import org.springframework.boot.build.bom.Library;
20-
import org.springframework.boot.build.bom.Library.LibraryVersion;
21-
import org.springframework.boot.build.bom.bomr.version.DependencyVersion;
2220

2321
/**
2422
* An upgrade to change a {@link Library} to use a new version.
@@ -31,19 +29,8 @@
3129
*/
3230
record Upgrade(Library from, Library to, Library toRelease) {
3331

34-
Upgrade(Library from, DependencyVersion to) {
35-
this(from, from.withVersion(new LibraryVersion(to)));
36-
}
37-
3832
Upgrade(Library from, Library to) {
39-
this(from, to, withReleaseVersion(to));
40-
}
41-
42-
private static Library withReleaseVersion(Library to) {
43-
String version = to.getVersion().toString();
44-
version = version.replace(".BUILD-SNAPSHOT", "");
45-
version = version.replace("-SNAPSHOT", "");
46-
return to.withVersion(new LibraryVersion(DependencyVersion.parse(version)));
33+
this(from, to, to);
4734
}
4835

4936
}

buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/UpgradeDependencies.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@
2424
import java.util.ArrayList;
2525
import java.util.Arrays;
2626
import java.util.Collection;
27+
import java.util.Collections;
2728
import java.util.List;
2829
import java.util.Properties;
2930
import java.util.Set;
31+
import java.util.function.BiFunction;
3032
import java.util.function.BiPredicate;
3133
import java.util.function.Predicate;
3234
import java.util.regex.Pattern;
@@ -231,7 +233,7 @@ private List<Upgrade> resolveUpgrades(Milestone milestone) {
231233
private LibraryUpdateResolver getLibraryUpdateResolver(Milestone milestone) {
232234
VersionResolver versionResolver = new MavenMetadataVersionResolver(getRepositories());
233235
LibraryUpdateResolver libraryResolver = new StandardLibraryUpdateResolver(versionResolver,
234-
determineUpdatePredicates(milestone));
236+
createVersionOptionResolver(milestone));
235237
return new MultithreadedLibraryUpdateResolver(getThreads().get(), libraryResolver);
236238
}
237239

@@ -246,12 +248,19 @@ private List<MavenArtifactRepository> asRepositories(List<String> repositoryName
246248
.toList();
247249
}
248250

249-
protected List<BiPredicate<Library, DependencyVersion>> determineUpdatePredicates(Milestone milestone) {
251+
protected BiFunction<Library, DependencyVersion, VersionOption> createVersionOptionResolver(Milestone milestone) {
250252
List<BiPredicate<Library, DependencyVersion>> updatePredicates = new ArrayList<>();
251253
updatePredicates.add(this::compliesWithUpgradePolicy);
252254
updatePredicates.add(this::isAnUpgrade);
253255
updatePredicates.add(this::isNotProhibited);
254-
return updatePredicates;
256+
return (library, dependencyVersion) -> {
257+
if (this.compliesWithUpgradePolicy(library, dependencyVersion)
258+
&& this.isAnUpgrade(library, dependencyVersion)
259+
&& this.isNotProhibited(library, dependencyVersion)) {
260+
return new VersionOption.ResolvedVersionOption(dependencyVersion, Collections.emptyList());
261+
}
262+
return null;
263+
};
255264
}
256265

257266
private boolean compliesWithUpgradePolicy(Library library, DependencyVersion candidate) {

buildSrc/src/main/java/org/springframework/boot/build/bom/bomr/VersionOption.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import java.util.List;
2020

21+
import org.springframework.boot.build.bom.Library;
22+
import org.springframework.boot.build.bom.Library.LibraryVersion;
2123
import org.springframework.boot.build.bom.Library.VersionAlignment;
2224
import org.springframework.boot.build.bom.bomr.version.DependencyVersion;
2325
import org.springframework.util.StringUtils;
@@ -44,6 +46,10 @@ public String toString() {
4446
return this.version.toString();
4547
}
4648

49+
Upgrade upgrade(Library library) {
50+
return new Upgrade(library, library.withVersion(new LibraryVersion(this.version)));
51+
}
52+
4753
static final class AlignedVersionOption extends VersionOption {
4854

4955
private final VersionAlignment alignedWith;
@@ -80,4 +86,26 @@ public String toString() {
8086

8187
}
8288

89+
static final class SnapshotVersionOption extends VersionOption {
90+
91+
private final DependencyVersion releaseVersion;
92+
93+
SnapshotVersionOption(DependencyVersion version, DependencyVersion releaseVersion) {
94+
super(version);
95+
this.releaseVersion = releaseVersion;
96+
}
97+
98+
@Override
99+
public String toString() {
100+
return super.toString() + " (for " + this.releaseVersion + ")";
101+
}
102+
103+
@Override
104+
Upgrade upgrade(Library library) {
105+
return new Upgrade(library, library.withVersion(new LibraryVersion(super.version)),
106+
library.withVersion(new LibraryVersion(this.releaseVersion)));
107+
}
108+
109+
}
110+
83111
}

buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/UpgradeApplicatorTests.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,10 @@ void whenUpgradeIsAppliedToLibraryWithVersionThenBomIsUpdated() throws IOExcepti
5252
String originalContents = Files.readString(bom.toPath());
5353
File gradleProperties = new File(this.temp, "gradle.properties");
5454
FileCopyUtils.copy(new File("src/test/resources/gradle.properties"), gradleProperties);
55-
new UpgradeApplicator(bom.toPath(), gradleProperties.toPath()).apply(
56-
new Upgrade(
57-
new Library("ActiveMQ", null, new LibraryVersion(DependencyVersion.parse("5.15.11")), null,
58-
null, false, null, null, null, Collections.emptyMap()),
59-
DependencyVersion.parse("5.16")));
55+
Library activeMq = new Library("ActiveMQ", null, new LibraryVersion(DependencyVersion.parse("5.15.11")), null,
56+
null, false, null, null, null, Collections.emptyMap());
57+
new UpgradeApplicator(bom.toPath(), gradleProperties.toPath())
58+
.apply(new Upgrade(activeMq, activeMq.withVersion(new LibraryVersion(DependencyVersion.parse("5.16")))));
6059
String bomContents = Files.readString(bom.toPath());
6160
assertThat(bomContents).hasSize(originalContents.length() - 3);
6261
}
@@ -67,9 +66,10 @@ void whenUpgradeIsAppliedToLibraryWithVersionPropertyThenGradlePropertiesIsUpdat
6766
FileCopyUtils.copy(new File("src/test/resources/bom.gradle"), bom);
6867
File gradleProperties = new File(this.temp, "gradle.properties");
6968
FileCopyUtils.copy(new File("src/test/resources/gradle.properties"), gradleProperties);
69+
Library kotlin = new Library("Kotlin", null, new LibraryVersion(DependencyVersion.parse("1.3.70")), null, null,
70+
false, null, null, null, Collections.emptyMap());
7071
new UpgradeApplicator(bom.toPath(), gradleProperties.toPath())
71-
.apply(new Upgrade(new Library("Kotlin", null, new LibraryVersion(DependencyVersion.parse("1.3.70")), null,
72-
null, false, null, null, null, Collections.emptyMap()), DependencyVersion.parse("1.4")));
72+
.apply(new Upgrade(kotlin, kotlin.withVersion(new LibraryVersion(DependencyVersion.parse("1.4")))));
7373
Properties properties = new Properties();
7474
try (InputStream in = new FileInputStream(gradleProperties)) {
7575
properties.load(in);

buildSrc/src/test/java/org/springframework/boot/build/bom/bomr/UpgradeTests.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2024-2024 the original author or authors.
2+
* Copyright 2024-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ class UpgradeTests {
3535
void createToRelease() {
3636
Library from = new Library("Test", null, new LibraryVersion(DependencyVersion.parse("1.0.0")), null, null,
3737
false, null, null, null, null);
38-
Upgrade upgrade = new Upgrade(from, DependencyVersion.parse("1.0.1"));
38+
Upgrade upgrade = new Upgrade(from, from.withVersion(new LibraryVersion(DependencyVersion.parse("1.0.1"))));
3939
assertThat(upgrade.from().getNameAndVersion()).isEqualTo("Test 1.0.0");
4040
assertThat(upgrade.to().getNameAndVersion()).isEqualTo("Test 1.0.1");
4141
assertThat(upgrade.toRelease().getNameAndVersion()).isEqualTo("Test 1.0.1");
@@ -45,7 +45,9 @@ void createToRelease() {
4545
void createToSnapshot() {
4646
Library from = new Library("Test", null, new LibraryVersion(DependencyVersion.parse("1.0.0")), null, null,
4747
false, null, null, null, null);
48-
Upgrade upgrade = new Upgrade(from, DependencyVersion.parse("1.0.1-SNAPSHOT"));
48+
Upgrade upgrade = new Upgrade(from,
49+
from.withVersion(new LibraryVersion(DependencyVersion.parse("1.0.1-SNAPSHOT"))),
50+
from.withVersion(new LibraryVersion(DependencyVersion.parse("1.0.1"))));
4951
assertThat(upgrade.from().getNameAndVersion()).isEqualTo("Test 1.0.0");
5052
assertThat(upgrade.to().getNameAndVersion()).isEqualTo("Test 1.0.1-SNAPSHOT");
5153
assertThat(upgrade.toRelease().getNameAndVersion()).isEqualTo("Test 1.0.1");

0 commit comments

Comments
 (0)