From 40844d627e0d07b59da151d49ece6d4de7a6d1c1 Mon Sep 17 00:00:00 2001 From: BoYanZh Date: Sun, 22 Nov 2020 21:24:44 +0800 Subject: update for p3 --- .gitignore | 1 + VG101GradeHelper.py | 3 ++- pgroups.example.json | 12 +++++++++ worker/GitWorker.py | 74 +++++++++++++++++++++++++++++++++++++++++++--------- 4 files changed, 77 insertions(+), 13 deletions(-) create mode 100644 pgroups.example.json diff --git a/.gitignore b/.gitignore index 72193b9..8ec0782 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ projrepos/ indv/ *.log hgroups.json +pgroups.json scores.json settings.py *.csv diff --git a/VG101GradeHelper.py b/VG101GradeHelper.py index 286ddef..96aa811 100644 --- a/VG101GradeHelper.py +++ b/VG101GradeHelper.py @@ -69,6 +69,7 @@ def parse(): if __name__ == "__main__": hgroups = json.load(open("hgroups.json")) + pgroups = json.load(open("pgroups.json")) names = [item[1] for value in hgroups.values() for item in value] pwd = os.getcwd() args = parse() @@ -78,7 +79,7 @@ if __name__ == "__main__": [fn for item in JOJ_INFO["problemInfo"] for fn in item[0]]) mandatoryFiles = list(set(mandatoryFiles)) gitWorker = GitWorker( - args, hgroups, JOJ_INFO["lang"], mandatoryFiles, + args, hgroups, pgroups, JOJ_INFO["lang"], mandatoryFiles, OPTIONAL_FILES) if args.indv or args.group or args.proj else None giteaWorker = GiteaWorker(args, GITEA_BASE_URL, ORG_NAME, GITEA_TOKEN, hgroups) diff --git a/pgroups.example.json b/pgroups.example.json new file mode 100644 index 0000000..0f3f6f1 --- /dev/null +++ b/pgroups.example.json @@ -0,0 +1,12 @@ +{ + "p3group-00": [ + [ + "520370910000", + "san zhang 张三" + ], + [ + "520370910000", + "si li 李四" + ] + ] +} \ No newline at end of file diff --git a/worker/GitWorker.py b/worker/GitWorker.py index 9d411b7..ded01ee 100644 --- a/worker/GitWorker.py +++ b/worker/GitWorker.py @@ -10,6 +10,7 @@ class GitWorker(): def __init__(self, args, hgroups, + pgroups, language, mandatoryFiles, optionalFiles, @@ -17,6 +18,7 @@ class GitWorker(): processCount=4): self.args = args self.hgroups = hgroups + self.pgroups = pgroups self.language = language self.logger = logger self.processCount = processCount @@ -276,13 +278,11 @@ class GitWorker(): if not list(filter(GitWorker.isREADME, os.listdir(repoDir))): self.logger.warning(f"{repoName} README file missing") scores[stuName]["projComment"].append(f"README file missing") - language = ["matlab", "c", "cpp"] + language = ["matlab", "c"] if projNum == 1: - for fn in list( - filter(lambda x: x.endswith(".m"), - os.listdir(repoDir))): - path = os.path.join(repoDir, fn) - if not passCodeQuality(path, language[projNum - 1]): + for fn in getAllFiles(repoDir): + if (fn.endswith(".m")) and not passCodeQuality( + os.path.join(repoDir, fn), language[projNum - 1]): self.logger.warning(f"{repoName} {fn} low quality") scores[stuName]["projComment"].append( f"{fn} low quality") @@ -299,6 +299,56 @@ class GitWorker(): self.logger.debug(f"{repoName} pull succeed") return scores + def checkProj3Process(self, groupNum, milestoneNum): + repoName = f"p3group-{groupNum:02}" + repoDir = os.path.join("projrepos", "p3", repoName) + students = self.pgroups[repoName] + scores = {stuInfo[1]: {"projComment": []} for stuInfo in students} + if not os.path.exists(repoDir): + repo = git.Repo.clone_from( + f"https://focs.ji.sjtu.edu.cn/git/vg101/{repoName}", repoDir) + else: + repo = git.Repo(os.path.join("projrepos", f"p3", repoName)) + repo.git.fetch("--tags", "--all", "-f") + remoteBranches = [ref.name for ref in repo.remote().refs] + if "origin/master" not in remoteBranches: + self.logger.warning(f"{repoName} master branch missing") + for stuInfo in students: + scores[stuInfo[1]]["projComment"].append( + f"master branch missing") + return scores + repo.git.reset("--hard", "origin/master") + repo.git.clean("-d", "-f", "-x") + if milestoneNum: + repo.git.fetch("--tags", "--all", "-f") + tagNames = [tag.name for tag in repo.tags] + if f"m{milestoneNum}" not in tagNames: + self.logger.warning(f"{repoName} tags/m{milestoneNum} missing") + for stuInfo in students: + scores[stuInfo[1]]["projComment"].append( + f"tags/m{milestoneNum} missing") + return scores + repo.git.checkout(f"tags/m{milestoneNum}", "-f") + self.logger.debug( + f"{repoName} checkout to tags/m{milestoneNum} succeed") + if not list(filter(GitWorker.isREADME, os.listdir(repoDir))): + self.logger.warning(f"{repoName} README file missing") + for stuInfo in students: + scores[stuInfo[1]]["projComment"].append( + f"README file missing") + for fn in getAllFiles(repoDir): + if (any( + (fn.endswith(suf) + for suf in [".c", ".cc", ".cpp", ".hpp", ".h", ".cxx"])) + ) and not passCodeQuality(os.path.join(repoDir, fn), "cc"): + self.logger.warning(f"{repoName} {fn} low quality") + for stuInfo in students: + scores[stuInfo[1]]["projComment"].append( + f"{fn} low quality") + else: + self.logger.debug(f"{repoName} pull succeed") + return scores + def checkIndv(self): if self.args.dir: if os.path.exists(os.path.join("indv")): @@ -326,14 +376,14 @@ class GitWorker(): def checkProj(self, projNum, milestoneNum): milestoneNum = 0 if milestoneNum is None else milestoneNum + res = {} if projNum in [1, 2]: infos = [[*info, projNum, milestoneNum] for hgroup in self.hgroups.values() for info in hgroup] + with multiprocessing.Pool(self.processCount) as p: + res = p.starmap(self.checkProjProcess, infos) elif projNum in [3]: - infos = [] - return - else: - return - with multiprocessing.Pool(self.processCount) as p: - res = p.starmap(self.checkProjProcess, infos) + infos = [[i, milestoneNum] for i in range(len(self.pgroups.keys()))] + with multiprocessing.Pool(self.processCount) as p: + res = p.starmap(self.checkProj3Process, infos) return {k: v for d in res for k, v in d.items()} \ No newline at end of file -- cgit v1.2.3