1*cf5a6c84SAndroid Build Coastguard Worker#!/usr/bin/python 2*cf5a6c84SAndroid Build Coastguard Worker 3*cf5a6c84SAndroid Build Coastguard Worker# Create status.html 4*cf5a6c84SAndroid Build Coastguard Worker 5*cf5a6c84SAndroid Build Coastguard Workerimport subprocess,sys 6*cf5a6c84SAndroid Build Coastguard Worker 7*cf5a6c84SAndroid Build Coastguard Workerdef readit(args, shell=False): 8*cf5a6c84SAndroid Build Coastguard Worker ret={} 9*cf5a6c84SAndroid Build Coastguard Worker arr=[] 10*cf5a6c84SAndroid Build Coastguard Worker blob=subprocess.Popen(args, stdout=subprocess.PIPE, shell=shell) 11*cf5a6c84SAndroid Build Coastguard Worker for i in blob.stdout.read().split("\n"): 12*cf5a6c84SAndroid Build Coastguard Worker if not i: continue 13*cf5a6c84SAndroid Build Coastguard Worker i=i.split() 14*cf5a6c84SAndroid Build Coastguard Worker try: ret[i[0]].extend(i[1:]) 15*cf5a6c84SAndroid Build Coastguard Worker except: ret[i[0]]=i[1:] 16*cf5a6c84SAndroid Build Coastguard Worker arr.extend(i) 17*cf5a6c84SAndroid Build Coastguard Worker return ret,arr 18*cf5a6c84SAndroid Build Coastguard Worker 19*cf5a6c84SAndroid Build Coastguard Worker# Run sed on roadmap and source to get command lists, and run toybox too 20*cf5a6c84SAndroid Build Coastguard Worker# This gives us a dictionary of types, each with a list of commands 21*cf5a6c84SAndroid Build Coastguard Worker 22*cf5a6c84SAndroid Build Coastguard Workerprint "Collecting data..." 23*cf5a6c84SAndroid Build Coastguard Worker 24*cf5a6c84SAndroid Build Coastguard Workerstuff,blah=readit(["sed","-n", 's/<span id=\\([a-z_]*\\)>/\\1 /;t good;d;:good;h;:loop;n;s@</span>@@;t out;H;b loop;:out;g;s/\\n/ /g;p', "www/roadmap.html"]) 25*cf5a6c84SAndroid Build Coastguard Workerblah,toystuff=readit(["./toybox"]) 26*cf5a6c84SAndroid Build Coastguard Workerblah,stuff["shell"]=readit(["sed", "-n", "s/.*NEWTOY[(]\\([^,]*\\).*TOYFLAG_NOFORK.*/\\1/p", "toys/pending/sh.c"]) 27*cf5a6c84SAndroid Build Coastguard Workerblah,pending=readit(["/bin/bash", "-c", "sed -n 's/[^ \\t].*TOY(\\([^,]*\\),.*/\\1/p' toys/pending/*.c"]) 28*cf5a6c84SAndroid Build Coastguard Workerversion=readit(["./toybox","--version"])[-1][-1] 29*cf5a6c84SAndroid Build Coastguard Worker 30*cf5a6c84SAndroid Build Coastguard Workerprint "Analyzing..." 31*cf5a6c84SAndroid Build Coastguard Worker 32*cf5a6c84SAndroid Build Coastguard Worker# Create reverse mappings: reverse["command"] gives list of categories it's in 33*cf5a6c84SAndroid Build Coastguard Workerreverse={} 34*cf5a6c84SAndroid Build Coastguard Workerfor i in stuff: 35*cf5a6c84SAndroid Build Coastguard Worker for j in stuff[i]: 36*cf5a6c84SAndroid Build Coastguard Worker try: reverse[j].append(i) 37*cf5a6c84SAndroid Build Coastguard Worker except: reverse[j]=[i] 38*cf5a6c84SAndroid Build Coastguard Workerprint "all commands=%s" % len(reverse) 39*cf5a6c84SAndroid Build Coastguard Worker 40*cf5a6c84SAndroid Build Coastguard Worker# Run a couple sanity checks on input 41*cf5a6c84SAndroid Build Coastguard Worker 42*cf5a6c84SAndroid Build Coastguard Workerfor i in toystuff: 43*cf5a6c84SAndroid Build Coastguard Worker if (i in pending): print "Pending command not roadmap: %s" % i 44*cf5a6c84SAndroid Build Coastguard Worker 45*cf5a6c84SAndroid Build Coastguard Workerunknowns=[] 46*cf5a6c84SAndroid Build Coastguard Workerfor i in toystuff + pending: 47*cf5a6c84SAndroid Build Coastguard Worker if not i in reverse: unknowns.append(i) 48*cf5a6c84SAndroid Build Coastguard Worker 49*cf5a6c84SAndroid Build Coastguard Workerif unknowns: print "uncategorized: %s" % " ".join(unknowns) 50*cf5a6c84SAndroid Build Coastguard Worker 51*cf5a6c84SAndroid Build Coastguard Workerconv = [("posix", '<a href="http://pubs.opengroup.org/onlinepubs/9699919799/utilities/%s.html">%%s</a>', "[%s]"), 52*cf5a6c84SAndroid Build Coastguard Worker ("lsb", '<a href="http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/%s.html">%%s</a>', '<%s>'), 53*cf5a6c84SAndroid Build Coastguard Worker ("development", '<a href="https://man7.org/linux/man-pages/man1/%s.1.html">%%s</a>', '(%s)'), 54*cf5a6c84SAndroid Build Coastguard Worker ("toolbox", "", '{%s}'), ("klibc_cmd", "", '=%s='), 55*cf5a6c84SAndroid Build Coastguard Worker ("sash_cmd", "", '#%s#'), ("sbase_cmd", "", '@%s@'), 56*cf5a6c84SAndroid Build Coastguard Worker ("beastiebox_cmd", "", '*%s*'), ("tizen_cmd", "", '$%s$'), 57*cf5a6c84SAndroid Build Coastguard Worker ("fhs_cmd", "", '-%s-'), ("yocto_cmd", "", ".%s."), 58*cf5a6c84SAndroid Build Coastguard Worker ("shell", "", "%%%s%%"), 59*cf5a6c84SAndroid Build Coastguard Worker ("request", '<a href="https://man7.org/linux/man-pages/man1/%s.1.html">%%s</a>', '+%s+')] 60*cf5a6c84SAndroid Build Coastguard Worker 61*cf5a6c84SAndroid Build Coastguard Workerdef categorize(reverse, i, skippy=""): 62*cf5a6c84SAndroid Build Coastguard Worker linky = "%s" 63*cf5a6c84SAndroid Build Coastguard Worker out = i 64*cf5a6c84SAndroid Build Coastguard Worker 65*cf5a6c84SAndroid Build Coastguard Worker if skippy: types = filter(lambda a: a != skippy, reverse[i]) 66*cf5a6c84SAndroid Build Coastguard Worker else: types = reverse[i] 67*cf5a6c84SAndroid Build Coastguard Worker 68*cf5a6c84SAndroid Build Coastguard Worker for j in conv: 69*cf5a6c84SAndroid Build Coastguard Worker if j[0] in types: 70*cf5a6c84SAndroid Build Coastguard Worker if j[1]: linky = j[1] % i 71*cf5a6c84SAndroid Build Coastguard Worker out = j[2] % out 72*cf5a6c84SAndroid Build Coastguard Worker if not skippy: break 73*cf5a6c84SAndroid Build Coastguard Worker if (not skippy) and out == i: 74*cf5a6c84SAndroid Build Coastguard Worker sys.stderr.write("unknown %s %s\n" % (i,reverse[i])) 75*cf5a6c84SAndroid Build Coastguard Worker 76*cf5a6c84SAndroid Build Coastguard Worker return linky % out 77*cf5a6c84SAndroid Build Coastguard Worker 78*cf5a6c84SAndroid Build Coastguard Worker# Sort/annotate done, pending, and todo item lists 79*cf5a6c84SAndroid Build Coastguard Worker 80*cf5a6c84SAndroid Build Coastguard Workerallcmd=[] 81*cf5a6c84SAndroid Build Coastguard Workerdone=[] 82*cf5a6c84SAndroid Build Coastguard Workerpend=[] 83*cf5a6c84SAndroid Build Coastguard Workertodo=[] 84*cf5a6c84SAndroid Build Coastguard Workerblah=list(reverse) 85*cf5a6c84SAndroid Build Coastguard Workerblah.sort() 86*cf5a6c84SAndroid Build Coastguard Workerfor i in blah: 87*cf5a6c84SAndroid Build Coastguard Worker out=categorize(reverse, i) 88*cf5a6c84SAndroid Build Coastguard Worker allcmd.append(out) 89*cf5a6c84SAndroid Build Coastguard Worker if i in toystuff or i in pending: 90*cf5a6c84SAndroid Build Coastguard Worker if i in toystuff: done.append(out) 91*cf5a6c84SAndroid Build Coastguard Worker else: pend.append(out) 92*cf5a6c84SAndroid Build Coastguard Worker out='<strike>%s</strike>' % out 93*cf5a6c84SAndroid Build Coastguard Worker else: todo.append(out) 94*cf5a6c84SAndroid Build Coastguard Worker 95*cf5a6c84SAndroid Build Coastguard Workerprint "implemented=%s" % len(toystuff) 96*cf5a6c84SAndroid Build Coastguard Worker 97*cf5a6c84SAndroid Build Coastguard Worker# Write data to output file 98*cf5a6c84SAndroid Build Coastguard Worker 99*cf5a6c84SAndroid Build Coastguard Workeroutfile=open("www/status.html", "w") 100*cf5a6c84SAndroid Build Coastguard Workeroutfile.write("""<html><head><title>toybox current status</title> 101*cf5a6c84SAndroid Build Coastguard Worker<!--#include file="header.html" --> 102*cf5a6c84SAndroid Build Coastguard Worker<title>Toybox Status</title> 103*cf5a6c84SAndroid Build Coastguard Worker"""); 104*cf5a6c84SAndroid Build Coastguard Workeroutfile.write("<h1>Status of toybox %s</h1>\n" % version); 105*cf5a6c84SAndroid Build Coastguard Workeroutfile.write("<h3>Legend: %s <strike>pending</strike></h3>\n"%" ".join(map(lambda i: i[2]%(i[0].split("_")[0]), conv))) 106*cf5a6c84SAndroid Build Coastguard Worker 107*cf5a6c84SAndroid Build Coastguard Workeroutfile.write("<a name=done><h2><a href=#done>Completed</a></h2><blockquote><p>%s</p></blockquote>\n" % "\n".join(done)) 108*cf5a6c84SAndroid Build Coastguard Workeroutfile.write("<a name=part><h2><a href=#part>Partially implemented (in toys/pending)</a></h2><blockquote><p>%s</p></blockquote>\n" % "\n".join(pend)) 109*cf5a6c84SAndroid Build Coastguard Workeroutfile.write("<a name=todo><h2><a href=#todo>Not started yet</a></h2><blockquote><p>%s</p></blockquote>\n" % "\n".join(todo)) 110*cf5a6c84SAndroid Build Coastguard Worker 111*cf5a6c84SAndroid Build Coastguard Worker# Output unfinished commands by category 112*cf5a6c84SAndroid Build Coastguard Worker 113*cf5a6c84SAndroid Build Coastguard Workeroutfile.write("<hr><h2>Categories of remaining todo items</h2>") 114*cf5a6c84SAndroid Build Coastguard Worker 115*cf5a6c84SAndroid Build Coastguard Workerfor i in conv: 116*cf5a6c84SAndroid Build Coastguard Worker todo = [] 117*cf5a6c84SAndroid Build Coastguard Worker i=i[0] 118*cf5a6c84SAndroid Build Coastguard Worker 119*cf5a6c84SAndroid Build Coastguard Worker for j in stuff[i]: 120*cf5a6c84SAndroid Build Coastguard Worker if j in toystuff: continue 121*cf5a6c84SAndroid Build Coastguard Worker if j in pending: todo.append('<strike>%s</strike>' % j) 122*cf5a6c84SAndroid Build Coastguard Worker else: todo.append(categorize(reverse,j,i)) 123*cf5a6c84SAndroid Build Coastguard Worker 124*cf5a6c84SAndroid Build Coastguard Worker if todo: 125*cf5a6c84SAndroid Build Coastguard Worker k = i 126*cf5a6c84SAndroid Build Coastguard Worker for j in conv: 127*cf5a6c84SAndroid Build Coastguard Worker if j[0] == i: 128*cf5a6c84SAndroid Build Coastguard Worker k = j[2] % i.split("_")[0] 129*cf5a6c84SAndroid Build Coastguard Worker 130*cf5a6c84SAndroid Build Coastguard Worker outfile.write("<a name=%s><h2><a href=#%s>%s<a></h2><blockquote><p>" % (i,i,k)) 131*cf5a6c84SAndroid Build Coastguard Worker outfile.write(" ".join(todo)) 132*cf5a6c84SAndroid Build Coastguard Worker outfile.write("</p></blockquote>\n") 133*cf5a6c84SAndroid Build Coastguard Worker 134*cf5a6c84SAndroid Build Coastguard Workeroutfile.write("<hr><a name=all><h2><a href=#all>All commands together in one big list</a></h2><blockquote><p>%s</p></blockquote>\n" % "\n".join(allcmd)) 135*cf5a6c84SAndroid Build Coastguard Worker 136*cf5a6c84SAndroid Build Coastguard Workeroutfile.write(""" 137*cf5a6c84SAndroid Build Coastguard Worker<p>See the <a href=roadmap.html>Roadmap page</a> for more information.</p> 138*cf5a6c84SAndroid Build Coastguard Worker 139*cf5a6c84SAndroid Build Coastguard Worker<!-- #include "footer.html" -->""") 140