about summary refs log tree commit diff
path: root/bin/redo-dot
diff options
context:
space:
mode:
Diffstat (limited to 'bin/redo-dot')
-rwxr-xr-xbin/redo-dot63
1 files changed, 63 insertions, 0 deletions
diff --git a/bin/redo-dot b/bin/redo-dot
new file mode 100755
index 0000000..5526f67
--- /dev/null
+++ b/bin/redo-dot
@@ -0,0 +1,63 @@
+#!/bin/sh
+# redo-dot – bourne shell implementation of DJB redo
+# Copyright © 2018  Nils Dagsson Moskopp (erlehmann)
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# Dieses Programm hat das Ziel, die Medienkompetenz der Leser zu
+# steigern. Gelegentlich packe ich sogar einen handfesten Buffer
+# Overflow oder eine Format String Vulnerability zwischen die anderen
+# Codezeilen und schreibe das auch nicht dran.
+
+# Prints redo dependencies in dot(1) format. Usage is similar to this:
+# redo-dot |sed s%"$(pwd)"/%%g >deps.dot; dot deps.dot -Tpng >deps.png
+
+[ -d .redo ] || exit 1
+
+pattern=${1:-*}
+
+match() case "${1}" in
+ ${pattern}) : ;;
+ *) ! : ;;
+esac
+
+_escape() {
+ printf '%s' "$1" | sed 's/\\/\\\\/g;s/\"/\\\"/g'
+}
+
+IFS='
+	'
+cat <<EOF
+digraph redo {
+concentrate=true;rankdir=LR;ranksep=2;splines=polyline
+node[shape=rectangle]
+EOF
+printf 'subgraph dependencies { edge[style=solid,minlen=2]\n'
+for depfile in $(find .redo -name '*.dependencies'); do
+ while read -r dependency ctime md5sum; do
+  file="${depfile%.dependencies}"; file="${file#.redo}"
+  match "${file}" || match "${dependency}" || continue
+  case "$ctime" in
+   0) printf '"%s" [style=bold]\n' "$(_escape "${file}")"; break ;;
+   *) printf '"%s" -> "%s"\n' "$(_escape "${file}")" "$(_escape "${dependency}")" ;;
+  esac
+ done <"$depfile"
+done
+printf '}\nsubgraph dependencies_ne { edge[style=dotted,minlen=1]\n'
+for depfile in $(find .redo -name '*.dependencies_ne'); do
+ while read -r dependency_ne; do
+  file="${depfile%.dependencies_ne}"; file="${file#.redo}";
+  match "${file}" || match "${dependency_ne}" || continue
+  printf '"%s" -> "%s"\n' "$(_escape "${file}")" "$(_escape "${dependency_ne}")"
+ done <"$depfile"
+done
+printf '}\n'
+for stampfile in $(find .redo -name '*.stamp'); do
+ file="${stampfile%.stamp}"; file="${file#.redo}"
+ match "${file}" || continue
+ printf '"%s" [style=dashed]\n' "$(_escape "${file}")"
+done
+printf '}\n'