Index: src/java/org/apache/ivy/core/resolve/VisitData.java =================================================================== --- src/java/org/apache/ivy/core/resolve/VisitData.java (revision 961511) +++ src/java/org/apache/ivy/core/resolve/VisitData.java (working copy) @@ -35,6 +35,13 @@ private IvyNode node; /** + * The resolved node for this VisitData. + * Should be set if this VisitData represents data for a resolved revision + * of a module (e.g. 1.1 rather than 1.+). + */ + private IvyNode resolvedNode; + + /** * The associated visit nodes, per rootModuleConf Note that the value is a List, because a node * can be visited from several parents during the resolution process */ @@ -65,6 +72,17 @@ public void setNode(IvyNode node) { this.node = node; } + + /** + * Sets the resolved node to be the current node + */ + public void setResolvedNode() { + this.resolvedNode = node; + } + + public IvyNode getResolvedNode() { + return this.resolvedNode; + } public void addVisitNodes(String rootModuleConf, List visitNodes) { getVisitNodes(rootModuleConf).addAll(visitNodes); Index: src/java/org/apache/ivy/core/resolve/VisitNode.java =================================================================== --- src/java/org/apache/ivy/core/resolve/VisitNode.java (revision 961511) +++ src/java/org/apache/ivy/core/resolve/VisitNode.java (working copy) @@ -277,7 +277,13 @@ public void useRealNode() { if (parent != null) { // use real node make sense only for non root module IvyNode node = data.getNode(this.node.getId()); - if (node != null && node != this.node) { + if (node != null && node != this.node + //this.node can be replaced when either: + //this.node isn't resolved; or + //other node has the same resolved revision as this.node; + //Does real node make sense outside of this case? + && (this.node.getResolvedId() == null || node.getResolvedId().getRevision() + .equals(this.node.getResolvedId().getRevision()))) { this.node = node; } } Index: src/java/org/apache/ivy/core/resolve/ResolveData.java =================================================================== --- src/java/org/apache/ivy/core/resolve/ResolveData.java (revision 961511) +++ src/java/org/apache/ivy/core/resolve/ResolveData.java (working copy) @@ -128,7 +128,15 @@ visitData.addVisitNode(node); this.visitData.put(mrid, visitData); } else { - visitData.setNode(node.getNode()); + //visitData.node can be replaced when either: + //visitData.node isn't resolved; or + //other node has the same resolved revision as this.node; + //see VisitNode.useRealNode() + if (visitData.getResolvedNode() == null + || visitData.getResolvedNode().getResolvedId().getRevision().equals( + node.getNode().getResolvedId().getRevision())) { + visitData.setNode(node.getNode()); + } visitData.addVisitNode(node); } } @@ -159,7 +167,7 @@ this.visitData.put(mrid, keptVisitData); // update visit data with discarde visit nodes keptVisitData.addVisitNodes(rootModuleConf, visitData.getVisitNodes(rootModuleConf)); - + keptVisitData.setResolvedNode(); report.updateDependency(mrid, node); }