feat: create teams with branch protection

This commit is contained in:
张泊明518370910136 2021-10-07 01:56:07 +08:00
parent 2dbe321d43
commit e1d3ad0428
No known key found for this signature in database
GPG Key ID: FBEF5DE8B9F4C629
3 changed files with 44 additions and 5 deletions

View File

@ -29,8 +29,8 @@ def create_personal_repos_for_all_canvas_students() -> None:
@app.command("create-teams", help="create teams on gitea by canvas groups") @app.command("create-teams", help="create teams on gitea by canvas groups")
def create_teams_and_repos_by_canvas_groups() -> None: def create_teams_and_repos_by_canvas_groups(group_prefix: str) -> None:
teapot.create_teams_and_repos_by_canvas_groups() teapot.create_teams_and_repos_by_canvas_groups(group_prefix)
@app.command("get-public-keys", help="list all public keys on gitea") @app.command("get-public-keys", help="list all public keys on gitea")

View File

@ -1,6 +1,6 @@
import functools import functools
from datetime import datetime from datetime import datetime
from typing import Any, Callable, List from typing import Any, Callable, List, Optional
from joint_teapot.config import settings from joint_teapot.config import settings
from joint_teapot.utils.logger import logger from joint_teapot.utils.logger import logger
@ -67,8 +67,12 @@ class Teapot:
self.canvas.students self.canvas.students
) )
def create_teams_and_repos_by_canvas_groups(self) -> List[str]: def create_teams_and_repos_by_canvas_groups(
def convertor(name: str) -> str: self, group_prefix: str = ""
) -> List[str]:
def convertor(name: str) -> Optional[str]:
if group_prefix and not name.startswith(group_prefix):
return None
team_name, number_str = name.split(" ") team_name, number_str = name.split(" ")
number = int(number_str) number = int(number_str)
return f"{team_name}-{number:02}" return f"{team_name}-{number:02}"

View File

@ -200,6 +200,7 @@ class Gitea:
team.id, self.org_name, repo_name team.id, self.org_name, repo_name
) )
membership: GroupMembership membership: GroupMembership
student_count = 0
for membership in group.get_memberships(): for membership in group.get_memberships():
student = first(students, lambda s: s.id == membership.user_id) student = first(students, lambda s: s.id == membership.user_id)
if student is None: if student is None:
@ -211,6 +212,40 @@ class Gitea:
self.repository_api.repo_add_collaborator( self.repository_api.repo_add_collaborator(
self.org_name, repo_name, username self.org_name, repo_name, username
) )
student_count += 1
try:
self.repository_api.repo_delete_branch_protection(
self.org_name, repo_name, "master"
)
except ApiException as e:
if e.status != 404:
raise
self.repository_api.repo_create_branch_protection(
self.org_name,
repo_name,
body={
"block_on_official_review_requests": True,
"block_on_outdated_branch": True,
"block_on_rejected_reviews": True,
"branch_name": "master",
"dismiss_stale_approvals": True,
"enable_approvals_whitelist": False,
"enable_merge_whitelist": False,
"enable_push": False,
"enable_push_whitelist": False,
"enable_status_check": False,
"merge_whitelist_teams": [],
"merge_whitelist_usernames": [],
"protected_file_patterns": "",
"push_whitelist_deploy_keys": False,
"push_whitelist_teams": [],
"push_whitelist_usernames": [],
"require_signed_commits": False,
"required_approvals": max(student_count - 1, 0),
"status_check_contexts": [],
},
)
logger.info(f"{self.org_name}/{repo_name} jobs done")
return repo_names return repo_names
def get_public_key_of_canvas_students(self, students: PaginatedList) -> List[str]: def get_public_key_of_canvas_students(self, students: PaginatedList) -> List[str]: