ref: e717e6651c36c677b1a3305aee8cbf5a57d5f5f4
parent: 70304f799207e7dc84dbe877cbb9e3b8eeec2ee1
author: Michael Misch <michaelmisch1985@gmail.com>
date: Mon Sep 2 20:23:16 PDT 2024
Update so walk works
--- a/.task/0
+++ b/.task/0
@@ -1,7 +1,8 @@
# Initial release
+[x] Set up walk
[ ] Commands working from any child directory
[ ] Showcase plumbing integration
- - /usr/glenda/src/hlfw.ca/extra/task/1
- - /usr/glenda/src/hlfw.ca/extra/task/2
+ - /usr/glenda/src/hlfw.ca/extra/task/.task/1
+ - /usr/glenda/src/hlfw.ca/extra/task/.task/2
--- a/.task/2
+++ b/.task/2
@@ -1,5 +1,5 @@
# Task manager that can handle queries `walk/fs`
-[ ] Parse all task files
+[x] Parse all task files
[ ] Build graph out of any linkages
-[ ] Write out results based on requests (tags, strings, etc)
+[x] Write out results based on requests (tags, strings, etc)
--- /dev/null
+++ b/walk
@@ -1,0 +1,113 @@
+#!/bin/rc -e
+rfork ne
+
+# S == Started, not blocked
+# B == Not started, blocked
+# A == Attempted, blocked
+# N == Not started, Not blocked
+# D == Done
+fn printtask {
+ tag=`{echo $1 | sed 's#.task/##'}
+ started=`{read}
+ blocked=`{read}
+ finished=`{read}
+ synopsis=`{read}
+ flag=()
+ if (! ~ $finished 0)
+ flag=D
+ if not if (~ $started 0) {
+ if (~ $blocked 0)
+ flag=N
+ if not
+ flag=B
+ }
+ if not {
+ if (~ $blocked 0)
+ flag=S
+ if not
+ flag=A
+ }
+ if (echo $flags | grep -s $flag)
+ echo $flag $synopsis
+ echo -n ''
+}
+
+fn checktask {
+ awk '
+ function isblocked(file, line){
+ while((getline line < file) > 0) {
+ if (line ~ /^\[ \]/) {
+ close(file)
+ return 1
+ }
+ }
+ close(file)
+ return 0
+ }
+
+ function handlelink(line, link) {
+ link=substr(line, 4)
+ gsub(/^ *| *$/, "", link)
+ if(link != FILENAME){
+ return isblocked(link)
+ }
+ return 0
+ }
+
+ BEGIN {
+ started = 0
+ blocked = 0
+ finished = 1
+ synopsis = "No description"
+ }
+
+ /^# / {
+ split($0, header, "#")
+ synopsis = header[2]
+ }
+
+ /^\[x\]/ {
+ started = 1
+ }
+
+ /^\[ \]/ {
+ finished = 0
+ }
+
+ / - \// {
+ blocked += handlelink($0)
+ }
+
+ END {
+ # Listen to flags to see if we print this line
+ printf "%s\n%s\n%s\n%s", started, blocked, finished, synopsis
+ }
+ ' $*
+}
+
+fn parselist {
+ for (t in $tasks)
+ cat $t | checktask | printtask $t
+}
+
+fn mklist {
+ if(test -d .task)
+ tasks=`{ls .task}
+ if not {
+ echo "No project found in directory" >[1=2]
+ exit 'project'
+ }
+}
+
+tasks=()
+flagfmt='c:chars, q:quiet, f:flags flags'; args='[projects ...]'
+eval `''{aux/getflags $*} || exec aux/usage
+
+if (~ $#flags 0)
+ flags=DNS
+@{
+ flag e +
+ mklist
+ parselist
+} || echo 'walk failed:' $status >[1=2]
+exit ''