sbt/notes/2.0.0/dependency-tree-dedup.md

2.2 KiB

Dependency tree: duplicate-subtree collapse

dependencyTree, dependencyBrowseTree, and inspect tree now collapse duplicate subtrees in a DAG to a single line marked (*), matching the convention used by Maven's dependency:tree. The first occurrence is rendered in full; subsequent occurrences appear as +- <id> (*).

This fixes #6886: rendering a deep diamond DAG no longer produces O(M^N) output (and the OOMs that came with it).

Output change

Before:

o:root_2.13:0.1
  +-o:subA_2.13:0.1 [S]
  | +-o:common_2.13:0.1 [S]
  | | +-org.scala-lang:scala-library:2.13.16 [S]
  | +-org.scala-lang:scala-library:2.13.16 [S]
  +-o:subB_2.13:0.1 [S]
  | +-o:common_2.13:0.1 [S]                          # full subtree again
  | | +-org.scala-lang:scala-library:2.13.16 [S]
  | +-org.scala-lang:scala-library:2.13.16 [S]
  +-org.scala-lang:scala-library:2.13.16 [S]

After:

o:root_2.13:0.1
  +-o:subA_2.13:0.1 [S]
  | +-o:common_2.13:0.1 [S]
  | | +-org.scala-lang:scala-library:2.13.16 [S]
  | +-org.scala-lang:scala-library:2.13.16 [S]
  +-o:subB_2.13:0.1 [S]
  | +-o:common_2.13:0.1 [S] (*)                      # collapsed
  | +-org.scala-lang:scala-library:2.13.16 [S] (*)
  +-org.scala-lang:scala-library:2.13.16 [S] (*)

Affected surfaces

  • dependencyTree: ASCII output (also dependencyTreeList, dependencyTreeStats).
  • dependencyBrowseTree: JSON / HTML view.
  • inspect tree: the setting-graph renderer is the same code path, so the (*) marker shows up there too. Most users don't think of inspect tree as "the dependency tree" -- this note is the heads-up.

Contract for tooling consumers

A line whose entry ends with (*) is a reference to the canonical (first-rendered) occurrence of that node within the same render. Tools parsing dependencyTree / dependencyBrowseTree output should treat <id> (*) as a back-pointer rather than a distinct dependency.

Scope

Dedup is currently within a single root's subtree. Cross-root dedup (when a ModuleGraph has multiple roots that share a transitive closure) is tracked separately as #9227.