From a176f6999a2d33163365602fb56cae8711875e06 Mon Sep 17 00:00:00 2001 From: Kuninori Morimoto Date: Tue, 9 Feb 2021 10:24:56 +0900 Subject: scripts: add html_task.py Because current PeriJect is using scripts/myhtml.py to creating all HTML files, all files will be re-created if myhtml.py itself was updated. It is very verbose. This patch separates "task" from it. Signed-off-by: Kuninori Morimoto --- Makefile | 16 ++-- scripts/html_base.py | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++ scripts/html_task.py | 194 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 416 insertions(+), 5 deletions(-) create mode 100644 scripts/html_base.py create mode 100755 scripts/html_task.py diff --git a/Makefile b/Makefile index 2dfd7ed..df47fde 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,3 @@ -HTML = ./scripts/myhtml.py FIND = ./scripts/find.py ALLYAML = $(shell ${FIND} -all) PROJECT = $(subst ./,,$(shell cd ./projects; find -type d)) @@ -47,20 +46,27 @@ index.html: ${HTMLDIR} ${WIKIDIR}: mkdir -p $@ -${FILE}: ${HTML_OPTION2} ${HTML} +${HTML}: ${FILES} ./scripts/html_${CMD}.py ./scripts/html_base.py ./scripts/base.py echo $@ - ${HTML} ${HTML_OPTION1} ${HTML_OPTION2} > $@ + ./scripts/html_${CMD}.py ${OPTION} ${FILES} > $@ + +${FILE}: ${HTML_OPTION2} ./scripts/myhtml.py + echo $@ + ./scripts/myhtml.py ${HTML_OPTION1} ${HTML_OPTION2} > $@ loop: for list in ${LISTS}; do\ make PARAM=$${list} EXP1=${EXP1} EXP2="${EXP2}" ${TARGET};\ done; +myhtml: + make CMD=${CMD} OPTION="${OPTION}" FILES="${FILES}" HTML=${HTML} ${HTML} +file: + make CMD=task FILES=${PARAM} HTML=$(subst yaml,html,$(subst projects,html,${PARAM})) myhtml + basic: make HTML_OPTION1="${HTML_OPTION1}" HTML_OPTION2="${HTML_OPTION2}" FILE=${FILE} ${FILE} summary: make HTML_OPTION1=summary HTML_OPTION2=projects/${PARAM} FILE=html/${PARAM}/summary.html basic -file: - make HTML_OPTION1=task HTML_OPTION2=${PARAM} FILE=$(subst yaml,html,$(subst projects,html,${PARAM})) basic noparam: make HTML_OPTION1=${PARAM} HTML_OPTION2="${PRODIR}" FILE=html/${PARAM}.html basic finds: diff --git a/scripts/html_base.py b/scripts/html_base.py new file mode 100644 index 0000000..9b265ae --- /dev/null +++ b/scripts/html_base.py @@ -0,0 +1,211 @@ +#! /usr/bin/env python3 +#=============================== +# +# html_base +# +# 2021/02/09 Kuninori Morimoto +#=============================== +import os + +import base +#==================================== +# +# html +# +#==================================== +class html(base.base): + + __head = 0 + __noclose = ["input", + "frame", + "link", + "br", + ] + + #-------------------- + # option + #-------------------- + def option(self, dic): + if (dic): + self.dic.update(dic) + + #-------------------- + # __init__ + #-------------------- + def __init__(self, mark, dic = None): + super().__init__() + + self.dic = {} + self.mark = mark + self.option(dic) + self.txt = "" + + #-------------------- + # open + #-------------------- + def open(self, ret = 0): + + self.txt = "" + + if (ret): + for i in range(html.__head): + self.txt += "\t" + + self.txt += "<{}".format(self.mark) + for d in self.dic: + self.txt += " {}=\"{}\"".format(d, self.dic[d]) + self.txt += ">" + html.__head += 1 + + #-------------------- + # close + #-------------------- + def close(self, ret = 0): + html.__head -= 1 + # no end-mark + if (self.mark in html.__noclose): + return + + if (ret): + for i in range(html.__head): + self.txt += "\t" + self.txt += "".format(self.mark) + + #-------------------- + # text + #-------------------- + def text(self, txt = ""): + self.open() + self.txt += txt + self.close() + return self.txt + + #-------------------- + # print + #-------------------- + def print(self, txt = ""): + + self.open(1) + self.txt += txt + self.close(0) + print(self.txt) + + #-------------------- + # for with + #-------------------- + def __enter__(self): + self.open(1) + print(self.txt) + self.txt = "" + return self + def __exit__(self, exception_type, exception_value, traceback): + self.close(1) + print(self.txt) + self.txt = "" + +#==================================== +# +# myhtml +# +#==================================== +class myhtml(base.base): + def __init__(self): + super().__init__() + self.git = self.config("git-linux") + + def relpath(self, path, frm): + return os.path.relpath("{}/{}".format(self.top(), path), frm) + + def relpath_y2h(self, file, frm): + return os.path.relpath(file.replace("yaml", "html").replace("projects", "html"), frm) + + def git_title(self, id): + return self.run("git -C {} log -1 {} --format=%s".format(self.git, id)) + + def commit_url(self, id, type): + if (type == "bsp"): + return "https://github.com/renesas-rcar/linux-bsp/commit/{}?diff=unified".format(id) + if (type == "torvalds"): + return "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id={}".format(id) + if (type == "next"): + return "https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id={}".format(id) + if (type == "lore"): + return "https://lore.kernel.org/r/{}".format(id) + return id; + + #-------------------- + # print_css + #-------------------- + def print_css(self, dir): + html("link", {"rel":"stylesheet", + "type":"text/css", + "href":self.relpath("scripts/css", dir)}).print() + + #-------------------- + # print_commit_bsp + #-------------------- + def print_commit_bsp(self, bsp_list): + with html("ul"): + for bsp in bsp_list: + html("li").print(html("a", {"href":self.commit_url(bsp, "bsp"), + "target":"_blank"}).text(self.git_title(bsp))) + return len(bsp_list) + + #-------------------- + # __task_commit_upstream + #-------------------- + def __task_commit_upstream(self, v, upstream, item): + if (not item in upstream): + return 0 + + commit = upstream[item] + + with html("tr"): + html("th").print(item) + html("td").print(html("a", {"href":self.commit_url(commit, item), + "target":"_blank"}).text(self.git_title(commit))) + + return 1 + + #-------------------- + # __task_commit_posted + #-------------------- + def __task_commit_posted(self, v, posted, item): + if (not item in posted): + return 0 + + msgid = posted[item] + + with html("tr"): + html("th").print(item) + html("td").print(html("a", {"href":self.commit_url(msgid, item), + "target":"_blank"}).text(msgid)) + + return 1 + + #-------------------- + # task_commit_upstream + #-------------------- + def task_commit_upstream(self, v): + done = 0 + cnt = 0 + status = v.get_data("status") + if (status == "Done" or + status == "Abandoned"): + done = 1 + + upstream = v.get_data("upstream") + if (not len(upstream)): + if (done): + html("p").print("ignored") + cnt = 1 + else: + with html("table"): + for up in upstream: + cnt += self.__task_commit_upstream(v, up, "torvalds") + for up in upstream: + cnt += self.__task_commit_upstream(v, up, "next") + for up in upstream: + cnt += self.__task_commit_posted(v, up, "lore") + + return (done, cnt) diff --git a/scripts/html_task.py b/scripts/html_task.py new file mode 100755 index 0000000..596b43b --- /dev/null +++ b/scripts/html_task.py @@ -0,0 +1,194 @@ +#! /usr/bin/env python3 +#=============================== +# +# html_task +# +# 2021/02/09 Kuninori Morimoto +#=============================== +import sys +import os +import re + +import view +import html_base +from html_base import html +#==================================== +# +# periject_html +# +#==================================== +class periject_html(html_base.myhtml): + + def __init__(self): + super().__init__() + + #-------------------- + # task_commit_bsp + #-------------------- + def task_commit_bsp(self, v): + cnt = 0 + with html("table"): + for b in self.bsp_list(): + bsp_list = v.get_data(b) + if (not bsp_list): + continue + with html("tr"): + html("th").print(b) + with html("td"): + cnt += self.print_commit_bsp(bsp_list) + return cnt + + #-------------------- + # task_status + #-------------------- + def task_status(self, v): + dir = os.path.dirname(v.file) + assignee = v.get_data("assignee") + status = v.get_data("status") + team = v.get_data("team") + + if (not len(assignee)): + assignee = "NoAssignee" + + with html("table", {"border":"1"}): + with html("tr"): + html("th").print("file") + html("th").print("status") + html("th").print("team") + html("th").print("assignee") + html("th").print("key") + + with html("tr"): + html("td").print(os.path.relpath(v.file, self.top())) + html("td").print(html("a", {"target":"summary", + "href":self.relpath("html/{}.html".format(status), dir)}).text(status)) + html("td").print(html("a", {"target":"summary", + "href":self.relpath("html/{}.html".format(team), dir)}).text(team)) + html("td").print(html("a", {"target":"summary", + "href":self.relpath("html/{}.html".format(assignee), dir)}).text(assignee)) + html("td").print(v.get_data("key")) + + #-------------------- + # _task_relation + #-------------------- + def _task_relation(self, relationship, v, item): + + current_dir = os.path.dirname(v.file) + related_file = v.get_related_file(relationship[item]) + + if (not os.path.exists(related_file)): + with html("tr"): + html("td").print(item) + html("td").print("Unknown({})".format(related_file)) + return + + rv = view.viewer([related_file]) + rv.set_data(related_file) + with html("tr"): + html("td").print(item) + html("td").print(html("a", {"href": + self.relpath_y2h(related_file, current_dir)}).text(rv.get_data("title"))) + + #-------------------- + # task_relation + #-------------------- + def task_relation(self, v): + + relationships = v.get_data("relationships") + if (not relationships): + return + + current_dir = os.path.dirname(v.file) + + with html("table", {"border":"1"}): + for relationship in relationships: + if ("parent" in relationship): + self._task_relation(relationship, v, "parent") + if ("depends" in relationship): + self._task_relation(relationship, v, "depends") + if ("blocks" in relationship): + self._task_relation(relationship, v, "blocks") + + #-------------------- + # task_head + #-------------------- + def task_head(self, v): + + with html("table"): + with html("tr"): + with html("td"): + self.task_status(v) + with html("td"): + self.task_relation(v) + + #-------------------- + # task_commit + #-------------------- + def task_commit(self, v): + + has_bsp = 0 + for b in self.bsp_list(): + if (v.get_data(b)): + has_bsp = 1 + break + upstream = v.get_data("upstream") + + with html("table", {"border":"1"}): + with html("tr"): + if (has_bsp): + html("th").print("BSP") + if (upstream): + html("th").print("upstream") + with html("tr"): + if (has_bsp): + with html("td"): + self.task_commit_bsp(v) + if (upstream): + with html("td"): + self.task_commit_upstream(v) + + #-------------------- + # task_comment + #-------------------- + def task_comment(self, v): + comments = v.get_data("comments") + if (not comments): + return + + with html("ul"): + for comment in comments: + str = re.search(r'(https?://[\w/:%#\$&\?\(\)~\.=\+\-]+)', comment) + if (str): + a = html("a", {"href":str.group(), + "target":"_blank"}) + comment = str.string[:str.start()] + a.text(str.group()) + str.string[str.end():] + + html("li").print(comment) + + #-------------------- + # print + #-------------------- + def print(self, argv): + # remove this script + argv.pop(0) + + v = view.viewer([argv[0]]) + v.set_data(argv[0]) + + dir = os.path.dirname(argv[0].replace("projects", "html")) + + self.print_css(dir) + with html("body"): + html("h2").print(v.get_data("title")) + self.task_head(v) + self.task_commit(v) + self.task_comment(v) + +#==================================== +# +# As command +# +#==================================== +if __name__=='__main__': + # html_task.py projects/xxx/xxx.yaml + periject_html().print(sys.argv) -- cgit v1.2.3