Skip to content
Open
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
4 changes: 2 additions & 2 deletions META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ Export-Package: org.apache.ivy;version="2.0.0",
org.apache.ivy.plugins;version="2.0.0",
org.apache.ivy.plugins.circular;version="2.0.0",
org.apache.ivy.plugins.conflict;version="2.6.0",
org.apache.ivy.plugins.latest;version="2.0.0",
org.apache.ivy.plugins.latest;version="2.6.0",
org.apache.ivy.plugins.lock;version="2.0.0",
org.apache.ivy.plugins.matcher;version="2.0.0",
org.apache.ivy.plugins.namespace;version="2.0.0",
Expand All @@ -104,7 +104,7 @@ Export-Package: org.apache.ivy;version="2.0.0",
org.apache.ivy.plugins.signer;version="2.2.0",
org.apache.ivy.plugins.signer.bouncycastle;version="2.2.0",
org.apache.ivy.plugins.trigger;version="2.0.0",
org.apache.ivy.plugins.version;version="2.0.0",
org.apache.ivy.plugins.version;version="2.6.0",
org.apache.ivy.tools.analyser;version="2.0.0",
org.apache.ivy.util;version="2.0.0",
org.apache.ivy.util.cli;version="2.0.0",
Expand Down
23 changes: 9 additions & 14 deletions src/java/org/apache/ivy/ant/IvyBuildNumber.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,20 +47,15 @@
public class IvyBuildNumber extends IvyTask {

public static class ResolvedModuleRevisionArtifactInfo implements ArtifactInfo {
private ModuleRevisionId rmr;
private ModuleRevisionId mrid;

public ResolvedModuleRevisionArtifactInfo(ModuleRevisionId rmr) {
this.rmr = rmr;
public ResolvedModuleRevisionArtifactInfo(ModuleRevisionId mrid) {
this.mrid = mrid;
}

public String getRevision() {
return rmr.getRevision();
return mrid.getRevision();
}

public long getLastModified() {
return -1;
}

}

private String organisation;
Expand Down Expand Up @@ -219,17 +214,17 @@ public String getName() {
ResolvedModuleRevisionArtifactInfo info = (ResolvedModuleRevisionArtifactInfo) iter
.previous();

if (!matcher.accept(askedMrid, info.rmr)) {
if (!matcher.accept(askedMrid, info.mrid)) {
continue;
}

if (matcher.needModuleDescriptor(askedMrid, info.rmr)) {
ResolvedModuleRevision rmr = ivy.findModule(info.rmr);
if (matcher.needModuleDescriptor(askedMrid, info.mrid)) {
ResolvedModuleRevision rmr = ivy.findModule(info.mrid);
if (matcher.accept(askedMrid, rmr.getDescriptor())) {
foundRevision = info.rmr.getRevision();
foundRevision = info.mrid.getRevision();
}
} else {
foundRevision = info.rmr.getRevision();
foundRevision = info.mrid.getRevision();
}

if (foundRevision != null) {
Expand Down
73 changes: 36 additions & 37 deletions src/java/org/apache/ivy/ant/IvyDependencyUpdateChecker.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,16 @@
package org.apache.ivy.ant;

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import org.apache.ivy.core.module.descriptor.Configuration;
import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor;
import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.core.report.ConfigurationResolveReport;
import org.apache.ivy.core.report.ResolveReport;
import org.apache.ivy.core.resolve.IvyNode;
import org.apache.ivy.core.resolve.ResolveOptions;
Expand Down Expand Up @@ -127,34 +130,43 @@ private ModuleDescriptor createModuleDescriptorForRevisionToCheck() {
}

private void displayDependencyUpdates(ResolveReport originalReport, ResolveReport latestReport) {
log("Dependencies updates available :");
boolean dependencyUpdateDetected = false;
for (IvyNode latest : latestReport.getDependencies()) {
for (IvyNode originalDependency : originalReport.getDependencies()) {
if (latest.getModuleId().equals(originalDependency.getModuleId())) {
ArtifactInfo in1 = toArtifactInfo(latest);
ArtifactInfo in2 = toArtifactInfo(originalDependency);
ArtifactInfo out = getLatestStrategy(originalDependency).findLatest(new ArtifactInfo[]{in1, in2}, null);
if (out == in1) {
// is this dependency a transitive or a direct dependency?
// (unfortunately .isTransitive() methods do not have the same meaning)
boolean isTransitiveDependency = latest.getDependencyDescriptor(latest
.getRoot()) == null;
if (!isTransitiveDependency || showTransitive) {
log(String.format("\t%s#%s%s\t%s -> %s",
originalDependency.getResolvedId().getOrganisation(),
originalDependency.getResolvedId().getName(),
isTransitiveDependency ? " (transitive)" : "",
originalDependency.getResolvedId().getRevision(),
latest.getResolvedId().getRevision()));
dependencyUpdateDetected = true;
}
Set<String> updates = new LinkedHashSet<>();

for (String conf : latestReport.getConfigurations()) {
ConfigurationResolveReport newReport = latestReport.getConfigurationReport(conf);
ConfigurationResolveReport oldReport = originalReport.getConfigurationReport(conf);

// NOTE: getModuleRevisionIds() filters evicted and problem deps
for (ModuleRevisionId latest : newReport.getModuleRevisionIds()) {
Iterable<IvyNode> iter = oldReport.getNodes(latest.getModuleId());
if (iter == null) {
continue;
}
for (IvyNode node : iter) {
ArtifactInfo in1 = latest::getRevision;
ArtifactInfo in2 = node.getResolvedId()::getRevision;
ArtifactInfo out = getLatestStrategy(node).findLatest(new ArtifactInfo[]{in1, in2}, null);

boolean revisionGT = (out == in1);
boolean transitive = (node.getDependencyDescriptor(node.getRoot()) == null);
if (revisionGT && (!transitive || showTransitive)) {
String update = String.format("\t%s#%s%s\t%s -> %s",
node.getResolvedId().getOrganisation(),
node.getResolvedId().getName(),
transitive ? " (transitive)" : "",
node.getResolvedId().getRevision(),
latest.getRevision());
updates.add(update);
}
}
}
}
if (!dependencyUpdateDetected) {
log("\tAll dependencies are up to date");

log("Dependencies updates available :");
if (updates.isEmpty()) {
log("All dependencies are up to date");
} else {
updates.forEach(this::log);
}
}

Expand Down Expand Up @@ -210,17 +222,4 @@ private LatestStrategy getLatestStrategy(IvyNode node) {
}
return getSettings().getDefaultLatestStrategy();
}

private static ArtifactInfo toArtifactInfo(IvyNode node) {
return new ArtifactInfo() {
@Override
public String getRevision() {
return node.getResolvedId().getRevision();
}
@Override
public long getLastModified() {
return node.getLastModified();
}
};
}
}
6 changes: 5 additions & 1 deletion src/java/org/apache/ivy/plugins/latest/ArtifactInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,12 @@
*/
package org.apache.ivy.plugins.latest;

@FunctionalInterface
public interface ArtifactInfo {

String getRevision();

long getLastModified();
default long getLastModified() {
return 0;
}
}
23 changes: 3 additions & 20 deletions src/java/org/apache/ivy/plugins/version/VersionRangeMatcher.java
Original file line number Diff line number Diff line change
Expand Up @@ -98,31 +98,14 @@ public class VersionRangeMatcher extends AbstractVersionMatcher {
private static final Pattern ALL_RANGE = Pattern.compile(FINITE_PATTERN + "|"
+ LOWER_INFINITE_PATTERN + "|" + UPPER_INFINITE_PATTERN);

private final class MRIDArtifactInfo implements ArtifactInfo {
private ModuleRevisionId mrid;

public MRIDArtifactInfo(ModuleRevisionId id) {
mrid = id;
}

public long getLastModified() {
return 0;
}

public String getRevision() {
return mrid.getRevision();
}
}

private final Comparator<ModuleRevisionId> comparator = new Comparator<ModuleRevisionId>() {
public int compare(ModuleRevisionId o1, ModuleRevisionId o2) {
if (o1.equals(o2)) {
return 0;
}
ArtifactInfo art1 = new MRIDArtifactInfo(o1);
ArtifactInfo art2 = new MRIDArtifactInfo(o2);
ArtifactInfo art = getLatestStrategy().findLatest(new ArtifactInfo[] {art1, art2},
null);
ArtifactInfo art1 = o1::getRevision;
ArtifactInfo art2 = o2::getRevision;
ArtifactInfo art = getLatestStrategy().findLatest(new ArtifactInfo[] {art1, art2}, null);
return art == art1 ? -1 : 1;
}
};
Expand Down
10 changes: 6 additions & 4 deletions test/java/org/apache/ivy/ant/IvyDependencyUpdateCheckerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -261,9 +261,11 @@ public void testSimpleExtends() {
assertLogContaining("org1#mod1.2\t2.0 -> 2.2");
// ivy-extends-multiconf.xml declares org2:mod2.1:0.3
assertLogContaining("org2#mod2.1\t0.3 -> 0.7");
// org2:mod2.1:0.3 ivy.xml declares org1:mod1.1:1.0
assertLogContaining("org1#mod1.1\t1.0 -> 2.0");
// org1:mod1.1:2.0 ivy.xml declares org1:mod1.2:2.1
assertLogContaining("org1#mod1.2\t2.1 -> 2.2");
// org2:mod2.1:0.3 ivy.xml declares org1:mod1.1:1.0 -- but showTransitives is false
assertLogNotContaining("org1#mod1.1\t1.0 -> 2.0");
assertLogNotContaining("org1#mod1.1 (transitive)\t1.0 -> 2.0");
// org1:mod1.1:2.0 ivy.xml declares org1:mod1.2:2.1 -- it evicted direct dependency
assertLogNotContaining("org1#mod1.2\t2.1 -> 2.2");
assertLogNotContaining("org1#mod1.2 (transitive)\t2.1 -> 2.2");
}
}