feat: git

This commit is contained in:
张泊明518370910136 2021-06-10 02:55:05 +08:00
parent 5c1b1b4b19
commit baa7ed089d
2 changed files with 37 additions and 3 deletions

View File

@ -1,5 +1,31 @@
import os
import git import git
from joint_teapot.config import settings
class Git: 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)

View File

@ -68,9 +68,13 @@ class Gitea:
repo_name_convertor: Callable[ repo_name_convertor: Callable[
[User], Optional[str] [User], Optional[str]
] = default_repo_name_convertor, ] = default_repo_name_convertor,
) -> None: ) -> List[str]:
repo_names = []
for student in students: for student in students:
repo_name = repo_name_convertor(student) 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( repo: Dict[str, Any] = self.organization_api.create_org_repo(
self.org_name, self.org_name,
body={ body={
@ -87,6 +91,7 @@ class Gitea:
repo["name"], repo["name"],
self.__get_username_by_student_id(student.sis_login_id), self.__get_username_by_student_id(student.sis_login_id),
) )
return repo_names
def create_teams_and_repos_by_canvas_groups( def create_teams_and_repos_by_canvas_groups(
self, self,
@ -95,13 +100,15 @@ class Gitea:
team_name_convertor: Callable[[str], Optional[str]] = lambda name: name, team_name_convertor: Callable[[str], Optional[str]] = lambda name: name,
repo_name_convertor: Callable[[str], Optional[str]] = lambda name: name, repo_name_convertor: Callable[[str], Optional[str]] = lambda name: name,
permission: PermissionEnum = PermissionEnum.write, permission: PermissionEnum = PermissionEnum.write,
) -> None: ) -> List[str]:
repo_names = []
group: Group group: Group
for group in groups: for group in groups:
team_name = team_name_convertor(group.name) team_name = team_name_convertor(group.name)
repo_name = repo_name_convertor(group.name) repo_name = repo_name_convertor(group.name)
if team_name is None or repo_name is None: if team_name is None or repo_name is None:
continue continue
repo_names.append(repo_name)
team: Dict[str, Any] = self.organization_api.org_create_team( team: Dict[str, Any] = self.organization_api.org_create_team(
self.org_name, self.org_name,
body={ body={
@ -145,6 +152,7 @@ class Gitea:
self.organization_api.org_add_team_member( self.organization_api.org_add_team_member(
team["id"], self.__get_username_by_student_id(student.sis_login_id) team["id"], self.__get_username_by_student_id(student.sis_login_id)
) )
return repo_names
def get_public_key_of_students( def get_public_key_of_students(
self, students: PaginatedList self, students: PaginatedList