#! /usr/bin/env python3 #=============================== # # html # # 2019/02/18 Kuninori Morimoto #=============================== import sys import os import base import find import view #==================================== # # 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 = "" #==================================== # # periject_html # #==================================== class periject_html(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 bsp_url(self, id): return "https://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas-bsp.git/commit/?id={}".format(id) def upstream_url(self, id): return "https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id={}".format(id) #-------------------- # index #-------------------- def index(self): # | | | # |menu|body| # | | | with html("frameset", {"cols":"200,*"}): html("frame", {"src":"./html/menu.html", "name":"menu"}).print() html("frame", {"src":"./html/subindex.html", "name":"body"}).print() #-------------------- # summary #-------------------- def subindex(self): # ------- # summary # ------- # body # ------- with html("frameset", {"rows":"300,*"}): html("frame", {"src":"./summary.html", "name":"summary"}).print() html("frame", {"src":"./body.html", "name":"subbody"}).print() #-------------------- # summary #-------------------- def __summary(self, title, dir, files): # ------- # summary # ------- # # ------- html("h2").print(title) with html("table", {"border":"1"}): with html("tr"): html("th").print("file") html("th").print("status") html("th").print("assignee") html("th").print("title") for file in files: v = view.viewer([file]) v.set_data(file) f = os.path.basename(file) subbody = html("a", {"target":"subbody"}) summary = html("a", {"target":"summary"}) with html("tr"): subbody.option({"href":self.relpath_y2h(file, dir)}) html("td").print(subbody.text(os.path.basename(file).replace(".yaml", ""))) status = v.get_data("status") summary.option({"href":self.relpath("html/{}.html".format(status), dir)}) html("td").print(summary.text(status)) assignee = v.get_data("assignee") summary.option({"href":self.relpath("html/{}.html".format(assignee), dir)}) html("td").print(summary.text(assignee)) html("td").print(v.get_data("title")) #-------------------- # summary #-------------------- def summary(self, argv): dir = os.path.normpath(argv[0]) # ------- # summary # ------- # # ------- self.__summary(dir, self.top() + "/" + dir, find.find([dir]).get()) #-------------------- # menu_folder #-------------------- def menu_folder(self, current): folders = self.runl("cd {}; ls -F | grep /".format(current)) path = current.replace("./projects", ".") link = html("a", {"target":"summary", "href":"{}/summary.html".format(path)}) html("li").print(link.text(os.path.basename(current))) if (not folders): return with html("ul"): for folder in folders: dir = os.path.basename(folder) self.menu_folder("{}/{}".format(current, folder[:-1])) #-------------------- # menu_assignee #-------------------- def menu_assignee(self): # from project.schema.yaml with html("ul"): for assignee in ['BSP', 'Geert', 'Jacopo', 'Kaneko', 'Kieran', 'Laurent', 'Magnus', 'Marek', 'Morimoto', 'Niklas', 'Shimoda', 'Simon', 'Ulrich', 'Wolfram']: html("li").print(html("a", {"target":"summary", "href":"./{}.html".format(assignee)}).text(assignee)) #-------------------- # menu_status #-------------------- def menu_status(self): # from project.schema.yaml with html("ul"): for status in ['New', 'Active', 'Blocked', 'Paused', 'Done', 'Abandoned']: html("li").print(html("a", {"target":"summary", "href":"./{}.html".format(status)}).text(status)) #-------------------- # menu_bsp #-------------------- def menu_bsp(self): html("a", {"target":"summary", "href":"./bsp.html"}).print("BSP patch list") #-------------------- # menu #-------------------- def menu(self): with html("body"): html("h1").print("Folder") with html("ul"): self.menu_folder("./projects") html("h1").print("Assignee") self.menu_assignee() html("h1").print("Status") self.menu_status() html("h1").print("BSP") self.menu_bsp() #-------------------- # body #-------------------- def body(self): with html("body"): html("div").print("select tasks from menu") #-------------------- # task_status #-------------------- def task_status(self, v): dir = os.path.dirname(v.file) assignee = v.get_data("assignee") status = v.get_data("status") with html("table", {"border":"1"}): with html("tr"): html("th").print("file") html("th").print("status") 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(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_bsp #-------------------- def task_commit_bsp(self, bsp_list): cnt = 0 with html("ul"): for bsp in bsp_list: cnt += 1 html("li").print(html("a", {"href":self.bsp_url(bsp), "target":"subbody"}).text(self.git_title(bsp))) return cnt #-------------------- # __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("td").print(item) html("td").print(html("a", {"href":self.upstream_url(commit), "target":"subbody"}).text(self.git_title(commit))) return 1 #-------------------- # task_commit_upstream #-------------------- def task_commit_upstream(self, v): upstream = v.get_data("upstream") if (not len(upstream)): return 0 cnt = 0 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") return cnt #-------------------- # task_commit #-------------------- def task_commit(self, v): bsp = v.get_data("bsp-commits") if (not bsp): return with html("table", {"border":"1"}): with html("tr"): html("th").print("BSP") html("th").print("upstream") with html("tr"): with html("td"): self.task_commit_bsp(bsp) 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: html("li").print(comment) #-------------------- # task #-------------------- def task(self, argv): v = view.viewer([argv[0]]) v.set_data(argv[0]) with html("body"): html("h1").print(v.get_data("title")) self.task_head(v) self.task_commit(v) self.task_comment(v) #-------------------- # member #-------------------- def member(self, argv): mem = argv.pop(0) with html("body"): self.__summary(mem, "{}/html".format(self.top()), argv) #-------------------- # bsp #-------------------- def bsp(self, argv): a = html("a", {"target":"subbody"}) cnt_bsp = 0 cnt_up = 0 with html("body"): html("h1").print("BSP patch list") with html("table", {"border":"1"}): with html("tr"): html("th").print("file") html("th").print("BSP") html("th").print("upstream") for file in argv: v = view.viewer([file]) v.set_data(file) bsp = v.get_data("bsp-commits") if (not len(bsp)): continue with html("tr"): a.option({"href": os.path.relpath(file.replace("yaml", "html").replace("projects", "html"), "{}/html".format(self.top()))}) html("td").print(a.text(os.path.basename(file).replace(".yaml", ""))) with html("td"): cnt_bsp += self.task_commit_bsp(bsp) with html("td"): cnt_up += self.task_commit_upstream(v) html("p").print("bsp:{}/upstream:{} = {:.1f}% done".format(cnt_bsp, cnt_up, cnt_up * 100 /cnt_bsp)) #-------------------- # print #-------------------- def print(self, argv): # remove this script argv.pop(0) cmd = sys.argv.pop(0) with html("html"): if (cmd == "index"): # html.py index self.index() elif(cmd == "subindex"): # html.py subindex self.subindex() elif (cmd == "body"): # html.py body self.body() elif (cmd == "summary"): # html.py summary projects/linux/io self.summary(sys.argv) elif (cmd == "menu"): # html.py menu self.menu() elif (cmd == "task"): # html.py task projects/linux/io/xxx.yaml self.task(sys.argv) elif (cmd == "member"): # ./script/find.py -a Wolfram | xargs ./script/html.py menber Wolfram self.member(sys.argv) elif (cmd == "status"): # ./script/find.py -s Active | xargs ./script/html.py status Active self.member(sys.argv) elif (cmd == "bsp"): # ./script/html.py bsp xxx.yaml xxx.yaml ... self.bsp(sys.argv) #==================================== # # As command # #==================================== if __name__=='__main__': periject_html().print(sys.argv)