summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoYanZh <bomingzh@sjtu.edu.cn>2020-11-22 21:24:44 +0800
committerBoYanZh <bomingzh@sjtu.edu.cn>2020-11-22 21:24:44 +0800
commit40844d627e0d07b59da151d49ece6d4de7a6d1c1 (patch)
tree9197317f3df48a2838539a531213f6931547b97f
parent10ed594c47469f55fec73cb22754abc3074a1925 (diff)
update for p3
-rw-r--r--.gitignore1
-rw-r--r--VG101GradeHelper.py3
-rw-r--r--pgroups.example.json12
-rw-r--r--worker/GitWorker.py74
4 files changed, 77 insertions, 13 deletions
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