IVY-1665: use default LatestStrategy to compare revisions

This commit is contained in:
Eric Milles 2026-06-12 10:19:54 -05:00
parent e6a9db4456
commit fd67cacf14
Failed to extract signature
1 changed files with 14 additions and 35 deletions

View File

@ -28,6 +28,7 @@ import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.core.report.ResolveReport;
import org.apache.ivy.core.resolve.IvyNode;
import org.apache.ivy.core.resolve.ResolveOptions;
import org.apache.ivy.plugins.latest.ArtifactInfo;
import org.apache.tools.ant.BuildException;
@ -128,8 +129,10 @@ public class IvyDependencyUpdateChecker extends IvyPostResolveTask {
for (IvyNode latest : latestReport.getDependencies()) {
for (IvyNode originalDependency : originalReport.getDependencies()) {
if (latest.getModuleId().equals(originalDependency.getModuleId())) {
if (isGreater(latest.getResolvedId().getRevision(),
originalDependency.getResolvedId().getRevision())) {
ArtifactInfo in1 = toArtifactInfo(latest);
ArtifactInfo in2 = toArtifactInfo(originalDependency);
ArtifactInfo out = getSettings().getDefaultLatestStrategy().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
@ -144,7 +147,6 @@ public class IvyDependencyUpdateChecker extends IvyPostResolveTask {
dependencyUpdateDetected = true;
}
}
}
}
}
@ -198,39 +200,16 @@ public class IvyDependencyUpdateChecker extends IvyPostResolveTask {
//--------------------------------------------------------------------------
private static boolean isGreater(String string1, String string2) {
String[] tokens1 = string1.split("[\\._\\-\\+]");
String[] tokens2 = string2.split("[\\._\\-\\+]");
int i = 0;
for (final int n = Math.min(tokens1.length, tokens2.length); i < n; i += 1) {
if (!tokens1[i].equals(tokens2[i])) {
boolean is1Number = isNumeric(tokens1[i]);
boolean is2Number = isNumeric(tokens2[i]);
if (is1Number && is2Number) {
return Long.valueOf(tokens1[i]).compareTo(Long.valueOf(tokens2[i])) > 0;
} else if (is1Number && !is2Number) {
return true;
} else if (!is1Number && is2Number) {
return false;
private static ArtifactInfo toArtifactInfo(IvyNode node) {
return new ArtifactInfo() {
@Override
public String getRevision() {
return node.getResolvedId().getRevision();
}
return true; // special meanings accounted for by resolve
}
}
if (i < tokens1.length) {
return isNumeric(tokens1[i]);
}
if (i < tokens2.length) {
return !isNumeric(tokens2[i]);
}
return false;
}
private static boolean isNumeric(String string) {
for (int i = 0, n = string.length(); i < n; ++i) {
if (!Character.isDigit(string.charAt(i))) {
return false;
}
}
return true;
@Override
public long getLastModified() {
return node.getLastModified();
}
};
}
}