diff --git a/joint_teapot/git.py b/joint_teapot/git.py index 9dd439a..d85606b 100644 --- a/joint_teapot/git.py +++ b/joint_teapot/git.py @@ -1,5 +1,31 @@ +import os + import git +from joint_teapot.config import settings + class Git: - ... + def __init__(self, org_name: str = settings.org_name, repos_dir: str = ""): + self.org_name = org_name + if not os.path.isdir(repos_dir): + raise Exception(f"{repos_dir} does not exist! Create it first.") + self.repos_dir = repos_dir + + def __get_repo(self, repo_name: str) -> git.Repo: + repo_dir = os.path.join(self.repos_dir, repo_name) + if os.path.exists(repo_dir): + return git.Repo(repo_dir) + return git.Repo.clone_from( + f"https://focs.ji.sjtu.edu.cn/git/{self.org_name}/{repo_name}", + repo_dir, + branch="master", + ) + + def repo_checkout_to_tag(self, repo_name: str, tag_name: str) -> str: + 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(f"tags/{tag_name}") + return os.path.join(self.repos_dir, repo_name) diff --git a/joint_teapot/gitea.py b/joint_teapot/gitea.py index c0de92f..1d00830 100644 --- a/joint_teapot/gitea.py +++ b/joint_teapot/gitea.py @@ -68,9 +68,13 @@ class Gitea: repo_name_convertor: Callable[ [User], Optional[str] ] = default_repo_name_convertor, - ) -> None: + ) -> List[str]: + repo_names = [] for student in students: repo_name = repo_name_convertor(student) + if repo_name is None: + continue + repo_names.append(repo_name) repo: Dict[str, Any] = self.organization_api.create_org_repo( self.org_name, body={ @@ -87,6 +91,7 @@ class Gitea: repo["name"], self.__get_username_by_student_id(student.sis_login_id), ) + return repo_names def create_teams_and_repos_by_canvas_groups( self, @@ -95,13 +100,15 @@ class Gitea: team_name_convertor: Callable[[str], Optional[str]] = lambda name: name, repo_name_convertor: Callable[[str], Optional[str]] = lambda name: name, permission: PermissionEnum = PermissionEnum.write, - ) -> None: + ) -> List[str]: + repo_names = [] group: Group for group in groups: team_name = team_name_convertor(group.name) repo_name = repo_name_convertor(group.name) if team_name is None or repo_name is None: continue + repo_names.append(repo_name) team: Dict[str, Any] = self.organization_api.org_create_team( self.org_name, body={ @@ -145,6 +152,7 @@ class Gitea: self.organization_api.org_add_team_member( team["id"], self.__get_username_by_student_id(student.sis_login_id) ) + return repo_names def get_public_key_of_students( self, students: PaginatedList