feat: retrieve release

This commit is contained in:
张泊明518370910136 2021-06-10 21:41:10 +08:00
parent 0adc5a54cd
commit de686ef4d2
9 changed files with 52 additions and 30 deletions

View File

@ -28,7 +28,7 @@ pytest -svv
## Features
- [ ] retreive the hw/project releases for all students
- [x] retrieve the hw/project releases for all students
- [x] open "bulk issues" to report something wrong
- [x] collect all the public keys
- [x] import groups (create teams)

View File

@ -1,4 +1,4 @@
from joint_teapot.canvas import Canvas as Canvas
from joint_teapot.git import Git as Git
from joint_teapot.gitea import Gitea as Gitea
from joint_teapot.teapot import Teapot as Teapot
from joint_teapot.workers import Canvas as Canvas
from joint_teapot.workers import Git as Git
from joint_teapot.workers import Gitea as Gitea

View File

@ -6,12 +6,6 @@ from pydantic import BaseSettings
class Settings(BaseSettings):
"""
Define the settings (config).
The selected value is determined as follows (in descending order of priority):
1. The command line arguments, e.g., '--db-host' is mapped to 'db-host'
2. Environment variables, e.g., '$DB_HOST' is mapped to 'db-host'
3. Variables loaded from a dotenv (.env) file
4. The default field values for the Settings model
"""
# canvas

View File

@ -1,6 +1,8 @@
from datetime import datetime
from typing import Any, Dict, List
from joint_teapot import Canvas, Git, Gitea
from joint_teapot.utils import first
class Teapot:
@ -34,6 +36,26 @@ class Teapot:
for repo_name in repo_names:
self.gitea.create_issue(repo_name, title, body)
def checkout_to_repos_by_release_name(
self,
repo_names: List[str],
release_name: str,
due: datetime = datetime(3000, 1, 1),
) -> List[str]:
failed_repos = []
repos_releases = self.gitea.get_repos_releases(repo_names)
for repo_name, repo_releases in zip(repo_names, repos_releases):
release = first(repo_releases, lambda item: item["name"] == release_name)
if (
release is None
or datetime.strptime(release["created_at"], "%Y-%m-%dT%H:%M:%S.%fZ")
>= due
):
failed_repos.append(repo_name)
continue
self.git.repo_clean_and_checkout(repo_name, f"tags/{release['tag_name']}")
return failed_repos
if __name__ == "__main__":
teapot = Teapot()

View File

@ -0,0 +1,3 @@
from joint_teapot.workers.canvas import Canvas as Canvas
from joint_teapot.workers.git import Git as Git
from joint_teapot.workers.gitea import Gitea as Gitea

View File

@ -1,8 +1,9 @@
from canvasapi import Canvas as PyCanvas
from canvasapi.group import Group, GroupMembership
from joint_teapot.config import settings
# from canvasapi.group import Group, GroupMembership
class Canvas:
def __init__(
@ -17,20 +18,19 @@ class Canvas:
)
self.assignments = self.course.get_assignments()
self.groups = self.course.get_groups()
# for attr in ["sis_login_id", "sortable_name"]:
# assert hasattr(
# self.students[0], attr
# ), f"Unable to gather students' {attr}, please contact the Canvas site admin"
group: Group
for group in self.groups:
membership: GroupMembership
print(group.__dict__)
for membership in group.get_memberships():
print(membership.user_id, end=", ")
print("")
for attr in ["sis_login_id", "sortable_name"]:
if not hasattr(self.students[0], attr):
raise Exception(
f"Unable to gather students' {attr}, please contact the Canvas site admin"
)
# group: Group
# for group in self.groups:
# membership: GroupMembership
# print(group.__dict__)
# for membership in group.get_memberships():
# print(membership.user_id, end=", ")
# print("")
if __name__ == "__main__":
canvas = Canvas()
# for student in canvas.students:
# print(student.__dict__)

View File

@ -1,6 +1,6 @@
import os
import git
from git import Repo
from joint_teapot.config import settings
@ -14,24 +14,25 @@ class Git:
raise Exception(f"{repos_dir} does not exist! Create it first.")
self.repos_dir = repos_dir
def clone_repo(self, repo_name: str) -> git.Repo:
def clone_repo(self, repo_name: str) -> Repo:
repo_dir = os.path.join(self.repos_dir, repo_name)
return git.Repo.clone_from(
return Repo.clone_from(
f"https://focs.ji.sjtu.edu.cn/git/{self.org_name}/{repo_name}",
repo_dir,
branch="master",
)
def get_repo(self, repo_name: str) -> git.Repo:
def get_repo(self, repo_name: str) -> Repo:
repo_dir = os.path.join(self.repos_dir, repo_name)
if os.path.exists(repo_dir):
return git.Repo(repo_dir)
return Repo(repo_dir)
return self.clone_repo(repo_dir)
def repo_clean_and_checkout(self, repo_name: str, checkout_dest: str) -> str:
repo_dir = os.path.join(self.repos_dir, repo_name)
repo = self.get_repo(repo_name)
repo.git.fetch("--tags", "--all", "-f")
repo.git.reset("--hard", f"origin/master")
repo.git.clean("-d", "-f", "-x")
repo.git.checkout(checkout_dest)
return os.path.join(self.repos_dir, repo_name)
return repo_dir

View File

@ -0,0 +1,2 @@
class JOJ:
...