Esempio n. 1
0
    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
Esempio n. 2
0
    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
Esempio n. 3
0
    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