feat: retrieve release
This commit is contained in:
parent
0adc5a54cd
commit
de686ef4d2
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
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 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__)
|
|
|
@ -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
|
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