xref: /aosp_15_r20/external/toybox/scripts/mkstatus.py (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
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>', '&lt;%s&gt;'),
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