diff --git a/CHANGES.txt b/CHANGES.txt index 982981f7..635b7a7a 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -8,7 +8,7 @@ for detailed view of each issue, please consult http://issues.apache.org/jira/br Committers Maarten Coene Xavier Hanin - Nicolas Lalevée + Nicolas Lalevee Gilles Scokart Contributors @@ -95,7 +95,8 @@ for detailed view of each issue, please consult http://issues.apache.org/jira/br - FIX: PomModuleDescriptorBuilder does not resolve ejb type dependencies to jar extension (IVY-1058) (thanks to Andrey Lomakin) - FIX: Ivy doesn't handle maven dependencies with type 'test-jar' correctly (IVY-1066) - FIX: transitive dependencies and conflict management (IVY-1083) - +- FIX: exclude does not work in non-trivial conf case (IVY-983) + 2.1.0-rc1 ===================================== - IMPROVEMENT: Fail the retrieve when multiple artifacts of same module are mapped to same file (IVY-1050) diff --git a/src/java/org/apache/ivy/core/resolve/IvyNode.java b/src/java/org/apache/ivy/core/resolve/IvyNode.java index 9c904e57..63c2c718 100644 --- a/src/java/org/apache/ivy/core/resolve/IvyNode.java +++ b/src/java/org/apache/ivy/core/resolve/IvyNode.java @@ -348,7 +348,7 @@ public class IvyNode implements Comparable { depNode.addRootModuleConfigurations(depNode.usage, rootModuleConf, confsArray); depNode.usage.setRequiredConfs(this, conf, confs); - depNode.addCaller(rootModuleConf, this, conf, dependencyConfigurations, dd); + depNode.addCaller(rootModuleConf, this, conf, requestedConf, dependencyConfigurations, dd); dependencies.add(depNode); } return dependencies; @@ -1021,8 +1021,8 @@ public class IvyNode implements Comparable { } public void addCaller(String rootModuleConf, IvyNode callerNode, String callerConf, - String[] dependencyConfs, DependencyDescriptor dd) { - callers.addCaller(rootModuleConf, callerNode, callerConf, dependencyConfs, dd); + String requestedConf, String[] dependencyConfs, DependencyDescriptor dd) { + callers.addCaller(rootModuleConf, callerNode, callerConf, requestedConf, dependencyConfs, dd); boolean isCircular = callers.getAllCallersModuleIds().contains(getId().getModuleId()); if (isCircular) { IvyContext.getContext().getCircularDependencyStrategy().handleCircularDependency( diff --git a/src/java/org/apache/ivy/core/resolve/IvyNodeCallers.java b/src/java/org/apache/ivy/core/resolve/IvyNodeCallers.java index 0b6e470c..d2555dce 100644 --- a/src/java/org/apache/ivy/core/resolve/IvyNodeCallers.java +++ b/src/java/org/apache/ivy/core/resolve/IvyNodeCallers.java @@ -17,16 +17,19 @@ */ package org.apache.ivy.core.resolve; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.Stack; import org.apache.ivy.core.module.descriptor.Artifact; +import org.apache.ivy.core.module.descriptor.Configuration; import org.apache.ivy.core.module.descriptor.DependencyDescriptor; import org.apache.ivy.core.module.descriptor.ModuleDescriptor; import org.apache.ivy.core.module.id.ModuleId; @@ -55,6 +58,17 @@ public class IvyNodeCallers { } public void addConfiguration(String callerConf, String[] dependencyConfs) { + updateConfs(callerConf, dependencyConfs); + Configuration conf = md.getConfiguration(callerConf); + String[] confExtends = conf.getExtends(); + if (confExtends != null) { + for (int i = 0; i < confExtends.length; i++) { + addConfiguration(confExtends[i], dependencyConfs); + } + } + } + + private void updateConfs(String callerConf, String[] dependencyConfs) { String[] prevDepConfs = (String[]) confs.get(callerConf); if (prevDepConfs != null) { Set newDepConfs = new HashSet(Arrays.asList(prevDepConfs)); @@ -146,7 +160,7 @@ public class IvyNodeCallers { * the dependency revision id asked by the caller */ public void addCaller(String rootModuleConf, IvyNode callerNode, String callerConf, - String[] dependencyConfs, DependencyDescriptor dd) { + String requestedConf, String[] dependencyConfs, DependencyDescriptor dd) { ModuleDescriptor md = callerNode.getDescriptor(); ModuleRevisionId mrid = callerNode.getResolvedId(); if (mrid.getModuleId().equals(node.getId().getModuleId())) { @@ -163,7 +177,7 @@ public class IvyNodeCallers { caller = new Caller(md, mrid, dd, callerNode.canExclude(rootModuleConf)); callers.put(mrid, caller); } - caller.addConfiguration(callerConf, dependencyConfs); + caller.addConfiguration(requestedConf, dependencyConfs); IvyNode parent = callerNode.getRealNode(); for (Iterator iter = parent.getAllCallersModuleIds().iterator(); iter.hasNext();) { diff --git a/test/java/org/apache/ivy/core/resolve/ResolveTest.java b/test/java/org/apache/ivy/core/resolve/ResolveTest.java index 6d8aaae3..66b999eb 100644 --- a/test/java/org/apache/ivy/core/resolve/ResolveTest.java +++ b/test/java/org/apache/ivy/core/resolve/ResolveTest.java @@ -3605,6 +3605,34 @@ public class ResolveTest extends TestCase { assertFalse(getArchiveFileInCache("org1", "mod1.2", "2.0", "mod1.2", "jar", "jar").exists()); } + public void testResolveExcludesConf() throws Exception { + // mod2.6 depends on mod2.3 in conf default and mod2.5 in conf exclude + // mod2.5 depends on mod2.3 + // mod2.6 globally exclude mod2.3 in conf exclude + ResolveReport report = ivy.resolve(new File( + "test/repositories/1/org2/mod2.6/ivys/ivy-0.13.xml").toURL(), + getResolveOptions(new String[] {"include"})); + ModuleDescriptor md = report.getModuleDescriptor(); + assertEquals(ModuleRevisionId.newInstance("org2", "mod2.6", "0.13"), md + .getModuleRevisionId()); + + assertTrue(getIvyFileInCache( + ModuleRevisionId.newInstance("org2", "mod2.3", "0.4")).exists()); + } + + public void testResolveExcludesConf2() throws Exception { + // same as testResolveExcludesConf + ResolveReport report = ivy.resolve(new File( + "test/repositories/1/org2/mod2.6/ivys/ivy-0.13.xml").toURL(), + getResolveOptions(new String[] {"exclude"})); + ModuleDescriptor md = report.getModuleDescriptor(); + assertEquals(ModuleRevisionId.newInstance("org2", "mod2.6", "0.13"), md + .getModuleRevisionId()); + + assertFalse(getIvyFileInCache( + ModuleRevisionId.newInstance("org2", "mod2.3", "0.4")).exists()); + } + public void testResolveExceptConfiguration() throws Exception { // mod10.2 depends on mod5.1 conf *, !A ivy.resolve(new File("test/repositories/2/mod10.2/ivy-2.0.xml").toURL(), diff --git a/test/repositories/1/org2/mod2.5/ivys/ivy-0.9.xml b/test/repositories/1/org2/mod2.5/ivys/ivy-0.9.xml new file mode 100644 index 00000000..dd28357c --- /dev/null +++ b/test/repositories/1/org2/mod2.5/ivys/ivy-0.9.xml @@ -0,0 +1,28 @@ + + + + + + + diff --git a/test/repositories/1/org2/mod2.6/ivys/ivy-0.13.xml b/test/repositories/1/org2/mod2.6/ivys/ivy-0.13.xml new file mode 100644 index 00000000..b54eb5a9 --- /dev/null +++ b/test/repositories/1/org2/mod2.6/ivys/ivy-0.13.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + +