forked from JOJ/Joint-Teapot
		
	feat: git
This commit is contained in:
		
							parent
							
								
									5c1b1b4b19
								
							
						
					
					
						commit
						baa7ed089d
					
				|  | @ -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) | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user