mirror of https://github.com/apache/ant-ivy
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:
parent
77680e867c
commit
f9190252b2
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -0,0 +1 @@
|
|||
|
||||
|
|
@ -0,0 +1 @@
|
|||
|
||||
Loading…
Reference in New Issue