You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.6 KiB

+++ title = "Fix nbd graph : show ancestry path through ticket, not just subtree" priority = 6 status = "todo" ticket_type = "bug" dependencies = ["668150"] +++

Problem

Currently nbd graph <id> renders the subtree below the given ticket via dependent edges (tickets blocked by it). After the graph orientation fix (see ticket 668150), nbd graph <id> will render the dependency subtree below the given ticket.

But the desired behavior for nbd graph B (where A depends on B, C, and D) is more specific:

nbd graph B should graph up to the root level, down to B, and the rest of the way down from B, but not include siblings like C and D.

Desired behavior

A  [todo]  High-level goal
└── B  [todo]  Implement feature B
    └── E  [todo]  Write unit tests for B
  • A is shown because it depends on B (ancestor)
  • C and D are NOT shown (they are sibling dependencies of A, not on the path to B)
  • E is shown because B depends on E (B's own dependency subtree)

Algorithm

  1. Ancestors of B: traverse the dependents edges upward (who depends on B, and who depends on those, etc.) — collecting all ancestor tickets
  2. Filtered ancestor tree: when rendering ancestors, only show the branch that leads toward B — i.e., at each ancestor, only the child that is on the path to B is shown (not siblings like C and D)
  3. B's dependency subtree: show B and all its dependencies recursively (as per the corrected subtree logic from ticket 668150)

Implementation approach

In src/graph.rs:

  • Add ancestors(target_id: &str) -> Vec<&str>: collect all IDs that transitively depend on target_id (follow dependents edges upward)
  • Add ancestry_path_subtree(target_id: &str) -> ???: returns the combined view — ancestor tree filtered to the path, plus target's dependency subtree

In src/display.rs:

  • New or updated format_subtree() to render the ancestry+subtree combined view
  • The ancestry portion must filter children to only show the branch toward the target (not all dependents of each ancestor)

In src/main.rs:

  • Update cmd_graph() to use the new combined view when an ID is provided

Edge cases

  • If B has no dependents (it is itself a root), just show B's dependency subtree (no ancestor section)
  • If B appears in multiple dependency chains, show all paths to it
  • Cycle detection still applies (mark revisited nodes with *)

Tests

Add integration tests in tests/integration.rs:

  • Create tickets A, B, C, D, E with A depending on B/C/D, and B depending on E
  • Assert nbd graph B output contains A and E but not C and D