Merge branch '3.3.x'
This commit is contained in:
@@ -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() {
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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"));
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user