def _create_update_push_tuples( teams: Iterable[plug.StudentTeam], template_repos: Iterable[plug.TemplateRepo], api: plug.PlatformAPI, ) -> Iterable[PushSpec]: """Create push tuples for existing repos. Repos that don't exist are ignored. Args: teams: An iterable of teams. template_repos: Template repositories. api: A platform API instance. Returns: A list of PushSpec namedtuples for all student repo urls that relate to any of the master repo urls. """ urls_to_templates = {} for team, template_repo in itertools.product(teams, template_repos): repo_url, *_ = api.get_repo_urls( [template_repo.name], team_names=[team.name] ) urls_to_templates[repo_url] = template_repo for repo in api.get_repos(list(urls_to_templates.keys())): template = urls_to_templates[repo.url] branch = git.active_branch(template.path) yield PushSpec(template.path, api.insert_auth(repo.url), branch)
def _delete_anonymous_repos( assignment_names: Iterable[str], student_teams: Iterable[plug.StudentTeam], double_blind_key: str, api: plug.PlatformAPI, ): """Delete any anonymous repos created for these students and assignments. """ anon_repo_names = [ _hash_if_key( plug.generate_repo_name(student_team, assignment_name), key=double_blind_key, ) for student_team, assignment_name in itertools.product( student_teams, assignment_names) ] anon_repo_urls = api.get_repo_urls(anon_repo_names) anon_repos = api.get_repos(anon_repo_urls) anon_repos_progress = plug.cli.io.progress_bar( anon_repos, desc="Deleting anonymous repo copies", total=len(anon_repo_names), ) for repo in anon_repos_progress: api.delete_repo(repo) progresswrappers.end_progress(anon_repos_progress)
def _repo_names_to_urls(repo_names: Iterable[str], org_name: str, api: plug.PlatformAPI) -> Tuple[List[str], List[str]]: """Use the repo_names to extract urls to the repos. Look for git repos with the correct names in the local directory and create local uris for them. For the rest, create urls to the repos assuming they are in the target organization. Do note that there is _no_ guarantee that the remote repos exist as checking this takes too much time with the REST API. A possible improvement would be to use the GraphQL API for this function. Args: repo_names: names of repositories. org_name: Name of the organization these repos are expected in. api: An API instance. Returns: A tuple of lists with (non_local_urls, local_uris). Raises: ParseError: If local templates are found, but allow_local is False. """ local = [ name for name in repo_names if util.is_git_repo(os.path.abspath(name)) ] non_local = [name for name in repo_names if name not in local] non_local_urls = api.get_repo_urls(non_local, org_name) local_uris = [ pathlib.Path(os.path.abspath(repo_name)).as_uri() for repo_name in local ] return non_local_urls, local_uris
def _repo_tuple_generator( assignment_names: List[str], teams: List[plug.StudentTeam], api: plug.PlatformAPI, ) -> Iterable[plug.StudentRepo]: for assignment_name in assignment_names: for team in teams: url, *_ = api.get_repo_urls([assignment_name], team_names=[team.name]) name = plug.generate_repo_name(team, assignment_name) yield plug.StudentRepo(name=name, url=url, team=team)
def open_issue( issue: plug.Issue, assignment_names: Iterable[str], teams: Iterable[plug.StudentTeam], api: plug.PlatformAPI, ) -> None: """Open an issue in student repos. Args: assignment_names: Names of assignments. teams: Team objects specifying student groups. issue: An issue to open. api: An implementation of :py:class:`repobee_plug.PlatformAPI` used to interface with the platform (e.g. GitHub or GitLab) instance. """ repo_urls = api.get_repo_urls(team_names=[t.name for t in teams], assignment_names=assignment_names) repos = progresswrappers.get_repos(repo_urls, api) for repo in repos: issue = api.create_issue(issue.title, issue.body, repo) msg = f"Opened issue {repo.name}/#{issue.number}-'{issue.title}'" repos.write(msg) # type: ignore plug.log.info(msg)
def _get_authed_url(assignment_name: str, org_name: str, api: plug.PlatformAPI) -> str: # FIXME temporary workaround as insert_auth is not implemented # in FakeAPI.get_repo_urls. Should be fixed in RepoBee 3.4. return api.insert_auth( api.get_repo_urls([assignment_name], org_name=org_name)[0])