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