diff --git a/CHANGES.txt b/CHANGES.txt
index 9b600c75..9e2e532f 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -17,6 +17,7 @@ for detailed view of each issue, please consult http://issues.apache.org/jira/br
- IMPROVE: New "modules in use" section in console report at the end of resolve (IVY-373) (thanks to John Wiliams)
- IMPROVE: Generated XML reports now contains more information about the resolved module (IVY-408)
+- FIX: Dynamic revision not calculated properly when using multiple directories (IVY-427)
- FIX: LatestRevisionStrategy.sort() doesn't sort as specified (IVY-435)
- FIX: setting m2compatible on ibiblio resolver overwrite root and pattern settings (IVY-437)
- FIX: ivy.revision property not set correctly for second resolve (IVY-429)
diff --git a/src/java/org/apache/ivy/plugins/resolver/AbstractResourceResolver.java b/src/java/org/apache/ivy/plugins/resolver/AbstractResourceResolver.java
index dc439e60..a7f5b247 100644
--- a/src/java/org/apache/ivy/plugins/resolver/AbstractResourceResolver.java
+++ b/src/java/org/apache/ivy/plugins/resolver/AbstractResourceResolver.java
@@ -32,11 +32,15 @@ import org.apache.ivy.core.IvyPatternHelper;
import org.apache.ivy.core.module.descriptor.Artifact;
import org.apache.ivy.core.module.descriptor.DefaultArtifact;
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.resolve.ResolveData;
import org.apache.ivy.core.settings.IvyPattern;
+import org.apache.ivy.plugins.latest.LatestStrategy;
+import org.apache.ivy.plugins.resolver.util.MDResolvedResource;
import org.apache.ivy.plugins.resolver.util.ResolvedResource;
import org.apache.ivy.plugins.resolver.util.ResourceMDParser;
+import org.apache.ivy.plugins.version.VersionMatcher;
import org.apache.ivy.util.Message;
@@ -79,15 +83,78 @@ public abstract class AbstractResourceResolver extends BasicResolver {
protected ResolvedResource findResourceUsingPatterns(ModuleRevisionId moduleRevision, List patternList, Artifact artifact, ResourceMDParser rmdparser, Date date) {
ResolvedResource rres = null;
- for (Iterator iter = patternList.iterator(); iter.hasNext() && rres == null;) {
+
+ List resolvedResources = new ArrayList();
+ boolean dynamic = getSettings().getVersionMatcher().isDynamic(moduleRevision);
+ boolean stop = false;
+ for (Iterator iter = patternList.iterator(); iter.hasNext() && !stop;) {
String pattern = (String)iter.next();
rres = findResourceUsingPattern(moduleRevision, pattern, artifact, rmdparser, date);
+ if (rres != null) {
+ resolvedResources.add(rres);
+ stop = !dynamic; // stop iterating if we are not searching a dynamic revision
+ }
}
+
+ if (resolvedResources.size() > 1) {
+ ResolvedResource[] rress = (ResolvedResource[]) resolvedResources.toArray(new ResolvedResource[resolvedResources.size()]);
+ rres = findResource(rress, getName(), getLatestStrategy(), getSettings().getVersionMatcher(), rmdparser, moduleRevision, date);
+ }
+
return rres;
}
protected abstract ResolvedResource findResourceUsingPattern(ModuleRevisionId mrid, String pattern, Artifact artifact, ResourceMDParser rmdparser, Date date);
+ public static ResolvedResource findResource(
+ ResolvedResource[] rress,
+ String name,
+ LatestStrategy strategy,
+ VersionMatcher versionMatcher,
+ ResourceMDParser rmdparser,
+ ModuleRevisionId mrid,
+ Date date) {
+ ResolvedResource found = null;
+ List sorted = strategy.sort(rress);
+ for (ListIterator iter = sorted.listIterator(sorted.size()); iter.hasPrevious();) {
+ ResolvedResource rres = (ResolvedResource) iter.previous();
+ if ((date != null && rres.getLastModified() > date.getTime())) {
+ Message.debug("\t"+name+": too young: "+rres);
+ continue;
+ }
+ ModuleRevisionId foundMrid = ModuleRevisionId.newInstance(mrid, rres.getRevision());
+ if (!versionMatcher.accept(mrid, foundMrid)) {
+ Message.debug("\t"+name+": rejected by version matcher: "+rres);
+ continue;
+ }
+ if (versionMatcher.needModuleDescriptor(mrid, foundMrid)) {
+ ResolvedResource r = rmdparser.parse(rres.getResource(), rres.getRevision());
+ ModuleDescriptor md = ((MDResolvedResource)r).getResolvedModuleRevision().getDescriptor();
+ if (md.isDefault()) {
+ Message.debug("\t"+name+": default md rejected by version matcher requiring module descriptor: "+rres);
+ continue;
+ } else if (!versionMatcher.accept(mrid, md)) {
+ Message.debug("\t"+name+": md rejected by version matcher: "+rres);
+ continue;
+ } else {
+ found = r;
+ }
+ } else {
+ found = rres;
+ }
+
+ if (found != null) {
+ if (!found.getResource().exists()) {
+ Message.debug("\t"+name+": resource not reachable for "+mrid+": res="+found.getResource());
+ continue;
+ }
+ break;
+ }
+ }
+
+ return found;
+ }
+
/**
* Output message to log indicating what have been done to look for an artifact which
* has finally not been found
diff --git a/src/java/org/apache/ivy/plugins/resolver/RepositoryResolver.java b/src/java/org/apache/ivy/plugins/resolver/RepositoryResolver.java
index 5e4d3537..a744ac2a 100644
--- a/src/java/org/apache/ivy/plugins/resolver/RepositoryResolver.java
+++ b/src/java/org/apache/ivy/plugins/resolver/RepositoryResolver.java
@@ -122,46 +122,14 @@ public class RepositoryResolver extends AbstractResourceResolver {
Message.debug("\t"+name+": unable to list resources for "+mrid+": pattern="+pattern);
return null;
} else {
- ResolvedResource found = null;
- List sorted = strategy.sort(rress);
- for (Iterator iter = sorted.iterator(); iter.hasNext();) {
- ResolvedResource rres = (ResolvedResource) iter.next();
- if ((date != null && rres.getLastModified() > date.getTime())) {
- Message.debug("\t"+name+": too young: "+rres);
- continue;
- }
- ModuleRevisionId foundMrid = ModuleRevisionId.newInstance(mrid, rres.getRevision());
- if (!versionMatcher.accept(mrid, foundMrid)) {
- Message.debug("\t"+name+": rejected by version matcher: "+rres);
- continue;
- }
- if (versionMatcher.needModuleDescriptor(mrid, foundMrid)) {
- ResolvedResource r = rmdparser.parse(rres.getResource(), rres.getRevision());
- ModuleDescriptor md = ((MDResolvedResource)r).getResolvedModuleRevision().getDescriptor();
- if (md.isDefault()) {
- Message.debug("\t"+name+": default md rejected by version matcher requiring module descriptor: "+rres);
- continue;
- } else if (!versionMatcher.accept(mrid, md)) {
- Message.debug("\t"+name+": md rejected by version matcher: "+rres);
- continue;
- } else {
- found = r;
- }
-
- } else {
- found = rres;
- }
- }
+ ResolvedResource found = findResource(rress, name, strategy, versionMatcher, rmdparser, mrid, date);
if (found == null) {
Message.debug("\t"+name+": no resource found for "+mrid+": pattern="+pattern);
- } else if (!found.getResource().exists()) {
- Message.debug("\t"+name+": resource not reachable for "+mrid+": res="+found.getResource());
- return null;
}
return found;
}
}
-
+
protected long get(Resource resource, File dest) throws IOException {
Message.verbose("\t"+getName()+": downloading "+resource.getName());
Message.debug("\t\tto "+dest);
diff --git a/test/java/org/apache/ivy/core/resolve/ResolveTest.java b/test/java/org/apache/ivy/core/resolve/ResolveTest.java
index aef344e8..9f402d72 100644
--- a/test/java/org/apache/ivy/core/resolve/ResolveTest.java
+++ b/test/java/org/apache/ivy/core/resolve/ResolveTest.java
@@ -22,6 +22,7 @@ import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.List;
import java.util.Set;
import javax.xml.parsers.SAXParser;
@@ -47,7 +48,6 @@ import org.apache.ivy.plugins.circular.CircularDependencyException;
import org.apache.ivy.plugins.circular.ErrorCircularDependencyStrategy;
import org.apache.ivy.plugins.circular.IgnoreCircularDependencyStrategy;
import org.apache.ivy.plugins.circular.WarnCircularDependencyStrategy;
-import org.apache.ivy.plugins.report.XmlReportOutputter;
import org.apache.ivy.plugins.resolver.BasicResolver;
import org.apache.ivy.plugins.resolver.DependencyResolver;
import org.apache.ivy.plugins.resolver.DualResolver;
@@ -2740,6 +2740,26 @@ public class ResolveTest extends TestCase {
cache2.delete();
}
}
+
+ public void testResolveWithMultipleIvyPatterns() throws Exception {
+ Ivy ivy = new Ivy();
+ ivy.configure(new File("test/repositories/multi-ivypattern/ivyconf.xml"));
+
+ ModuleRevisionId module = ModuleRevisionId.newInstance("org1", "mod1.1", "1.+");
+
+ // use a non-default cache
+ ResolveOptions options = getResolveOptions(ivy.getSettings(), new String[] {"*"});
+ options.setTransitive(false);
+ options.setUseOrigin(true);
+ options.setDownload(false);
+ ResolveReport report = ivy.getResolveEngine().resolve(module, options, false);
+
+ List dependencies = report.getDependencies();
+ assertNotNull(dependencies);
+ assertEquals(1, dependencies.size());
+ IvyNode dependency = (IvyNode) dependencies.get(0);
+ assertEquals("1.1", dependency.getResolvedId().getRevision());
+ }
////////////////////////////////////////////////////////////
// helper methods to ease the tests
diff --git a/test/repositories/multi-ivypattern/ivy1/ivy-1.0.xml b/test/repositories/multi-ivypattern/ivy1/ivy-1.0.xml
new file mode 100644
index 00000000..0694339e
--- /dev/null
+++ b/test/repositories/multi-ivypattern/ivy1/ivy-1.0.xml
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/test/repositories/multi-ivypattern/ivy2/ivy-1.1.xml b/test/repositories/multi-ivypattern/ivy2/ivy-1.1.xml
new file mode 100644
index 00000000..ec3e9abc
--- /dev/null
+++ b/test/repositories/multi-ivypattern/ivy2/ivy-1.1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/test/repositories/multi-ivypattern/ivyconf.xml b/test/repositories/multi-ivypattern/ivyconf.xml
new file mode 100644
index 00000000..cde3af2f
--- /dev/null
+++ b/test/repositories/multi-ivypattern/ivyconf.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/test/repositories/multi-ivypattern/jars/mod-1.0.jar b/test/repositories/multi-ivypattern/jars/mod-1.0.jar
new file mode 100644
index 00000000..56f3b36e
--- /dev/null
+++ b/test/repositories/multi-ivypattern/jars/mod-1.0.jar
@@ -0,0 +1 @@
+
diff --git a/test/repositories/multi-ivypattern/jars/mod-1.1.jar b/test/repositories/multi-ivypattern/jars/mod-1.1.jar
new file mode 100644
index 00000000..56f3b36e
--- /dev/null
+++ b/test/repositories/multi-ivypattern/jars/mod-1.1.jar
@@ -0,0 +1 @@
+