def _check_pr_event( self, event: Union[PullRequestGithubEvent, PullRequestCommentGithubEvent, MergeRequestGitlabEvent, MergeRequestCommentGitlabEvent, ], project: GitProject, service_config: ServiceConfig, job_configs: Iterable[JobConfig], ) -> bool: actor_name = event.actor if not actor_name: raise KeyError( f"Failed to get login of the actor from {type(event)}") project_url = self._strip_protocol_and_add_git(event.project_url) namespace_approved = self.is_approved(project_url) user_approved = (project.can_merge_pr(actor_name) or project.get_pr(event.pr_id).author == actor_name) if namespace_approved and user_approved: # TODO: clear failing check when present return True msg = ( f"Project {project_url} is not on our allowlist!" if not namespace_approved else f"Account {actor_name} has no write access nor is author of PR!") logger.debug(msg) if isinstance( event, (PullRequestCommentGithubEvent, MergeRequestCommentGitlabEvent)): project.get_pr(event.pr_id).comment(msg) else: for job_config in job_configs: job_helper = CoprBuildJobHelper( service_config=service_config, package_config=event.get_package_config(), project=project, metadata=EventData.from_event_dict(event.get_dict()), db_trigger=event.db_trigger, job_config=job_config, targets_override=event.targets_override, ) msg = ("Namespace is not allowed!" if not namespace_approved else "User cannot trigger!") job_helper.report_status_to_all(description=msg, state=BaseCommitStatus.neutral, url=FAQ_URL) return False
def get_package_config_from_repo( project: GitProject, reference: Optional[str] = None, base_project: Optional[GitProject] = None, pr_id: int = None, fail_when_missing: bool = True, spec_file_path: Optional[str] = None, ) -> Optional[PackageConfig]: """ Get the package config and catch the invalid config scenario and possibly no-config scenario """ if not base_project and not project: return None project_to_search_in = base_project or project try: package_config: PackageConfig = get_package_config_from_repo( project=project_to_search_in, ref=reference, spec_file_path=spec_file_path, ) if not package_config and fail_when_missing: raise PackitMissingConfigException( f"No config file for packit (e.g. `.packit.yaml`) found in " f"{project_to_search_in.full_repo_name} on commit {reference}" ) except PackitConfigException as ex: message = ( f"{str(ex)}\n\n" if isinstance(ex, PackitMissingConfigException) else f"Failed to load packit config file:\n```\n{str(ex)}\n```\n" ) message += ( "For more info, please check out the documentation: " "https://packit.dev/docs/packit-service or contact us - " "[Packit team]" "(https://github.com/orgs/packit/teams/the-packit-team)" ) if pr_id: project.get_pr(pr_id).comment(message) elif created_issue := PackageConfigGetter.create_issue_if_needed( project, title="Invalid config", message=message ): logger.debug( f"Created issue for invalid packit config: {created_issue.url}" ) raise ex
def get_current_branch_pr(self, git_project: GitProject) -> PullRequest: """ If the current branch is assoctiated with a PR, get it, otherwise return None """ current_branch = self.get_current_branch() pr_re = re.compile(r"^pr/(\d+)$") m = pr_re.match(current_branch) if m: pr_id = int(m.group(1)) pr = git_project.get_pr(pr_id) return pr # FIXME: could this logic be in ogr? input: branch + repo, output: pr for pr in git_project.get_pr_list(): if (pr.source_branch == current_branch and pr.author == git_project.service.user.get_username()): return pr