feat: retrieve release
This commit is contained in:
parent
0adc5a54cd
commit
de686ef4d2
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
3
joint_teapot/workers/__init__.py
Normal file
3
joint_teapot/workers/__init__.py
Normal 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
|
|
@ -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__)
|
|
@ -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
|
2
joint_teapot/workers/joj.py
Normal file
2
joint_teapot/workers/joj.py
Normal file
|
@ -0,0 +1,2 @@
|
|||
class JOJ:
|
||||
...
|
Loading…
Reference in New Issue
Block a user