diff --git a/src/tree.py b/src/tree.py index 311df5f28b0bbfc90f35f303ae1c94e1467efd5d..99a69363bd3f9de50fd9f017b7164fde53bce8c8 100644 --- a/src/tree.py +++ b/src/tree.py @@ -2,10 +2,11 @@ import json import logging import os import re +import subprocess import sys import uuid import re -import git + id_set = set() logger = logging.getLogger(__name__) @@ -14,10 +15,20 @@ handler = logging.StreamHandler(sys.stdout) formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) -repo = git.Repo(".") -def user_name(): - return repo.config_reader().get_value("user", "name") + +def user_name(md_file, author_dict): + ret = subprocess.Popen([ + "git", "log", md_file + ], stdout=subprocess.PIPE) + lines = list(map(lambda l: l.decode(), ret.stdout.readlines())) + author_lines = [] + for line in lines: + if line.startswith('Author'): + author_lines.append(line.split(' ')[1]) + author_nick_name = author_lines[-1] + return author_dict.get(author_nick_name, "") + def load_json(p): with open(p, 'r') as f: @@ -75,7 +86,18 @@ def check_export(base, cfg): class TreeWalker: - def __init__(self, root, tree_name, title=None, log=None): + def __init__( + self, root, + tree_name, + title=None, + log=None, + authors=None, + enable_notebook=None, + ignore_keywords=False + ): + self.ignore_keywords = ignore_keywords + self.authors = authors if authors else {} + self.enable_notebook = enable_notebook self.name = tree_name self.root = root self.title = tree_name if title is None else title @@ -102,11 +124,13 @@ class TreeWalker: for index, chapter in enumerate(level_node["children"]): chapter_title = list(chapter.keys())[0] chapter_node = list(chapter.values())[0] - chapter_path = os.path.join(level_path, f"{index + 1}.{chapter_title}") + chapter_path = os.path.join( + level_path, f"{index + 1}.{chapter_title}") self.load_sections(chapter_path, chapter_node) for index, section_node in enumerate(chapter_node["children"]): section_title = list(section_node.keys())[0] - full_path = os.path.join(chapter_path, f"{index + 1}.{section_title}") + full_path = os.path.join( + chapter_path, f"{index + 1}.{section_title}") if os.path.isdir(full_path): self.check_section_keywords(full_path) self.ensure_exercises(full_path) @@ -140,7 +164,7 @@ class TreeWalker: result = { name: { "node_id": config["node_id"], - "keywords": config["keywords"], + "keywords": config["keywords"], "children": [], "keywords_must": config["keywords_must"], "keywords_forbid": config["keywords_forbid"] @@ -326,7 +350,8 @@ class TreeWalker: continue mfile = base + ".json" meta_path = os.path.join(section_path, mfile) - self.ensure_exercises_meta(meta_path, source) + md_file = os.path.join(section_path, e) + self.ensure_exercises_meta(meta_path, source, md_file) export = config.get("export", []) if mfile not in export and self.name != "algorithm": export.append(mfile) @@ -334,7 +359,8 @@ class TreeWalker: config["export"] = export if flag: - dump_json(os.path.join(section_path, "config.json"), config, True, True) + dump_json(os.path.join(section_path, "config.json"), + config, True, True) for e in config.get("export", []): full_name = os.path.join(section_path, e) @@ -346,7 +372,7 @@ class TreeWalker: else: id_set.add(exercise["exercise_id"]) - def ensure_exercises_meta(self, meta_path, source): + def ensure_exercises_meta(self, meta_path, source, md_file): _, mfile = os.path.split(meta_path) meta = None if os.path.exists(meta_path): @@ -361,26 +387,31 @@ class TreeWalker: if "source" not in meta: meta["source"] = source if "author" not in meta: - meta["author"] = user_name() + meta["author"] = user_name(md_file, self.authors) if "type" not in meta: meta["type"] = "code_options" - if meta is None: - meta = { - "type": "code_options", - "author": user_name(), - "source": source, - "notebook_enable": self.default_notebook(), - "exercise_id": uuid.uuid4().hex - } + + if meta is None: + meta = { + "type": "code_options", + "author": user_name(md_file, self.authors), + "source": source, + "notebook_enable": self.default_notebook(), + "exercise_id": uuid.uuid4().hex + } dump_json(meta_path, meta, True, True) def default_notebook(self): + if self.enable_notebook is not None: + return self.enable_notebook if self.name in ["python", "java", "c"]: return True else: return False def check_section_keywords(self, full_path): + if self.ignore_keywords: + return config = self.ensure_section_config(full_path) if not config.get("keywords", []): self.logger.error(f"节点 [{full_path}] 的关键字为空,请修改配置文件写入关键字")