summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoYanZh <bomingzh@sjtu.edu.cn>2020-11-22 18:38:34 +0800
committerBoYanZh <bomingzh@sjtu.edu.cn>2020-11-22 18:38:34 +0800
commit10ed594c47469f55fec73cb22754abc3074a1925 (patch)
treef9e5cc66e94821f6e8732c3878ac06912e5a780c
parentc6cba8975eeb0f26b290b8799e85d9a27394568d (diff)
update for project complication
-rw-r--r--VG101GradeHelper.py19
-rw-r--r--settings.example.py10
-rw-r--r--util.py7
-rw-r--r--worker/GitWorker.py13
-rw-r--r--worker/GiteaWorker.py10
-rw-r--r--worker/JOJWorker.py63
6 files changed, 95 insertions, 27 deletions
diff --git a/VG101GradeHelper.py b/VG101GradeHelper.py
index 6890e1e..286ddef 100644
--- a/VG101GradeHelper.py
+++ b/VG101GradeHelper.py
@@ -80,8 +80,8 @@ if __name__ == "__main__":
gitWorker = GitWorker(
args, hgroups, 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)
+ giteaWorker = GiteaWorker(args, GITEA_BASE_URL, ORG_NAME, GITEA_TOKEN,
+ hgroups)
if args.indv:
indvScores = gitWorker.checkIndv()
if args.group:
@@ -92,9 +92,10 @@ if __name__ == "__main__":
**groupScores.get(key, {}),
**tmpScores.get(key, {})
}
- if args.joj:
- jojWorker = JOJWorker(args, JOJ_COURSE_ID, SID, hgroups)
- jojScores = jojWorker.checkGroupJOJ(JOJ_INFO)
+ if args.indv or args.group:
+ if args.joj:
+ jojWorker = JOJWorker(args, JOJ_COURSE_ID, SID, hgroups)
+ jojScores = jojWorker.checkGroupJOJ(JOJ_INFO)
if args.score:
canvasWorker = CanvasWorker(args, RUBRIC, CANVAS_TOKEN, COURSE_ID,
names, indvScores, groupScores, jojScores)
@@ -103,5 +104,13 @@ if __name__ == "__main__":
canvasWorker.grade2Canvas()
if args.proj:
projScores = gitWorker.checkProj(args.proj, args.ms)
+ if args.joj:
+ jojWorker = JOJWorker(args, JOJ_COURSE_ID, SID, hgroups)
+ jojScores = jojWorker.checkProjJOJ(PROJ_JOJ_INFO)
+ for key in projScores.keys():
+ projScores[key] = {
+ **projScores.get(key, {}),
+ **jojScores.get(key, {})
+ }
if args.feedback:
giteaWorker.raiseIssues(projScores)
diff --git a/settings.example.py b/settings.example.py
index 2ca7d69..4f02a88 100644
--- a/settings.example.py
+++ b/settings.example.py
@@ -37,3 +37,13 @@ MANDATORY_FILES = []
OPTIONAL_FILES = [
"ex3.c", "ex4.c", "ex1.h", "ex2.h", "ex3.h", "ex4.h", "ex5.h", "main.c"
]
+PROJ_JOJ_INFO = {
+ 2: {
+ "homeworkID": "5facbf7c9fedcc000661ff9d",
+ "problemID": "5facbee89fedcc000661ff8e"
+ },
+ 3: {
+ "homeworkID": "5facbf7c9fedcc000661ff9d",
+ "problemID": "5facbee89fedcc000661ff8e"
+ }
+}
diff --git a/util.py b/util.py
index e1dd9af..9b40518 100644
--- a/util.py
+++ b/util.py
@@ -45,11 +45,16 @@ def passCodeQuality(path, language):
with open(path, encoding='utf-8', errors='replace') as f:
res = f.read()
return "global " not in res
- if language == "c":
+ if language in ["c", "llvm-c"]:
res = subprocess.check_output(
["ctags", "-R", "-x", "--sort=yes", "--c-kinds=v", path])
lines = res.splitlines()
return len([line for line in lines if b"const" not in line]) == 0
+ if language in ["cc", "llvm-cc"]:
+ res = subprocess.check_output(
+ ["ctags", "-R", "-x", "--sort=yes", "--c++-kinds=v", path])
+ lines = res.splitlines()
+ return len([line for line in lines if b"const" not in line]) == 0
def getAllFiles(root):
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 *