Merge branch '3.3.x'

This commit is contained in:
Phillip Webb
2024-11-07 15:55:26 -08:00
9 changed files with 247 additions and 171 deletions

View File

@@ -175,10 +175,21 @@ public class AntoraAsciidocAttributes {
private void addUrlLibraryLinkAttributes(Map<String, String> attributes) {
this.libraries.forEach((library) -> {
String prefix = "url-" + library.getLinkRootName() + "-";
library.getLinks().forEach((name, link) -> attributes.put(prefix + name, link));
library.getLinks().forEach((name, link) -> {
String linkName = prefix + name;
attributes.put(linkName, link.url(library));
link.packages()
.stream()
.map(this::packageAttributeName)
.forEach((packageAttributeName) -> attributes.put(packageAttributeName, "{" + linkName + "}"));
});
});
}
private String packageAttributeName(String packageName) {
return "javadoc-location-" + packageName.replace('.', '-');
}
private void addPropertyAttributes(Map<String, String> attributes) {
Properties properties = new Properties() {

View File

@@ -61,6 +61,7 @@ import org.springframework.boot.build.DeployedPlugin;
import org.springframework.boot.build.bom.Library.Exclusion;
import org.springframework.boot.build.bom.Library.Group;
import org.springframework.boot.build.bom.Library.LibraryVersion;
import org.springframework.boot.build.bom.Library.Link;
import org.springframework.boot.build.bom.Library.Module;
import org.springframework.boot.build.bom.Library.ProhibitedVersion;
import org.springframework.boot.build.bom.Library.VersionAlignment;
@@ -255,7 +256,7 @@ public class BomExtension {
private String linkRootName;
private final Map<String, Function<LibraryVersion, String>> links = new HashMap<>();
private final Map<String, Link> links = new HashMap<>();
@Inject
public LibraryHandler(Project project, String version) {
@@ -457,7 +458,7 @@ public class BomExtension {
public static class LinksHandler {
private final Map<String, Function<LibraryVersion, String>> links = new HashMap<>();
private final Map<String, Link> links = new HashMap<>();
public void site(String linkTemplate) {
site(asFactory(linkTemplate));
@@ -487,10 +488,18 @@ public class BomExtension {
javadoc(asFactory(linkTemplate));
}
public void javadoc(String linkTemplate, String... packages) {
javadoc(asFactory(linkTemplate), packages);
}
public void javadoc(Function<LibraryVersion, String> linkFactory) {
add("javadoc", linkFactory);
}
public void javadoc(Function<LibraryVersion, String> linkFactory, String... packages) {
add("javadoc", linkFactory, packages);
}
public void releaseNotes(String linkTemplate) {
releaseNotes(asFactory(linkTemplate));
}
@@ -504,7 +513,11 @@ public class BomExtension {
}
public void add(String name, Function<LibraryVersion, String> linkFactory) {
this.links.put(name, linkFactory);
add(name, linkFactory, null);
}
public void add(String name, Function<LibraryVersion, String> linkFactory, String[] packages) {
this.links.put(name, new Link(linkFactory, (packages != null) ? List.of(packages) : null));
}
private Function<LibraryVersion, String> asFactory(String linkTemplate) {

View File

@@ -62,7 +62,7 @@ public abstract class CheckLinks extends DefaultTask {
library.getLinks().forEach((name, link) -> {
URI uri;
try {
uri = new URI(link);
uri = new URI(link.url(library));
ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.HEAD, null, String.class);
System.out.printf("[%3d] %s - %s (%s)%n", response.getStatusCode().value(), library.getName(), name,
uri);

View File

@@ -27,6 +27,9 @@ import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.apache.maven.artifact.versioning.VersionRange;
@@ -65,7 +68,7 @@ public class Library {
private final String linkRootName;
private final Map<String, Function<LibraryVersion, String>> links;
private final Map<String, Link> links;
/**
* Create a new {@code Library} with the given {@code name}, {@code version}, and
@@ -86,7 +89,7 @@ public class Library {
*/
public Library(String name, String calendarName, LibraryVersion version, List<Group> groups,
List<ProhibitedVersion> prohibitedVersions, boolean considerSnapshots, VersionAlignment versionAlignment,
String alignsWithBom, String linkRootName, Map<String, Function<LibraryVersion, String>> links) {
String alignsWithBom, String linkRootName, Map<String, Link> links) {
this.name = name;
this.calendarName = (calendarName != null) ? calendarName : name;
this.version = version;
@@ -98,7 +101,7 @@ public class Library {
this.versionAlignment = versionAlignment;
this.alignsWithBom = alignsWithBom;
this.linkRootName = (linkRootName != null) ? linkRootName : generateLinkRootName(name);
this.links = Collections.unmodifiableMap(links);
this.links = Collections.unmodifiableMap(new TreeMap<>(links));
}
private static String generateLinkRootName(String name) {
@@ -145,14 +148,17 @@ public class Library {
return this.alignsWithBom;
}
public Map<String, String> getLinks() {
return getLinks(this.version);
public Map<String, Link> getLinks() {
return this.links;
}
public Map<String, String> getLinks(LibraryVersion version) {
Map<String, String> links = new TreeMap<>();
this.links.forEach((name, linkFactory) -> links.put(name, linkFactory.apply(version)));
return Collections.unmodifiableMap(links);
public String getLinkUrl(String name) {
Link link = getLink(name);
return (link != null) ? link.url(this) : null;
}
public Link getLink(String name) {
return this.links.get(name);
}
/**
@@ -518,4 +524,36 @@ public class Library {
}
public static record Link(Function<LibraryVersion, String> factory, List<String> packages) {
private static final Pattern PACKAGE_EXPAND = Pattern.compile("^(.*)\\[(.*)\\]$");
public Link {
packages = (packages != null) ? List.copyOf(expandPackages(packages)) : Collections.emptyList();
}
private static List<String> expandPackages(List<String> packages) {
return packages.stream().flatMap(Link::expandPackage).toList();
}
private static Stream<String> expandPackage(String packageName) {
Matcher matcher = PACKAGE_EXPAND.matcher(packageName);
if (!matcher.matches()) {
return Stream.of(packageName);
}
String root = matcher.group(1);
String[] suffixes = matcher.group(2).split("\\|");
return Stream.of(suffixes).map((suffix) -> root + suffix);
}
public String url(Library library) {
return url(library.getVersion());
}
public String url(LibraryVersion libraryVersion) {
return factory().apply(libraryVersion);
}
}
}

View File

@@ -80,11 +80,12 @@ public abstract class MoveToSnapshots extends UpgradeDependencies {
@Override
protected String issueBody(Upgrade upgrade, Issue existingUpgrade) {
String releaseNotes = upgrade.getLibrary().getLinks().get("releaseNotes");
Library library = upgrade.getLibrary();
String releaseNotesLink = library.getLinkUrl("releaseNotes");
List<String> lines = new ArrayList<>();
String description = description(upgrade);
if (releaseNotes != null) {
lines.add("Upgrade to [%s](%s).".formatted(description, releaseNotes));
if (releaseNotesLink != null) {
lines.add("Upgrade to [%s](%s).".formatted(description, releaseNotesLink));
}
lines.add("Upgrade to %s.".formatted(description));
if (existingUpgrade != null) {

View File

@@ -28,6 +28,7 @@ import org.gradle.api.artifacts.repositories.MavenArtifactRepository;
import org.springframework.boot.build.bom.BomExtension;
import org.springframework.boot.build.bom.Library.LibraryVersion;
import org.springframework.boot.build.bom.Library.Link;
import org.springframework.boot.build.bom.bomr.github.Issue;
import org.springframework.boot.build.properties.BuildProperties;
@@ -75,13 +76,12 @@ public abstract class UpgradeBom extends UpgradeDependencies {
@Override
protected String issueBody(Upgrade upgrade, Issue existingUpgrade) {
String releaseNotes = upgrade.getLibrary()
.getLinks(new LibraryVersion(upgrade.getVersion()))
.get("releaseNotes");
LibraryVersion upgradeVersion = new LibraryVersion(upgrade.getVersion());
String releaseNotesLink = getReleaseNotesLink(upgrade, upgradeVersion);
List<String> lines = new ArrayList<>();
String description = upgrade.getLibrary().getName() + " " + upgrade.getVersion();
if (releaseNotes != null) {
lines.add("Upgrade to [%s](%s).".formatted(description, releaseNotes));
String description = upgrade.getLibrary().getName() + " " + upgradeVersion;
if (releaseNotesLink != null) {
lines.add("Upgrade to [%s](%s).".formatted(description, releaseNotesLink));
}
else {
lines.add("Upgrade to %s.".formatted(description));
@@ -92,4 +92,9 @@ public abstract class UpgradeBom extends UpgradeDependencies {
return String.join("\\r\\n\\r\\n", lines);
}
private String getReleaseNotesLink(Upgrade upgrade, LibraryVersion upgradeVersion) {
Link releaseNotesLink = upgrade.getLibrary().getLink("releaseNotes");
return releaseNotesLink.url(upgradeVersion);
}
}

View File

@@ -21,13 +21,13 @@ import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import org.junit.jupiter.api.Test;
import org.springframework.boot.build.bom.Library;
import org.springframework.boot.build.bom.Library.Group;
import org.springframework.boot.build.bom.Library.LibraryVersion;
import org.springframework.boot.build.bom.Library.Link;
import org.springframework.boot.build.bom.Library.ProhibitedVersion;
import org.springframework.boot.build.bom.Library.VersionAlignment;
import org.springframework.boot.build.bom.bomr.version.DependencyVersion;
@@ -187,14 +187,20 @@ class AntoraAsciidocAttributesTests {
@Test
void urlLinksFromLibrary() {
Map<String, Function<LibraryVersion, String>> links = new LinkedHashMap<>();
links.put("site", (version) -> "https://example.com/site/" + version);
links.put("docs", (version) -> "https://example.com/docs/" + version);
Map<String, Link> links = new LinkedHashMap<>();
links.put("site", new Link((version) -> "https://example.com/site/" + version, null));
links.put("docs", new Link((version) -> "https://example.com/docs/" + version, null));
links.put("javadoc", new Link((version) -> "https://example.com/api/" + version,
List.of("org.springframework.[core|util]")));
Library library = mockLibrary(links);
AntoraAsciidocAttributes attributes = new AntoraAsciidocAttributes("1.2.3.1-SNAPSHOT", false,
BuildType.OPEN_SOURCE, List.of(library), mockDependencyVersions(), null);
assertThat(attributes.get()).containsEntry("url-spring-framework-site", "https://example.com/site/1.2.3")
.containsEntry("url-spring-framework-docs", "https://example.com/docs/1.2.3");
.containsEntry("url-spring-framework-docs", "https://example.com/docs/1.2.3")
.containsEntry("url-spring-framework-javadoc", "https://example.com/api/1.2.3");
assertThat(attributes.get())
.containsEntry("javadoc-location-org-springframework-core", "{url-spring-framework-javadoc}")
.containsEntry("javadoc-location-org-springframework-util", "{url-spring-framework-javadoc}");
}
@Test
@@ -209,7 +215,7 @@ class AntoraAsciidocAttributesTests {
assertThat(keys.indexOf("include-java")).isLessThan(keys.indexOf("code-spring-boot-latest"));
}
private Library mockLibrary(Map<String, Function<LibraryVersion, String>> links) {
private Library mockLibrary(Map<String, Link> links) {
String name = "Spring Framework";
String calendarName = null;
LibraryVersion version = new LibraryVersion(DependencyVersion.parse("1.2.3"));

View File

@@ -19,12 +19,12 @@ package org.springframework.boot.build.bom;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import org.junit.jupiter.api.Test;
import org.springframework.boot.build.bom.Library.Group;
import org.springframework.boot.build.bom.Library.LibraryVersion;
import org.springframework.boot.build.bom.Library.Link;
import org.springframework.boot.build.bom.Library.ProhibitedVersion;
import org.springframework.boot.build.bom.Library.VersionAlignment;
import org.springframework.boot.build.bom.bomr.version.DependencyVersion;
@@ -49,7 +49,7 @@ class LibraryTests {
VersionAlignment versionAlignment = null;
String alignsWithBom = null;
String linkRootName = null;
Map<String, Function<LibraryVersion, String>> links = Collections.emptyMap();
Map<String, Link> links = Collections.emptyMap();
Library library = new Library(name, calendarName, version, groups, prohibitedVersion, considerSnapshots,
versionAlignment, alignsWithBom, linkRootName, links);
assertThat(library.getLinkRootName()).isEqualTo("spring-framework");
@@ -66,7 +66,7 @@ class LibraryTests {
VersionAlignment versionAlignment = null;
String alignsWithBom = null;
String linkRootName = "spring-data";
Map<String, Function<LibraryVersion, String>> links = Collections.emptyMap();
Map<String, Link> links = Collections.emptyMap();
Library library = new Library(name, calendarName, version, groups, prohibitedVersion, considerSnapshots,
versionAlignment, alignsWithBom, linkRootName, links);
assertThat(library.getLinkRootName()).isEqualTo("spring-data");