Dynamic revision not calculated properly when using multiple directories (IVY-427)

git-svn-id: https://svn.apache.org/repos/asf/incubator/ivy/core/trunk@519738 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Maarten Coene 2007-03-18 23:38:23 +00:00
parent 77680e867c
commit f9190252b2
9 changed files with 124 additions and 36 deletions

View File

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

View File

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

View File

@ -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);

View File

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

View File

@ -0,0 +1,9 @@
<ivy-module version="1.0">
<info organisation="org1"
module="mod1.1"
revision="1.0"
status="integration"
publication="20041101110000"
/>
<dependencies />
</ivy-module>

View File

@ -0,0 +1,11 @@
<ivy-module version="1.0">
<info organisation="org1"
module="mod1.1"
revision="1.1"
status="integration"
publication="20050102110000"
/>
<dependencies>
<dependency name="mod1.2" rev="2.1"/>
</dependencies>
</ivy-module>

View File

@ -0,0 +1,10 @@
<ivyconf>
<conf defaultCache="build/cache" defaultResolver="multi-ivy"/>
<resolvers>
<filesystem name="multi-ivy">
<ivy pattern="test/repositories/multi-ivypattern/ivy1/ivy-[revision].xml" />
<ivy pattern="test/repositories/multi-ivypattern/ivy2/ivy-[revision].xml" />
<artifact pattern="test/repositories/multi-ivypattern/jars/mod-[revision].jar" />
</filesystem>
</resolvers>
</ivyconf>

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@