|
|
|
|
@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
|
|
|
|
|
/* |
|
|
|
|
* Copyright 2012-2023 the original author or authors. |
|
|
|
|
* Copyright 2012-2024 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. |
|
|
|
|
@ -16,12 +16,22 @@
@@ -16,12 +16,22 @@
|
|
|
|
|
|
|
|
|
|
package org.springframework.boot.build.bom; |
|
|
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.Collections; |
|
|
|
|
import java.util.HashMap; |
|
|
|
|
import java.util.HashSet; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.Locale; |
|
|
|
|
import java.util.Map; |
|
|
|
|
import java.util.Set; |
|
|
|
|
|
|
|
|
|
import org.apache.maven.artifact.versioning.DefaultArtifactVersion; |
|
|
|
|
import org.apache.maven.artifact.versioning.VersionRange; |
|
|
|
|
import org.gradle.api.Project; |
|
|
|
|
import org.gradle.api.artifacts.Configuration; |
|
|
|
|
import org.gradle.api.artifacts.Dependency; |
|
|
|
|
import org.gradle.api.artifacts.dsl.DependencyHandler; |
|
|
|
|
import org.gradle.api.artifacts.result.DependencyResult; |
|
|
|
|
|
|
|
|
|
import org.springframework.boot.build.bom.bomr.version.DependencyVersion; |
|
|
|
|
|
|
|
|
|
@ -47,6 +57,8 @@ public class Library {
@@ -47,6 +57,8 @@ public class Library {
|
|
|
|
|
|
|
|
|
|
private final boolean considerSnapshots; |
|
|
|
|
|
|
|
|
|
private final VersionAlignment versionAlignment; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Create a new {@code Library} with the given {@code name}, {@code version}, and |
|
|
|
|
* {@code groups}. |
|
|
|
|
@ -57,9 +69,10 @@ public class Library {
@@ -57,9 +69,10 @@ public class Library {
|
|
|
|
|
* @param groups groups in the library |
|
|
|
|
* @param prohibitedVersions version of the library that are prohibited |
|
|
|
|
* @param considerSnapshots whether to consider snapshots |
|
|
|
|
* @param versionAlignment version alignment, if any, for the library |
|
|
|
|
*/ |
|
|
|
|
public Library(String name, String calendarName, LibraryVersion version, List<Group> groups, |
|
|
|
|
List<ProhibitedVersion> prohibitedVersions, boolean considerSnapshots) { |
|
|
|
|
List<ProhibitedVersion> prohibitedVersions, boolean considerSnapshots, VersionAlignment versionAlignment) { |
|
|
|
|
this.name = name; |
|
|
|
|
this.calendarName = (calendarName != null) ? calendarName : name; |
|
|
|
|
this.version = version; |
|
|
|
|
@ -68,6 +81,7 @@ public class Library {
@@ -68,6 +81,7 @@ public class Library {
|
|
|
|
|
: name.toLowerCase(Locale.ENGLISH).replace(' ', '-') + ".version"; |
|
|
|
|
this.prohibitedVersions = prohibitedVersions; |
|
|
|
|
this.considerSnapshots = considerSnapshots; |
|
|
|
|
this.versionAlignment = versionAlignment; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public String getName() { |
|
|
|
|
@ -98,6 +112,10 @@ public class Library {
@@ -98,6 +112,10 @@ public class Library {
|
|
|
|
|
return this.considerSnapshots; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public VersionAlignment getVersionAlignment() { |
|
|
|
|
return this.versionAlignment; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* A version or range of versions that are prohibited from being used in a bom. |
|
|
|
|
*/ |
|
|
|
|
@ -280,4 +298,99 @@ public class Library {
@@ -280,4 +298,99 @@ public class Library {
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Version alignment for a library. |
|
|
|
|
*/ |
|
|
|
|
public static class VersionAlignment { |
|
|
|
|
|
|
|
|
|
private final String from; |
|
|
|
|
|
|
|
|
|
private final String managedBy; |
|
|
|
|
|
|
|
|
|
private final Project project; |
|
|
|
|
|
|
|
|
|
private final List<Library> libraries; |
|
|
|
|
|
|
|
|
|
private final List<Group> groups; |
|
|
|
|
|
|
|
|
|
private Set<String> alignedVersions; |
|
|
|
|
|
|
|
|
|
VersionAlignment(String from, String managedBy, Project project, List<Library> libraries, List<Group> groups) { |
|
|
|
|
this.from = from; |
|
|
|
|
this.managedBy = managedBy; |
|
|
|
|
this.project = project; |
|
|
|
|
this.libraries = libraries; |
|
|
|
|
this.groups = groups; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public Set<String> resolve() { |
|
|
|
|
if (this.managedBy == null) { |
|
|
|
|
throw new IllegalStateException("Version alignment without managedBy is not supported"); |
|
|
|
|
} |
|
|
|
|
if (this.alignedVersions != null) { |
|
|
|
|
return this.alignedVersions; |
|
|
|
|
} |
|
|
|
|
Library managingLibrary = this.libraries.stream() |
|
|
|
|
.filter((candidate) -> this.managedBy.equals(candidate.getName())) |
|
|
|
|
.findFirst() |
|
|
|
|
.orElseThrow(() -> new IllegalStateException("Managing library '" + this.managedBy + "' not found.")); |
|
|
|
|
Map<String, String> versions = resolveAligningDependencies(managingLibrary); |
|
|
|
|
Set<String> versionsInLibrary = new HashSet<>(); |
|
|
|
|
for (Group group : this.groups) { |
|
|
|
|
for (Module module : group.getModules()) { |
|
|
|
|
String version = versions.get(group.getId() + ":" + module.getName()); |
|
|
|
|
if (version != null) { |
|
|
|
|
versionsInLibrary.add(version); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
for (String plugin : group.getPlugins()) { |
|
|
|
|
String version = versions.get(group.getId() + ":" + plugin); |
|
|
|
|
if (version != null) { |
|
|
|
|
versionsInLibrary.add(version); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
this.alignedVersions = versionsInLibrary; |
|
|
|
|
return this.alignedVersions; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private Map<String, String> resolveAligningDependencies(Library manager) { |
|
|
|
|
DependencyHandler dependencyHandler = this.project.getDependencies(); |
|
|
|
|
List<Dependency> boms = manager.getGroups() |
|
|
|
|
.stream() |
|
|
|
|
.flatMap((group) -> group.getBoms() |
|
|
|
|
.stream() |
|
|
|
|
.map((bom) -> dependencyHandler |
|
|
|
|
.platform(group.getId() + ":" + bom + ":" + manager.getVersion().getVersion()))) |
|
|
|
|
.toList(); |
|
|
|
|
List<Dependency> dependencies = new ArrayList<>(); |
|
|
|
|
dependencies.addAll(boms); |
|
|
|
|
dependencies.add(dependencyHandler.create(this.from)); |
|
|
|
|
Configuration alignmentConfiguration = this.project.getConfigurations() |
|
|
|
|
.detachedConfiguration(dependencies.toArray(new Dependency[0])); |
|
|
|
|
Map<String, String> versions = new HashMap<>(); |
|
|
|
|
for (DependencyResult dependency : alignmentConfiguration.getIncoming() |
|
|
|
|
.getResolutionResult() |
|
|
|
|
.getAllDependencies()) { |
|
|
|
|
versions.put(dependency.getFrom().getModuleVersion().getModule().toString(), |
|
|
|
|
dependency.getFrom().getModuleVersion().getVersion()); |
|
|
|
|
} |
|
|
|
|
return versions; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
String getFrom() { |
|
|
|
|
return this.from; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
String getManagedBy() { |
|
|
|
|
return this.managedBy; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public String toString() { |
|
|
|
|
return "version from dependencies of " + this.from + " that is managed by " + this.managedBy; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|