Skip to content

Commit 178305c

Browse files
committed
Add support for upgrading dependencies using release train versions
1 parent 6c19b31 commit 178305c

18 files changed

Lines changed: 251 additions & 80 deletions

buildSrc/src/main/java/org/springframework/boot/build/bom/BomExtension.java

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.HashMap;
2222
import java.util.LinkedHashMap;
2323
import java.util.List;
24+
import java.util.Locale;
2425
import java.util.Map;
2526
import java.util.function.Function;
2627
import java.util.function.Predicate;
@@ -44,6 +45,7 @@
4445
import org.springframework.boot.build.bom.Library.BomAlignment;
4546
import org.springframework.boot.build.bom.Library.DependencyVersionAlignment;
4647
import org.springframework.boot.build.bom.Library.Exclusion;
48+
import org.springframework.boot.build.bom.Library.FirstParty;
4749
import org.springframework.boot.build.bom.Library.Group;
4850
import org.springframework.boot.build.bom.Library.ImportedBom;
4951
import org.springframework.boot.build.bom.Library.LibraryVersion;
@@ -113,8 +115,14 @@ public void library(String name, String version, Action<LibraryHandler> action)
113115
(version != null) ? version : "");
114116
action.execute(libraryHandler);
115117
LibraryVersion libraryVersion = new LibraryVersion(DependencyVersion.parse(libraryHandler.version));
118+
FirstParty firstParty = null;
119+
if (libraryHandler.firstParty) {
120+
String releaseTrainId = (libraryHandler.releaseTrainId != null) ? libraryHandler.releaseTrainId
121+
: name.replace(' ', '-').toLowerCase(Locale.ROOT);
122+
firstParty = new FirstParty(releaseTrainId);
123+
}
116124
addLibrary(new Library(name, libraryHandler.calendarName, libraryVersion, libraryHandler.groups,
117-
libraryHandler.upgradePolicy, libraryHandler.prohibitedVersions, libraryHandler.considerSnapshots,
125+
libraryHandler.upgradePolicy, libraryHandler.prohibitedVersions, firstParty,
118126
versionAlignment(libraryHandler), libraryHandler.alignWith.bomAlignment, libraryHandler.linkRootName,
119127
libraryHandler.links));
120128
}
@@ -205,7 +213,9 @@ public static class LibraryHandler {
205213

206214
private final AlignWithHandler alignWith;
207215

208-
private boolean considerSnapshots;
216+
private boolean firstParty = false;
217+
218+
private String releaseTrainId = null;
209219

210220
private String version;
211221

@@ -226,8 +236,15 @@ public void version(String version) {
226236
this.version = version;
227237
}
228238

229-
public void considerSnapshots() {
230-
this.considerSnapshots = true;
239+
public void firstParty() {
240+
this.firstParty = true;
241+
}
242+
243+
public void firstParty(Action<FirstPartyHandler> action) {
244+
FirstPartyHandler handler = new FirstPartyHandler();
245+
action.execute(handler);
246+
this.firstParty = true;
247+
this.releaseTrainId = handler.releaseTrainId;
231248
}
232249

233250
public void setCalendarName(String calendarName) {
@@ -486,6 +503,16 @@ public void excluding(Predicate<Id> exclusion) {
486503

487504
}
488505

506+
public static class FirstPartyHandler {
507+
508+
private String releaseTrainId;
509+
510+
public void setReleaseTrainId(String releaseTrainId) {
511+
this.releaseTrainId = releaseTrainId;
512+
}
513+
514+
}
515+
489516
}
490517

491518
public static class LinksHandler {

buildSrc/src/main/java/org/springframework/boot/build/bom/Library.java

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public class Library {
7373

7474
private final List<ProhibitedVersion> prohibitedVersions;
7575

76-
private final boolean considerSnapshots;
76+
private final FirstParty firstParty;
7777

7878
private final VersionAlignment versionAlignment;
7979

@@ -94,15 +94,15 @@ public class Library {
9494
* @param upgradePolicy the upgrade policy of the library, or {@code null} to use the
9595
* containing bom's policy
9696
* @param prohibitedVersions version of the library that are prohibited
97-
* @param considerSnapshots whether to consider snapshots
97+
* @param firstParty configuration for a first-party library
9898
* @param versionAlignment version alignment, if any, for the library
9999
* @param bomAlignment the bom, if any, that this library should align with
100100
* @param linkRootName the root name to use when generating link variable or
101101
* {@code null} to generate one based on the library {@code name}
102102
* @param links a list of HTTP links relevant to the library
103103
*/
104104
public Library(String name, String calendarName, LibraryVersion version, List<Group> groups,
105-
UpgradePolicy upgradePolicy, List<ProhibitedVersion> prohibitedVersions, boolean considerSnapshots,
105+
UpgradePolicy upgradePolicy, List<ProhibitedVersion> prohibitedVersions, FirstParty firstParty,
106106
VersionAlignment versionAlignment, BomAlignment bomAlignment, String linkRootName,
107107
Map<String, List<Link>> links) {
108108
this.name = name;
@@ -113,7 +113,7 @@ public Library(String name, String calendarName, LibraryVersion version, List<Gr
113113
: name.toLowerCase(Locale.ENGLISH).replace(' ', '-') + ".version";
114114
this.upgradePolicy = upgradePolicy;
115115
this.prohibitedVersions = prohibitedVersions;
116-
this.considerSnapshots = considerSnapshots;
116+
this.firstParty = firstParty;
117117
this.versionAlignment = versionAlignment;
118118
this.bomAlignment = bomAlignment;
119119
this.linkRootName = (linkRootName != null) ? linkRootName : generateLinkRootName(name);
@@ -152,8 +152,12 @@ public List<ProhibitedVersion> getProhibitedVersions() {
152152
return this.prohibitedVersions;
153153
}
154154

155-
public boolean isConsiderSnapshots() {
156-
return this.considerSnapshots;
155+
public FirstParty getFirstParty() {
156+
return this.firstParty;
157+
}
158+
159+
public boolean isFirstParty() {
160+
return this.firstParty != null;
157161
}
158162

159163
public VersionAlignment getVersionAlignment() {
@@ -193,8 +197,8 @@ public String getNameAndVersion() {
193197

194198
public Library withVersion(LibraryVersion version) {
195199
return new Library(this.name, this.calendarName, version, this.groups, this.upgradePolicy,
196-
this.prohibitedVersions, this.considerSnapshots, this.versionAlignment, this.bomAlignment,
197-
this.linkRootName, this.links);
200+
this.prohibitedVersions, this.firstParty, this.versionAlignment, this.bomAlignment, this.linkRootName,
201+
this.links);
198202
}
199203

200204
/**
@@ -695,6 +699,20 @@ public String toString() {
695699

696700
}
697701

702+
public static class FirstParty {
703+
704+
private final String releaseTrainId;
705+
706+
public FirstParty(String releaseTrainId) {
707+
this.releaseTrainId = releaseTrainId;
708+
}
709+
710+
public String getReleaseTrainId() {
711+
return this.releaseTrainId;
712+
}
713+
714+
}
715+
698716
public record Link(String rootName, Function<LibraryVersion, String> factory, List<String> packages) {
699717

700718
private static final Pattern PACKAGE_EXPAND = Pattern.compile("^(.*)\\[(.*)\\]$");

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.w3c.dom.Document;
3535
import org.w3c.dom.NodeList;
3636

37+
import org.springframework.boot.build.bom.Library;
3738
import org.springframework.boot.build.bom.bomr.version.DependencyVersion;
3839
import org.springframework.boot.build.xml.XmlDocument;
3940
import org.springframework.http.HttpStatus;
@@ -67,7 +68,7 @@ final class MavenMetadataVersionResolver implements VersionResolver {
6768
}
6869

6970
@Override
70-
public SortedSet<DependencyVersion> resolveVersions(String groupId, String artifactId) {
71+
public SortedSet<DependencyVersion> resolveVersions(String groupId, String artifactId, Library library) {
7172
Set<String> versions = new HashSet<>();
7273
for (MavenArtifactRepository repository : this.repositories) {
7374
versions.addAll(resolveVersions(groupId, artifactId, repository));

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,17 @@ void upgradeDependencies() {
6666
}
6767

6868
@Override
69-
protected String commitMessage(Upgrade upgrade, int issueNumber) {
70-
return "Start building against " + upgrade.toRelease().getNameAndVersion() + " snapshots" + "\n\nSee gh-"
71-
+ issueNumber;
69+
protected String commitMessage(Upgrade upgrade, Integer issueNumber) {
70+
String message = "Start building against " + upgrade.toRelease().getNameAndVersion() + " snapshots";
71+
if (issueNumber != null) {
72+
message += "\n\nSee gh-" + issueNumber;
73+
}
74+
return message;
7275
}
7376

7477
@Override
7578
protected boolean eligible(Library library) {
76-
return library.isConsiderSnapshots() && super.eligible(library);
79+
return library.isFirstParty() && super.eligible(library);
7780
}
7881

7982
@Override
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*
2+
* Copyright 2012-present the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.build.bom.bomr;
18+
19+
import java.util.ArrayList;
20+
import java.util.Collections;
21+
import java.util.List;
22+
import java.util.Map;
23+
import java.util.SortedSet;
24+
import java.util.TreeMap;
25+
import java.util.TreeSet;
26+
import java.util.stream.Collectors;
27+
28+
import tools.jackson.databind.json.JsonMapper;
29+
import tools.jackson.databind.type.TypeFactory;
30+
31+
import org.springframework.boot.build.bom.Library;
32+
import org.springframework.boot.build.bom.bomr.github.GitHub;
33+
import org.springframework.boot.build.bom.bomr.version.DependencyVersion;
34+
35+
/**
36+
* A {@link VersionResolver version resolver} that resolves versions from a release train.
37+
*
38+
* @author Andy Wilkinson
39+
*/
40+
public class ReleaseTrainVersionResolver implements VersionResolver {
41+
42+
private final Map<String, SortedSet<DependencyVersion>> versions;
43+
44+
ReleaseTrainVersionResolver(GitHub gitHub, String releaseTrain) {
45+
this.versions = parseVersions(getRawVersions(gitHub, releaseTrain));
46+
}
47+
48+
private static Map<String, List<String>> getRawVersions(GitHub gitHub, String releaseTrain) {
49+
String content = gitHub.getRepository("spring-io", "release-train")
50+
.getContent("release-versions.json", releaseTrain);
51+
TypeFactory typeFactory = TypeFactory.createDefaultInstance();
52+
return JsonMapper.shared()
53+
.readerFor(typeFactory.constructMapLikeType(TreeMap.class, typeFactory.constructType(String.class),
54+
typeFactory.constructCollectionLikeType(ArrayList.class, String.class)))
55+
.readValue(content);
56+
}
57+
58+
private static Map<String, SortedSet<DependencyVersion>> parseVersions(Map<String, List<String>> rawVersions) {
59+
Map<String, SortedSet<DependencyVersion>> parsedVersions = new TreeMap<>();
60+
rawVersions.forEach((project, versions) -> parsedVersions.put(project,
61+
new TreeSet<>(versions.stream().map(DependencyVersion::parse).collect(Collectors.toSet()))));
62+
return parsedVersions;
63+
}
64+
65+
@Override
66+
public SortedSet<DependencyVersion> resolveVersions(String groupId, String artifactId, Library library) {
67+
if (!library.isFirstParty()) {
68+
return Collections.emptySortedSet();
69+
}
70+
SortedSet<DependencyVersion> result = this.versions.getOrDefault(library.getFirstParty().getReleaseTrainId(),
71+
Collections.emptySortedSet());
72+
return result;
73+
}
74+
75+
}

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -110,15 +110,13 @@ private List<VersionOption> determineResolvedVersionOptions(Library library) {
110110
for (Group group : library.getGroups()) {
111111
for (Module module : group.getModules()) {
112112
moduleVersions.put(group.getId() + ":" + module.getName(),
113-
getLaterVersionsForModule(group.getId(), module.getName(), library));
113+
getVersionsForModule(group.getId(), module.getName(), library));
114114
}
115115
for (ImportedBom bom : group.getBoms()) {
116-
moduleVersions.put(group.getId() + ":" + bom,
117-
getLaterVersionsForModule(group.getId(), bom.name(), library));
116+
moduleVersions.put(group.getId() + ":" + bom, getVersionsForModule(group.getId(), bom.name(), library));
118117
}
119118
for (String plugin : group.getPlugins()) {
120-
moduleVersions.put(group.getId() + ":" + plugin,
121-
getLaterVersionsForModule(group.getId(), plugin, library));
119+
moduleVersions.put(group.getId() + ":" + plugin, getVersionsForModule(group.getId(), plugin, library));
122120
}
123121
}
124122
List<VersionOption> versionOptions = new ArrayList<>();
@@ -146,8 +144,8 @@ private List<String> getMissingModules(Map<String, SortedSet<DependencyVersion>>
146144
return missingModules;
147145
}
148146

149-
private SortedSet<DependencyVersion> getLaterVersionsForModule(String groupId, String artifactId, Library library) {
150-
return this.versionResolver.resolveVersions(groupId, artifactId);
147+
private SortedSet<DependencyVersion> getVersionsForModule(String groupId, String artifactId, Library library) {
148+
return this.versionResolver.resolveVersions(groupId, artifactId, library);
151149
}
152150

153151
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,12 @@ private void addCommercialRepositories() {
6262
}
6363

6464
@Override
65-
protected String commitMessage(Upgrade upgrade, int issueNumber) {
66-
return issueTitle(upgrade) + "\n\nCloses gh-" + issueNumber;
65+
protected String commitMessage(Upgrade upgrade, Integer issueNumber) {
66+
String message = issueTitle(upgrade);
67+
if (issueNumber != null) {
68+
message += "\n\nCloses gh-" + issueNumber;
69+
}
70+
return message;
6771
}
6872

6973
@Override

0 commit comments

Comments
 (0)