From 1aace0875a7f989595bec96bdce292b9aefd7dae Mon Sep 17 00:00:00 2001 From: tbingaman Date: Thu, 4 Sep 2014 09:36:41 -0400 Subject: [PATCH 2/2] Ensure dependency is applicable to all confs of matching top-level dep before replacing resolved rev. Fixes [IVY-1485] --- src/java/org/apache/ivy/core/resolve/IvyNode.java | 2 +- .../org/apache/ivy/core/resolve/ResolveEngine.java | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/ivy/core/resolve/IvyNode.java b/src/java/org/apache/ivy/core/resolve/IvyNode.java index dec51d5..1645e8f 100644 --- a/src/java/org/apache/ivy/core/resolve/IvyNode.java +++ b/src/java/org/apache/ivy/core/resolve/IvyNode.java @@ -428,7 +428,7 @@ public class IvyNode implements Comparable { return loadedRootModuleConfs.add(rootModuleConf); } - private boolean isRootModuleConfLoaded(String rootModuleConf) { + public boolean isRootModuleConfLoaded(String rootModuleConf) { return loadedRootModuleConfs.contains(rootModuleConf); } diff --git a/src/java/org/apache/ivy/core/resolve/ResolveEngine.java b/src/java/org/apache/ivy/core/resolve/ResolveEngine.java index bb3bc95..0ff4db0 100644 --- a/src/java/org/apache/ivy/core/resolve/ResolveEngine.java +++ b/src/java/org/apache/ivy/core/resolve/ResolveEngine.java @@ -69,6 +69,7 @@ import org.apache.ivy.plugins.parser.ModuleDescriptorParserRegistry; import org.apache.ivy.plugins.repository.url.URLResource; import org.apache.ivy.plugins.resolver.DependencyResolver; import org.apache.ivy.plugins.version.VersionMatcher; +import org.apache.ivy.util.ConfigurationUtils; import org.apache.ivy.util.Message; import org.apache.ivy.util.filter.Filter; @@ -314,11 +315,28 @@ public class ResolveEngine { String forcedRev = forcedRevisionId == null ? rev : forcedRevisionId .getRevision(); + String[] moduleConfigurations = ConfigurationUtils.replaceWildcards( + dd.getModuleConfigurations(), md); + boolean dependencyConfApplicableToAllTopLevelDepConfs = true; + for (int j = 0; j < moduleConfigurations.length; j++) { + if (!dependencies[i] + .isRootModuleConfLoaded(moduleConfigurations[j])) { + dependencyConfApplicableToAllTopLevelDepConfs = false; + break; + } + } + // The evicted modules have no description, so we can't put the status String status = depDescriptor == null ? "?" : depDescriptor.getStatus(); Message.debug("storing dependency " + depResolvedId + " in props"); - props.put(depRevisionId.encodeToString(), rev + " " + status + " " - + forcedRev + " " + depResolvedId.getBranch()); + String depRevisionIdString = depRevisionId.encodeToString(); + // don't replace a dep revision we've already added unless it is + // applicable to all the confs of the matching top-level dep. + if (!props.containsKey(depRevisionIdString) + || dependencyConfApplicableToAllTopLevelDepConfs) { + props.put(depRevisionIdString, rev + " " + status + " " + forcedRev + + " " + depResolvedId.getBranch()); + } } } } -- 2.1.0