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 @@ + + + + + + + + + + +