Index: src/java/org/apache/ivy/core/resolve/ResolveEngine.java =================================================================== --- src/java/org/apache/ivy/core/resolve/ResolveEngine.java (revision 1132834) +++ src/java/org/apache/ivy/core/resolve/ResolveEngine.java (working copy) @@ -52,6 +52,7 @@ import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor; import org.apache.ivy.core.module.descriptor.DependencyDescriptor; import org.apache.ivy.core.module.descriptor.ModuleDescriptor; +import org.apache.ivy.core.module.id.ModuleId; import org.apache.ivy.core.module.id.ModuleRevisionId; import org.apache.ivy.core.report.ArtifactDownloadReport; import org.apache.ivy.core.report.ConfigurationResolveReport; @@ -65,7 +66,6 @@ import org.apache.ivy.plugins.parser.ModuleDescriptorParser; import org.apache.ivy.plugins.parser.ModuleDescriptorParserRegistry; import org.apache.ivy.plugins.repository.url.URLResource; -import org.apache.ivy.plugins.resolver.CacheResolver; import org.apache.ivy.plugins.resolver.DependencyResolver; import org.apache.ivy.plugins.version.VersionMatcher; import org.apache.ivy.util.Message; @@ -259,12 +259,32 @@ forcedRevisions.put(dependencies[i].getModuleId(), dependencies[i].getResolvedId()); } } + + IvyNode root = dependencies[0].getRoot(); - IvyNode root = dependencies[0].getRoot(); + // (); + Map topLevelDeps = new HashMap(); // for (int i = 0; i < dependencies.length; i++) { if (!dependencies[i].hasProblem()) { DependencyDescriptor dd = dependencies[i].getDependencyDescriptor(root); if (dd != null) { + ModuleId orgMod = dependencies[i].getModuleId(); + topLevelDeps.put(orgMod, dependencies[i]); + } + } + } + + for (int i = 0; i < dependencies.length; i++) { + if (!dependencies[i].hasProblem()) { + DependencyDescriptor dd = dependencies[i].getDependencyDescriptor(root); + if (dd == null) { + ModuleId mid = dependencies[i].getModuleId(); + IvyNode tlDep = (IvyNode)topLevelDeps.get(mid); + if (tlDep != null) { + dd = tlDep.getDependencyDescriptor(root); + } + } + if (dd != null) { ModuleRevisionId depResolvedId = dependencies[i].getResolvedId(); ModuleDescriptor depDescriptor = dependencies[i].getDescriptor(); ModuleRevisionId depRevisionId = dd.getDependencyRevisionId(); @@ -293,9 +313,15 @@ String rev = depResolvedId.getRevision(); String forcedRev = forcedRevisionId == null ? rev : forcedRevisionId.getRevision(); - // The evicted modules have no description, so we can't put the status - String status = depDescriptor == null ? "?" : depDescriptor.getStatus(); - props.put(depRevisionId.encodeToString(), rev + " " + status + " " + forcedRev); + if (!dependencies[i].isCompletelyEvicted()) { + // The evicted modules have no description, so we can't put the status + String status = depDescriptor == null ? "?" : depDescriptor.getStatus(); + Message.info("storing dependency " + depResolvedId + " in props"); + props.put(depRevisionId.encodeToString(), rev + " " + status + " " + forcedRev + " " + depResolvedId.getBranch()); + } + else { + Message.info("not storing dependency " + depResolvedId + " in props"); + } } } } Index: src/java/org/apache/ivy/core/deliver/DeliverEngine.java =================================================================== --- src/java/org/apache/ivy/core/deliver/DeliverEngine.java (revision 1132834) +++ src/java/org/apache/ivy/core/deliver/DeliverEngine.java (working copy) @@ -131,6 +131,7 @@ // 2) parse resolvedRevisions From properties file Map resolvedRevisions = new HashMap(); // Map (ModuleId -> String revision) + Map resolvedBranches = new HashMap(); // Map (ModuleId -> String branch) Map dependenciesStatus = new HashMap(); // Map (ModuleId -> String status) File ivyProperties = getCache().getResolvedIvyPropertiesInCache(mrid); if (!ivyProperties.exists()) { @@ -148,6 +149,11 @@ ModuleRevisionId decodedMrid = ModuleRevisionId.decode(depMridStr); if (options.isResolveDynamicRevisions()) { resolvedRevisions.put(decodedMrid, parts[0]); + if (parts.length >= 4) { + if (parts[3] != null && !"null".equals(parts[3])) { + resolvedBranches.put(decodedMrid, parts[3]); + } + } } dependenciesStatus.put(decodedMrid, parts[1]); @@ -171,14 +177,24 @@ if (rev == null) { rev = dependencies[i].getDependencyRevisionId().getRevision(); } + String bra = (String) resolvedBranches.get(dependencies[i].getDependencyRevisionId()); + if (bra == null || "null".equals(bra)) { + bra = dependencies[i].getDependencyRevisionId().getBranch(); + } String depStatus = (String) dependenciesStatus.get(dependencies[i] .getDependencyRevisionId()); + ModuleRevisionId mrid2 = null; + if (bra == null) { + mrid2 = ModuleRevisionId.newInstance(dependencies[i].getDependencyRevisionId(), rev); + } + else { + mrid2 = ModuleRevisionId.newInstance(dependencies[i].getDependencyRevisionId(), bra, rev); + } resolvedDependencies.put(dependencies[i].getDependencyRevisionId(), options .getPdrResolver().resolve( md, options.getStatus(), - ModuleRevisionId - .newInstance(dependencies[i].getDependencyRevisionId(), rev), + mrid2, depStatus)); } @@ -194,19 +210,22 @@ confsToRemove.removeAll(Arrays.asList(confs)); try { - XmlModuleDescriptorUpdater.update(ivyFileURL, publishedIvy, - new UpdateOptions() - .setSettings(settings) - .setResolvedRevisions(resolvedDependencies) - .setStatus(options.getStatus()) - .setRevision(revision) - .setBranch(options.getPubBranch()) - .setPubdate(options.getPubdate()) - .setGenerateRevConstraint(options.isGenerateRevConstraint()) - .setMerge(options.isMerge()) - .setMergedDescriptor(md) - .setConfsToExclude((String[]) confsToRemove - .toArray(new String[confsToRemove.size()]))); + UpdateOptions opts = new UpdateOptions() + .setSettings(settings) + .setResolvedRevisions(resolvedDependencies) + .setStatus(options.getStatus()) + .setRevision(revision) + .setBranch(options.getPubBranch()) + .setPubdate(options.getPubdate()) + .setGenerateRevConstraint(options.isGenerateRevConstraint()) + .setMerge(options.isMerge()) + .setMergedDescriptor(md) + .setConfsToExclude((String[]) confsToRemove + .toArray(new String[confsToRemove.size()])); + if (!resolvedBranches.isEmpty()) { + opts = opts.setResolvedBranches(resolvedBranches); + } + XmlModuleDescriptorUpdater.update(ivyFileURL, publishedIvy, opts); } catch (SAXException ex) { throw new RuntimeException("bad ivy file in cache for " + mrid + ": please clean '" + ivyFile + "' and resolve again", ex);