in src/java/org/apache/ivy/ant/IvyDependencyTree.java [58:108]
private void printDependencies(final ModuleRevisionId mrid, final List<IvyNode> dependencyList, final int indent,
final Set<ModuleRevisionId> ancestors) {
for (IvyNode dependency : dependencyList) {
final Set<ModuleRevisionId> ancestorsForCurrentDep = new HashSet<>(ancestors);
// previous ancestors plus the module to whom these dependencies belong to
ancestorsForCurrentDep.add(mrid);
final boolean evicted = dependency.isEvicted(getConf());
if (evicted && !showEvicted) {
continue;
}
final boolean isLastDependency = dependencyList.indexOf(dependency) == dependencyList.size() - 1;
final StringBuilder sb = new StringBuilder();
final ModuleRevisionId dependencyMrid = dependency.getId();
final boolean circular = ancestorsForCurrentDep.contains(dependencyMrid);
if (indent > 0) {
for (int i = 0; i < indent; i++) {
if (i == indent - 1 && isLastDependency && !hasDependencies(dependency)) {
sb.append(" ");
} else {
sb.append("| ");
}
}
}
sb.append(isLastDependency ? "\\- " : "+- ");
if (!evicted && circular) {
// log and skip processing the (transitive) dependencies of this dependency
sb.append("(circularly depends on) ").append(dependencyMrid);
log(sb.toString());
continue;
} else {
sb.append(dependencyMrid.toString());
}
if (evicted && showEvicted) {
EvictionData evictedData = dependency.getEvictedData(getConf());
if (evictedData.isTransitivelyEvicted()) {
sb.append(" transitively");
} else {
sb.append(" evicted by ");
sb.append(evictedData.getSelected());
sb.append(" in ").append(evictedData.getParent());
if (evictedData.getDetail() != null) {
sb.append(" ").append(evictedData.getDetail());
}
}
}
log(sb.toString());
printDependencies(dependencyMrid, dependencies.get(dependencyMrid), indent + 1, ancestorsForCurrentDep);
}
}