From 10ed594c47469f55fec73cb22754abc3074a1925 Mon Sep 17 00:00:00 2001 From: BoYanZh Date: Sun, 22 Nov 2020 18:38:34 +0800 Subject: update for project complication --- worker/GitWorker.py | 13 ++++++++--- worker/GiteaWorker.py | 10 +++++--- worker/JOJWorker.py | 63 +++++++++++++++++++++++++++++++++++++++------------ 3 files changed, 65 insertions(+), 21 deletions(-) (limited to 'worker') diff --git a/worker/GitWorker.py b/worker/GitWorker.py index e124b1f..9d411b7 100644 --- a/worker/GitWorker.py +++ b/worker/GitWorker.py @@ -14,7 +14,7 @@ class GitWorker(): mandatoryFiles, optionalFiles, logger=Logger(), - processCount=16): + processCount=4): self.args = args self.hgroups = hgroups self.language = language @@ -97,7 +97,8 @@ class GitWorker(): ) scores[stuName]["indvFailSubmit"] = 1 scores[stuName]["indvComment"].append( - f"individual branch h{hwNum}/{fn} file missing") + f"individual branch h{hwNum}/{fn} file missing" + ) if not list(filter(GitWorker.isREADME, os.listdir(hwDir))): self.logger.warning( f"{repoName} {stuID} {stuName} h{hwNum}/README file missing" @@ -193,7 +194,8 @@ class GitWorker(): self.logger.warning(f"{repoName} {fn} low quality") continue if fn in self.mandatoryFiles: - self.logger.warning(f"{repoName} h{hwNum}/{fn} file missing") + self.logger.warning( + f"{repoName} h{hwNum}/{fn} file missing") for _, stuName in self.hgroups[repoName]: scores[stuName]["groupFailSubmit"] = 1 scores[stuName]["groupComment"].append( @@ -206,6 +208,11 @@ class GitWorker(): f"tags/h{hwNum} h{hwNum}/README file missing") if not tidy: return scores dirList = os.listdir(repoDir) + if os.path.exists(os.path.join(repoDir, ".gitea")): + dirList.extend([ + fn for fn in os.listdir(os.path.join(repoDir, ".gitea")) + if fn != "pull_request_template.md" + ]) dirList = list( filter( lambda x: x not in [ diff --git a/worker/GiteaWorker.py b/worker/GiteaWorker.py index 1b85ea9..f3e6e50 100644 --- a/worker/GiteaWorker.py +++ b/worker/GiteaWorker.py @@ -25,12 +25,14 @@ class GiteaWorker(): for key, value in scores.items(): if not value.get('projComment'): value['projComment'] = ['good job'] + if not value.get('jojComment'): + value['jojComment'] = [''] id_ = self.names[key] repoName = getProjRepoName([id_, key, self.args.proj]) url = f"{self.baseUrl}/repos/{self.orgName}/{repoName}/issues" data = { "title": f"m{self.args.ms} feedback", - "body": '\n'.join(value['projComment']), + "body": '\n'.join([*value['projComment'], *value['jojComment']]), } req = self.sess.post(url, data) self.logger.debug(f"{repoName} issue {req.status_code} {req.text}") @@ -48,6 +50,8 @@ class GiteaWorker(): for item in self.sess.get(url).json(): stuID = ''.join( [s for s in item['user']['full_name'] if s.isdigit()]) - name = self.ids[stuID] - res[name]["noReview"] = 0 + if self.ids.get(stuID): + name = self.ids[stuID] + res[name]["noReview"] = 0 + self.logger.info(f"{repoName} h{hwNum} {stuID} {name} reviewed") return res \ No newline at end of file diff --git a/worker/JOJWorker.py b/worker/JOJWorker.py index b0f316d..3724b7c 100644 --- a/worker/JOJWorker.py +++ b/worker/JOJWorker.py @@ -1,5 +1,5 @@ from bs4 import BeautifulSoup -from util import Logger +from util import Logger, getProjRepoName import multiprocessing import requests import zipfile @@ -64,13 +64,7 @@ class JOJWorker(): for result in resultSet ]) - def getProblemResult(self, - homeworkID, - problemID, - zipPath, - lang, - groupName='', - hwNum=0): + def getProblemResult(self, homeworkID, problemID, zipPath, lang): tryTime = 0 while True: tryTime += 1 @@ -78,12 +72,13 @@ class JOJWorker(): if response.status_code == 200: break self.logger.error( - f"{groupName} h{hwNum} {problemID} upload error, code {response.status_code}, url {response.url}" + f"{zipPath} {problemID} upload error, code {response.status_code}, url {response.url}" ) time.sleep(1) + res = self.getProblemStatus(response.url) self.logger.debug( - f"{groupName} h{hwNum} {problemID} upload succeed, url {response.url}") - return self.getProblemStatus(response.url) + f"{zipPath} upload succeed, url {response.url}, result {res}") + return res def checkGroupJOJProcess(self, groupNum, hwNum, jojInfo, fns, problemID): groupName = f"hgroup-{groupNum:02}" @@ -96,13 +91,13 @@ class JOJWorker(): filePath = os.path.join(hwDir, fn) if not os.path.exists(filePath): if not fn.endswith(".h"): - self.logger.warning(f"{groupName} h{hwNum} {fn} not exist") + self.logger.warning( + f"{groupName} h{hwNum} {fn} not exist") return 0 else: zf.write(filePath, fn) - res = self.getProblemResult(jojInfo["homeworkID"], problemID, - zipPath, jojInfo["lang"], - groupName, hwNum) + res = self.getProblemResult(jojInfo["homeworkID"], problemID, zipPath, + jojInfo["lang"]) # os.remove(zipPath) return res @@ -143,6 +138,44 @@ class JOJWorker(): } return res + def checkProjJOJProcess(self, repoName, homeworkID, problemID): + def zipdir(path, zipPath, zf): + for root, dirs, files in os.walk(path): + for file in files: + if os.path.join(root, file) == zipPath: + continue + if 'cmake-build-debug' in root or '.git' in root: + continue + zf.write( + os.path.join(root, file), + os.path.relpath(os.path.join(root, file), + os.path.join(path, '.'))) + + projDir = os.path.join('projrepos', f'p{self.args.proj}', repoName) + if not os.path.exists(projDir): return 0 + zipPath = os.path.join(projDir, problemID) + ".zip" + if os.path.exists(zipPath): os.remove(zipPath) + with zipfile.ZipFile(zipPath, mode='w') as zf: + zipdir(projDir, zipPath, zf) + if self.getProblemResult(homeworkID, problemID, zipPath, "cmake") == 0: + return 'JOJ copmile success with CMake' + if self.getProblemResult(homeworkID, problemID, zipPath, "make") == 0: + return 'JOJ copmile success with GNU Make' + return 'JOJ copmile failure with both GNU Make and CMake' + + def checkProjJOJ(self, jojInfo): + res = {} + projNum, milestoneNum = self.args.proj, self.args.ms + homeworkID, problemID = jojInfo[projNum]["homeworkID"], jojInfo[projNum]["problemID"] + infos = [[*info, projNum, milestoneNum] + for hgroup in self.hgroups.values() for info in hgroup] + for id_, name, projNum, milestoneNum in infos: + repoName = getProjRepoName([id_, name, projNum, milestoneNum]) + comments = [self.checkProjJOJProcess(repoName, homeworkID, + problemID)] + res[name] = {"jojComment": comments} + return res + if __name__ == "__main__": from settings import * -- cgit v1.2.3