Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.BiFunction;
import java.util.function.Predicate;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -396,7 +397,11 @@ Result<Float> libYear(
* Finds newer versions for artifacts from source.
*/
Result<Map<Artifact, List<Version>>> versions(
String context, Source<Artifact> artifacts, Predicate<Version> versionPredicate) throws Exception;
String context,
Source<Artifact> artifacts,
Predicate<Version> versionPredicate,
BiFunction<Artifact, List<Version>, String> versionSelector)
throws Exception;

// POM editing

Expand Down Expand Up @@ -425,30 +430,36 @@ interface EditSession extends Closeable {
EditSession createEditSession(Path pom) throws IOException;

/**
* Calculates list of "latest" artifacts based on {@link #versions(String, Source, Predicate)} query result
* Calculates list of "latest" artifacts based on {@link #versions(String, Source, Predicate, BiFunction)} query result
* Contains only artifacts that have updates.
*/
default List<Artifact> calculateUpdates(Map<Artifact, List<Version>> versions) {
default List<Artifact> calculateUpdates(
Map<Artifact, List<Version>> versions, BiFunction<Artifact, List<Version>, String> versionSelector) {
return versions.entrySet().stream()
.filter(e -> !e.getValue().isEmpty())
.map(e -> e.getKey()
.setVersion(e.getValue().get(e.getValue().size() - 1).toString()))
.map(e -> {
String selected = versionSelector.apply(e.getKey(), e.getValue());
if (Objects.equals(selected, e.getKey().getVersion())) {
return null;
}
return e.getKey().setVersion(versionSelector.apply(e.getKey(), e.getValue()));
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
}

/**
* Calculates list of "latest" artifacts based on {@link #versions(String, Source, Predicate)} query result.
* Calculates list of "latest" artifacts based on {@link #versions(String, Source, Predicate, BiFunction)} query result.
* Contains every artifact, even those that are already "latest".
*/
default List<Artifact> calculateLatest(Map<Artifact, List<Version>> versions) {
default List<Artifact> calculateLatest(
Map<Artifact, List<Version>> versions, BiFunction<Artifact, List<Version>, String> versionSelector) {
return versions.entrySet().stream()
.map(e -> e.getKey()
.setVersion(
e.getValue().isEmpty()
? e.getKey().getVersion()
: e.getValue()
.get(e.getValue().size() - 1)
.toString()))
: versionSelector.apply(e.getKey(), e.getValue())))
.collect(Collectors.toList());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,10 @@ public void cleanup(Exception e) {

@Override
public void close() throws IOException {
new PomTransformer(pom, StandardCharsets.UTF_8, PomTransformer.SimpleElementWhitespace.AUTODETECT_PREFER_EMPTY)
.transform(applicableTransformations);
if (!applicableTransformations.isEmpty()) {
new PomTransformer(
pom, StandardCharsets.UTF_8, PomTransformer.SimpleElementWhitespace.AUTODETECT_PREFER_EMPTY)
.transform(applicableTransformations);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1291,7 +1291,11 @@ public boolean visitLeave(DependencyNode node) {

@Override
public Result<Map<Artifact, List<Version>>> versions(
String context, Source<Artifact> artifactSource, Predicate<Version> versionPredicate) throws Exception {
String context,
Source<Artifact> artifactSource,
Predicate<Version> versionPredicate,
BiFunction<Artifact, List<Version>, String> versionSelector)
throws Exception {
List<Artifact> artifacts = artifactSource.get().collect(Collectors.toList());
HashMap<Artifact, List<Version>> result = new HashMap<>();
output.marker(Output.Verbosity.NORMAL)
Expand All @@ -1301,17 +1305,21 @@ public Result<Map<Artifact, List<Version>>> versions(
List<Version> newer = toolboxResolver.findNewerVersions(artifact, versionPredicate);
result.put(artifact, newer);
if (!newer.isEmpty()) {
Version latest = newer.get(newer.size() - 1);
String all = newer.stream().map(Object::toString).collect(Collectors.joining(", "));
output.marker(Output.Verbosity.NORMAL).scary("* {} -> {}").say(ArtifactIdUtils.toId(artifact), latest);
output.marker(Output.Verbosity.SUGGEST)
.detail(" Available: {}")
.say(all);
} else {
output.marker(Output.Verbosity.NORMAL)
.outstanding("* {} is up to date")
.say(ArtifactIdUtils.toId(artifact));
String selected = versionSelector.apply(artifact, newer);
boolean changed = !Objects.equals(selected, artifact.getVersion());
if (changed) {
output.marker(Output.Verbosity.NORMAL)
.scary("* {} -> {}")
.say(ArtifactIdUtils.toId(artifact), selected);
output.marker(Output.Verbosity.SUGGEST)
.detail(" Available: {}")
.say(newer.stream().map(Object::toString).collect(Collectors.joining(", ")));
continue;
}
}
output.marker(Output.Verbosity.NORMAL)
.outstanding("* {} is up to date")
.say(ArtifactIdUtils.toId(artifact));
}
return Result.success(result);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,23 @@ public class GavVersionsMojo extends GavMojoSupport {
@Parameter(property = "artifactVersionMatcherSpec", defaultValue = "noSnapshotsAndPreviews()")
private String artifactVersionMatcherSpec;

/**
* Artifact version selector spec string to select the version from candidates, default is 'last()'.
*/
@CommandLine.Option(
names = {"--artifactVersionSelectorSpec"},
defaultValue = "last()",
description = "Artifact version selector spec (default 'last()')")
@Parameter(property = "artifactVersionSelectorSpec", defaultValue = "last()")
private String artifactVersionSelectorSpec;

@Override
protected Result<Map<Artifact, List<Version>>> doExecute() throws Exception {
ToolboxCommando toolboxCommando = getToolboxCommando();
return toolboxCommando.versions(
"GAV",
() -> slurp(gav).stream().map(DefaultArtifact::new),
toolboxCommando.parseArtifactVersionMatcherSpec(artifactVersionMatcherSpec));
toolboxCommando.parseArtifactVersionMatcherSpec(artifactVersionMatcherSpec),
toolboxCommando.parseArtifactVersionSelectorSpec(artifactVersionSelectorSpec));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@

import eu.maveniverse.maven.toolbox.plugin.MPPluginMojoSupport;
import eu.maveniverse.maven.toolbox.shared.ArtifactMatcher;
import eu.maveniverse.maven.toolbox.shared.ArtifactVersionMatcher;
import eu.maveniverse.maven.toolbox.shared.ArtifactVersionSelector;
import eu.maveniverse.maven.toolbox.shared.ResolutionRoot;
import eu.maveniverse.maven.toolbox.shared.Result;
import eu.maveniverse.maven.toolbox.shared.ToolboxCommando;
Expand All @@ -20,6 +22,7 @@
import org.apache.maven.project.MavenProject;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.version.Version;
import picocli.CommandLine;

/**
* Locks available versions of Maven Project used plugins.
Expand All @@ -38,6 +41,16 @@ public class LockPluginVersionsMojo extends MPPluginMojoSupport {
@Parameter(property = "artifactVersionMatcherSpec", defaultValue = "noSnapshotsAndPreviews()")
private String artifactVersionMatcherSpec;

/**
* Artifact version selector spec string to select the version from candidates, default is 'last()'.
*/
@CommandLine.Option(
names = {"--artifactVersionSelectorSpec"},
defaultValue = "last()",
description = "Artifact version selector spec (default 'last()')")
@Parameter(property = "artifactVersionSelectorSpec", defaultValue = "last()")
private String artifactVersionSelectorSpec;

/**
* Apply results to POM.
*/
Expand All @@ -48,6 +61,10 @@ public class LockPluginVersionsMojo extends MPPluginMojoSupport {
protected Result<Boolean> doExecute() throws Exception {
ToolboxCommando toolboxCommando = getToolboxCommando();
ArtifactMatcher artifactMatcher = toolboxCommando.parseArtifactMatcherSpec(artifactMatcherSpec);
ArtifactVersionMatcher artifactVersionMatcher =
toolboxCommando.parseArtifactVersionMatcherSpec(artifactVersionMatcherSpec);
ArtifactVersionSelector artifactVersionSelector =
toolboxCommando.parseArtifactVersionSelectorSpec(artifactVersionSelectorSpec);

Map<Artifact, List<Version>> allPlugins = new HashMap<>();
for (MavenProject project : mavenSession.getProjects()) {
Expand All @@ -56,7 +73,8 @@ protected Result<Boolean> doExecute() throws Exception {
() -> allManagedPluginsAsResolutionRoots(toolboxCommando, project).stream()
.map(ResolutionRoot::getArtifact)
.filter(artifactMatcher),
toolboxCommando.parseArtifactVersionMatcherSpec(artifactVersionMatcherSpec));
artifactVersionMatcher,
artifactVersionSelector);
if (managedPlugins.isSuccess()) {
allPlugins.putAll(managedPlugins.getData().orElseThrow());
} else {
Expand All @@ -67,7 +85,8 @@ protected Result<Boolean> doExecute() throws Exception {
() -> allPluginsAsResolutionRoots(toolboxCommando, project).stream()
.map(ResolutionRoot::getArtifact)
.filter(artifactMatcher),
toolboxCommando.parseArtifactVersionMatcherSpec(artifactVersionMatcherSpec));
artifactVersionMatcher,
artifactVersionSelector);
if (plugins.isSuccess()) {
allPlugins.putAll(plugins.getData().orElseThrow());
} else {
Expand All @@ -76,7 +95,7 @@ protected Result<Boolean> doExecute() throws Exception {
}

if (applyToPom) {
List<Artifact> pluginsUpdates = toolboxCommando.calculateLatest(allPlugins);
List<Artifact> pluginsUpdates = toolboxCommando.calculateLatest(allPlugins, artifactVersionSelector);
if (!pluginsUpdates.isEmpty()) {
try (ToolboxCommando.EditSession editSession =
toolboxCommando.createEditSession(mavenProject.getFile().toPath())) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@

import eu.maveniverse.maven.toolbox.plugin.MPPluginMojoSupport;
import eu.maveniverse.maven.toolbox.shared.ArtifactMatcher;
import eu.maveniverse.maven.toolbox.shared.ArtifactVersionMatcher;
import eu.maveniverse.maven.toolbox.shared.ArtifactVersionSelector;
import eu.maveniverse.maven.toolbox.shared.ResolutionRoot;
import eu.maveniverse.maven.toolbox.shared.Result;
import eu.maveniverse.maven.toolbox.shared.ToolboxCommando;
Expand All @@ -18,6 +20,7 @@
import org.apache.maven.plugins.annotations.Parameter;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.version.Version;
import picocli.CommandLine;

/**
* Lists available versions of Maven Project plugins.
Expand All @@ -36,6 +39,16 @@ public class PluginVersionsMojo extends MPPluginMojoSupport {
@Parameter(property = "artifactVersionMatcherSpec", defaultValue = "noSnapshotsAndPreviews()")
private String artifactVersionMatcherSpec;

/**
* Artifact version selector spec string to select the version from candidates, default is 'last()'.
*/
@CommandLine.Option(
names = {"--artifactVersionSelectorSpec"},
defaultValue = "last()",
description = "Artifact version selector spec (default 'last()')")
@Parameter(property = "artifactVersionSelectorSpec", defaultValue = "last()")
private String artifactVersionSelectorSpec;

/**
* Apply results to POM.
*/
Expand All @@ -46,24 +59,31 @@ public class PluginVersionsMojo extends MPPluginMojoSupport {
protected Result<Boolean> doExecute() throws Exception {
ToolboxCommando toolboxCommando = getToolboxCommando();
ArtifactMatcher artifactMatcher = toolboxCommando.parseArtifactMatcherSpec(artifactMatcherSpec);
ArtifactVersionMatcher artifactVersionMatcher =
toolboxCommando.parseArtifactVersionMatcherSpec(artifactVersionMatcherSpec);
ArtifactVersionSelector artifactVersionSelector =
toolboxCommando.parseArtifactVersionSelectorSpec(artifactVersionSelectorSpec);

Result<Map<Artifact, List<Version>>> managedPlugins = toolboxCommando.versions(
"managed plugins",
() -> allProjectManagedPluginsAsResolutionRoots(toolboxCommando).stream()
.map(ResolutionRoot::getArtifact)
.filter(artifactMatcher),
toolboxCommando.parseArtifactVersionMatcherSpec(artifactVersionMatcherSpec));
artifactVersionMatcher,
artifactVersionSelector);
Result<Map<Artifact, List<Version>>> plugins = toolboxCommando.versions(
"plugins",
() -> allProjectPluginsAsResolutionRoots(toolboxCommando).stream()
.map(ResolutionRoot::getArtifact)
.filter(artifactMatcher),
toolboxCommando.parseArtifactVersionMatcherSpec(artifactVersionMatcherSpec));
artifactVersionMatcher,
artifactVersionSelector);

if (applyToPom) {
List<Artifact> managedPluginsUpdates =
toolboxCommando.calculateUpdates(managedPlugins.getData().orElseThrow());
toolboxCommando.calculateUpdates(managedPlugins.getData().orElseThrow(), artifactVersionSelector);
List<Artifact> pluginsUpdates =
toolboxCommando.calculateUpdates(plugins.getData().orElseThrow());
toolboxCommando.calculateUpdates(plugins.getData().orElseThrow(), artifactVersionSelector);
if (!managedPluginsUpdates.isEmpty() || !pluginsUpdates.isEmpty()) {
try (ToolboxCommando.EditSession editSession =
toolboxCommando.createEditSession(mavenProject.getFile().toPath())) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
package eu.maveniverse.maven.toolbox.plugin.mp;

import eu.maveniverse.maven.toolbox.plugin.MPMojoSupport;
import eu.maveniverse.maven.toolbox.shared.ArtifactVersionMatcher;
import eu.maveniverse.maven.toolbox.shared.ArtifactVersionSelector;
import eu.maveniverse.maven.toolbox.shared.DependencyMatcher;
import eu.maveniverse.maven.toolbox.shared.ResolutionRoot;
import eu.maveniverse.maven.toolbox.shared.Result;
import eu.maveniverse.maven.toolbox.shared.ToolboxCommando;
Expand All @@ -17,6 +20,7 @@
import org.apache.maven.plugins.annotations.Parameter;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.version.Version;
import picocli.CommandLine;

/**
* Lists available versions of Maven Project dependencies.
Expand All @@ -35,6 +39,16 @@ public class VersionsMojo extends MPMojoSupport {
@Parameter(property = "artifactVersionMatcherSpec", defaultValue = "noSnapshotsAndPreviews()")
private String artifactVersionMatcherSpec;

/**
* Artifact version selector spec string to select the version from candidates, default is 'last()'.
*/
@CommandLine.Option(
names = {"--artifactVersionSelectorSpec"},
defaultValue = "last()",
description = "Artifact version selector spec (default 'last()')")
@Parameter(property = "artifactVersionSelectorSpec", defaultValue = "last()")
private String artifactVersionSelectorSpec;

/**
* Apply results to POM.
*/
Expand All @@ -44,24 +58,30 @@ public class VersionsMojo extends MPMojoSupport {
@Override
protected Result<Boolean> doExecute() throws Exception {
ToolboxCommando toolboxCommando = getToolboxCommando();
DependencyMatcher dependencyMatcher = toolboxCommando.parseDependencyMatcherSpec(depSpec);
ArtifactVersionMatcher artifactVersionMatcher =
toolboxCommando.parseArtifactVersionMatcherSpec(artifactVersionMatcherSpec);
ArtifactVersionSelector artifactVersionSelector =
toolboxCommando.parseArtifactVersionSelectorSpec(artifactVersionSelectorSpec);

Result<Map<Artifact, List<Version>>> managedDependencies = toolboxCommando.versions(
"managed dependencies",
() ->
projectManagedDependenciesAsResolutionRoots(toolboxCommando.parseDependencyMatcherSpec(depSpec))
.stream()
.map(ResolutionRoot::getArtifact),
toolboxCommando.parseArtifactVersionMatcherSpec(artifactVersionMatcherSpec));
() -> projectManagedDependenciesAsResolutionRoots(dependencyMatcher).stream()
.map(ResolutionRoot::getArtifact),
artifactVersionMatcher,
artifactVersionSelector);
Result<Map<Artifact, List<Version>>> dependencies = toolboxCommando.versions(
"dependencies",
() -> projectDependenciesAsResolutionRoots(toolboxCommando.parseDependencyMatcherSpec(depSpec)).stream()
() -> projectDependenciesAsResolutionRoots(dependencyMatcher).stream()
.map(ResolutionRoot::getArtifact),
toolboxCommando.parseArtifactVersionMatcherSpec(artifactVersionMatcherSpec));
artifactVersionMatcher,
artifactVersionSelector);

if (applyToPom) {
List<Artifact> managedDependenciesUpdates = toolboxCommando.calculateUpdates(
managedDependencies.getData().orElseThrow());
managedDependencies.getData().orElseThrow(), artifactVersionSelector);
List<Artifact> dependenciesUpdates =
toolboxCommando.calculateUpdates(dependencies.getData().orElseThrow());
toolboxCommando.calculateUpdates(dependencies.getData().orElseThrow(), artifactVersionSelector);
if (!managedDependenciesUpdates.isEmpty() || !dependenciesUpdates.isEmpty()) {
try (ToolboxCommando.EditSession editSession =
toolboxCommando.createEditSession(mavenProject.getFile().toPath())) {
Expand Down
Loading