hlfw.ca

task

Download patch

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 ''