diff --git a/src/java/org/apache/ivy/ant/IvyDependencyUpdateChecker.java b/src/java/org/apache/ivy/ant/IvyDependencyUpdateChecker.java
index d467d23ce..4b5a71385 100644
--- a/src/java/org/apache/ivy/ant/IvyDependencyUpdateChecker.java
+++ b/src/java/org/apache/ivy/ant/IvyDependencyUpdateChecker.java
@@ -28,6 +28,10 @@
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.ivy.plugins.latest.LatestStrategy;
+import org.apache.ivy.plugins.resolver.DependencyResolver;
+import org.apache.ivy.plugins.resolver.util.HasLatestStrategy;
import org.apache.tools.ant.BuildException;
@@ -127,9 +131,11 @@ private void displayDependencyUpdates(ResolveReport originalReport, ResolveRepor
boolean dependencyUpdateDetected = false;
for (IvyNode latest : latestReport.getDependencies()) {
for (IvyNode originalDependency : originalReport.getDependencies()) {
- if (originalDependency.getModuleId().equals(latest.getModuleId())) {
- if (!originalDependency.getResolvedId().getRevision()
- .equals(latest.getResolvedId().getRevision())) {
+ 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
@@ -144,7 +150,6 @@ private void displayDependencyUpdates(ResolveReport originalReport, ResolveRepor
dependencyUpdateDetected = true;
}
}
-
}
}
}
@@ -195,4 +200,27 @@ private void displayNewDependencyOnLatest(ResolveReport originalReport, ResolveR
}
}
}
+
+ //--------------------------------------------------------------------------
+
+ private LatestStrategy getLatestStrategy(IvyNode node) {
+ DependencyResolver resolver = getSettings().getResolver(node.getResolvedId());
+ if (resolver instanceof HasLatestStrategy) {
+ return ((HasLatestStrategy) resolver).getLatestStrategy();
+ }
+ 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();
+ }
+ };
+ }
}
diff --git a/test/java/org/apache/ivy/ant/IvyDependencyUpdateCheckerTest.java b/test/java/org/apache/ivy/ant/IvyDependencyUpdateCheckerTest.java
index 26f14e849..48565de11 100644
--- a/test/java/org/apache/ivy/ant/IvyDependencyUpdateCheckerTest.java
+++ b/test/java/org/apache/ivy/ant/IvyDependencyUpdateCheckerTest.java
@@ -220,6 +220,26 @@ public void testResolveWithRelativeFile() {
assertLogContaining("org1#mod1.2\t2.0 -> 2.2");
}
+ /**
+ * Test case for IVY-1665.
+ *
+ * @see IVY-1665
+ */
+ @Test
+ public void testLatestRelease() {
+ dependencyUpdateChecker.getProject().setProperty("ivy.settings.file", "test/repositories/IVY-1665/ivysettings.xml");
+ dependencyUpdateChecker.setRevisionToCheck("latest.release"); // exclude milestone (2.0-M1)
+ dependencyUpdateChecker.setOrganisation("bar");
+ dependencyUpdateChecker.setModule("foo");
+ dependencyUpdateChecker.setRevision("2.0-M1");
+ dependencyUpdateChecker.setInline(true);
+ dependencyUpdateChecker.execute();
+
+ assertLogNotContaining("bar#foo\t2.0-M1 -> 1.0");
+ // expect listing for 2.0 when it comes available
+ assertLogContaining("All dependencies are up to date");
+ }
+
@Test
public void testSimpleExtends() {
dependencyUpdateChecker.setFile(new File("test/java/org/apache/ivy/ant/ivy-extends-multiconf.xml"));
diff --git a/test/repositories/IVY-1665/bar/foo/foo-1.0.jar b/test/repositories/IVY-1665/bar/foo/foo-1.0.jar
new file mode 100644
index 000000000..945c9b46d
--- /dev/null
+++ b/test/repositories/IVY-1665/bar/foo/foo-1.0.jar
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/test/repositories/IVY-1665/bar/foo/foo-2.0-M1.jar b/test/repositories/IVY-1665/bar/foo/foo-2.0-M1.jar
new file mode 100644
index 000000000..945c9b46d
--- /dev/null
+++ b/test/repositories/IVY-1665/bar/foo/foo-2.0-M1.jar
@@ -0,0 +1 @@
+.
\ No newline at end of file
diff --git a/test/repositories/IVY-1665/bar/foo/ivy-1.0.xml b/test/repositories/IVY-1665/bar/foo/ivy-1.0.xml
new file mode 100644
index 000000000..75071478a
--- /dev/null
+++ b/test/repositories/IVY-1665/bar/foo/ivy-1.0.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
diff --git a/test/repositories/IVY-1665/bar/foo/ivy-2.0-M1.xml b/test/repositories/IVY-1665/bar/foo/ivy-2.0-M1.xml
new file mode 100644
index 000000000..341093d7e
--- /dev/null
+++ b/test/repositories/IVY-1665/bar/foo/ivy-2.0-M1.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
diff --git a/test/repositories/IVY-1665/ivysettings.xml b/test/repositories/IVY-1665/ivysettings.xml
new file mode 100644
index 000000000..908e5d482
--- /dev/null
+++ b/test/repositories/IVY-1665/ivysettings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+