Source review support tool
A tool to create a module dependency graph for the D language. The feature is that you can record snapshots in two versions and compare them to visualize the differences.
basic
no core, no std
exclude rx.subject
- dub
- Graphviz (for DOT/SVG output)
- Mermaid-capable viewer/editor (only when using
--format=mermaid)
"configurations": [
{
"name": "default"
},
{
"name": "diff",
"postGenerateCommands": [
"dub build -c makedeps",
"dub fetch ddeps",
"dub run ddeps -- --focus=rx -o deps.dot",
"dot -Tsvg -odeps.svg deps.dot"
]
},
{
"name": "diff-update",
"postGenerateCommands": [
"dub fetch ddeps",
"dub run ddeps -- --update"
]
},
{
"name": "makedeps",
"dflags": ["-deps=deps.txt"]
}
] "configurations": [
{
"name": "default"
},
{
"name": "diff",
"postGenerateCommands": [
"dub build -c makedeps",
"dub fetch ddeps",
"dub run ddeps -- -o deps.dot",
"dot -Tsvg -odeps.svg deps.dot"
]
},
{
"name": "diff-update",
"postGenerateCommands": [
"dub fetch ddeps",
"dub run ddeps -- --update"
]
},
{
"name": "makedeps",
"dflags": ["-deps=deps.txt"]
}
]Use the same configurations but swap the post command to emit Mermaid instead of DOT/SVG:
{
"name": "diff-mermaid",
"postGenerateCommands": [
"dub build -c makedeps",
"dub fetch ddeps",
"dub run ddeps -- --format=mermaid --output=deps.mmd"
]
}create lock file
dub build -c makedeps
dub build -c diff-update- Modify source
- Update diff
dub build -c diff
- Do review with the dependency graph diff
- Open the
deps.svgin browser, or generate Mermaid withdub run ddeps -- --format=mermaid --output=deps.mmdand view it in a Mermaid-enabled editor.
- Open the
- checkout a target version
git reset --hard XXXorgit checkout XXXXX
- reset to source version
git reset --hard HEAD~10(e.g. 10 versions ago)
- create
deps-lock.txtdub build -c makedepsdub build -c diff-update- if
dub.json/dub.sdlhas not configure then add these.
- reset to target version
git reset --hard ORIG_HEAD
- make diff
dub build -c diff
- open
deps.svg(or produce Mermaid:dub run ddeps -- --format=mermaid --output=deps.mmd)
| name | Usage | description | default |
|---|---|---|---|
| input | -i XXX or --input=XXX |
deps file name | deps.txt |
| output | -o XXX or --output=XXX |
destination file name | write to stdout |
| update | -u or --update |
update lock file | false |
| lock | -l XXX or --lock=XXX |
lock file name | deps-lock.txt |
| focus | -f XXX or --focus=XXX |
filtering target by name | app |
| depth | -d N or --depth=N |
search depth | 1 |
| exclude | -e XXX [-e YYY] or --exclude=XXX [--exclude=YYY] |
exclude module names | object |
| format | `--format=dot | mermaid` | output format |
| allow-rule | --allow-rule=A->B where A/B are module names or group:name |
allow-list per source; other targets from that source warn | |
| group | -g NAME=mod1,mod2 or -g mod |
group nodes; short form includes submodules; multiple -g allowed |
|
| help | --help |
show help |
You can render the diff as a Mermaid graph (useful in Markdown viewers that support Mermaid):
dub run ddeps -- --format=mermaid --output=deps.mmdOpen deps.mmd in a Mermaid-capable viewer/editor to inspect the graph. Added nodes/edges are green, removed are red, kept are neutral. Graphviz is not required for Mermaid output.
dub run ddeps -- --group util --group UI=app.ui,app.ui.widgets --format=dot -o deps.dot
--group util creates a group for util and its submodules (e.g., util.log). --group UI=... groups the exact modules listed. Groups are rendered as clusters in DOT and subgraphs in Mermaid.
Wildcard helper: suffix .* inside --group targets the module and all submodules even in long form, e.g. --group external=mir.*,numir or short form --group mir.*.
Run once to clone sample repos and emit DOT/Mermaid (and SVG if dot exists):
rdmd ./scripts/sample_outputs.d
Artifacts live under ./tmp/test-<repo>/ and include grouping/exclude variants. For md, both with/without -e core -e std are generated.
Rx diff example is built in: the script checks out rx tag v0.7.0 as the old reference, compares against current HEAD, and writes grouped color-diff graphs (deps-diff-full.dot/.mmd/.svg) showing red/green changes.
Use --allow-rule to allow specific downward directions between layers (e.g., --allow-rule=group:ui->group:app, --allow-rule=group:app->group:infra). For any source that has allow-rules, edges to non-allowed targets are warned: rendered bold/dashed (kept edges also red) with a warning message on stdout. Sources without rules are ignored. This helps enforce layered architectures where modules only depend in approved directions.


