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 ## 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] open "bulk issues" to report something wrong
- [x] collect all the public keys - [x] collect all the public keys
- [x] import groups (create teams) - [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.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): class Settings(BaseSettings):
""" """
Define the settings (config). 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 # canvas

View File

@ -1,6 +1,8 @@
from datetime import datetime
from typing import Any, Dict, List from typing import Any, Dict, List
from joint_teapot import Canvas, Git, Gitea from joint_teapot import Canvas, Git, Gitea
from joint_teapot.utils import first
class Teapot: class Teapot:
@ -34,6 +36,26 @@ class Teapot:
for repo_name in repo_names: for repo_name in repo_names:
self.gitea.create_issue(repo_name, title, body) 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__": if __name__ == "__main__":
teapot = Teapot() 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 import Canvas as PyCanvas
from canvasapi.group import Group, GroupMembership
from joint_teapot.config import settings from joint_teapot.config import settings
# from canvasapi.group import Group, GroupMembership
class Canvas: class Canvas:
def __init__( def __init__(
@ -17,20 +18,19 @@ class Canvas:
) )
self.assignments = self.course.get_assignments() self.assignments = self.course.get_assignments()
self.groups = self.course.get_groups() self.groups = self.course.get_groups()
# for attr in ["sis_login_id", "sortable_name"]: for attr in ["sis_login_id", "sortable_name"]:
# assert hasattr( if not hasattr(self.students[0], attr):
# self.students[0], attr raise Exception(
# ), f"Unable to gather students' {attr}, please contact the Canvas site admin" f"Unable to gather students' {attr}, please contact the Canvas site admin"
group: Group )
for group in self.groups: # group: Group
membership: GroupMembership # for group in self.groups:
print(group.__dict__) # membership: GroupMembership
for membership in group.get_memberships(): # print(group.__dict__)
print(membership.user_id, end=", ") # for membership in group.get_memberships():
print("") # print(membership.user_id, end=", ")
# print("")
if __name__ == "__main__": if __name__ == "__main__":
canvas = Canvas() canvas = Canvas()
# for student in canvas.students:
# print(student.__dict__)

View File

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