Skip to content
Draft
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packit_service/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@ def from_number(number: int):
FASJSON_URL = "https://fasjson.fedoraproject.org"

PACKIT_VERIFY_FAS_COMMAND = "verify-fas"
PACKIT_HELP_COMMAND = "help"

MISSING_PERMISSIONS_TO_BUILD_IN_COPR = "You don't have permissions to build in this copr."
NOT_ALLOWED_TO_BUILD_IN_COPR = "is not allowed to build in the copr"
Expand Down
2 changes: 2 additions & 0 deletions packit_service/worker/handlers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from packit_service.worker.handlers.forges import (
GithubAppInstallationHandler,
GithubFasVerificationHandler,
GitPullRequestHelpHandler,
)
from packit_service.worker.handlers.koji import (
KojiBuildHandler,
Expand Down Expand Up @@ -61,6 +62,7 @@
TestingFarmHandler.__name__,
TestingFarmResultsHandler.__name__,
GithubFasVerificationHandler.__name__,
GitPullRequestHelpHandler.__name__,
VMImageBuildHandler.__name__,
VMImageBuildResultHandler.__name__,
CoprOpenScanHubTaskFinishedHandler.__name__,
Expand Down
1 change: 1 addition & 0 deletions packit_service/worker/handlers/abstract.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,7 @@ def _add_to_mapping(kls: type["JobHandler"]):


class TaskName(str, enum.Enum):
help = "task.run_help_handler"
copr_build_start = "task.run_copr_build_start_handler"
copr_build_end = "task.run_copr_build_end_handler"
copr_build = "task.run_copr_build_handler"
Expand Down
71 changes: 69 additions & 2 deletions packit_service/worker/handlers/forges.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,38 @@
"""

import logging
from typing import Optional

from packit.config import (
Deployment,
JobConfig,
)
from packit.config.package_config import PackageConfig

from packit_service.constants import CONTACTS_URL, DOCS_APPROVAL_URL, NOTIFICATION_REPO
from packit_service.constants import (
CONTACTS_URL,
DOCS_APPROVAL_URL,
# HELP_COMMENT_PROG,
# HELP_COMMENT_PROG_FEDORA_CI,
# HELP_COMMENT_DESCRIPTION,
# HELP_COMMENT_EPILOG,
NOTIFICATION_REPO,
)
from packit_service.events import (
github,
gitlab,
pagure,
)
from packit_service.models import (
AllowlistModel,
AllowlistStatus,
GithubInstallationModel,
)
from packit_service.utils import get_packit_commands_from_comment
from packit_service.utils import (
get_packit_commands_from_comment,
# get_pr_comment_parser,
# get_pr_comment_parser_fedora_ci,
)
from packit_service.worker.allowlist import Allowlist
from packit_service.worker.checker.abstract import Checker
from packit_service.worker.checker.forges import IsIssueInNotificationRepoChecker
Expand All @@ -35,6 +50,7 @@
from packit_service.worker.mixin import (
ConfigFromEventMixin,
GetIssueMixin,
GetPullRequestMixin,
PackitAPIWithDownstreamMixin,
)
from packit_service.worker.reporting import create_issue_if_needed
Expand Down Expand Up @@ -279,3 +295,54 @@ def verify(self, namespace: str, fas_account: str) -> TaskResults:
self.issue.comment(msg)

return TaskResults(success=True, details={"msg": msg})


@reacts_to(event=github.pr.Comment)
@reacts_to(event=gitlab.mr.Comment)
@reacts_to(event=pagure.pr.Comment)
class GitPullRequestHelpHandler(
JobHandler,
PackitAPIWithDownstreamMixin,
GetPullRequestMixin,
):
task_name = TaskName.help

def __init__(
self,
package_config: Optional[PackageConfig],
job_config: Optional[JobConfig],
event: dict,
):
super().__init__(
package_config=package_config,
job_config=job_config,
event=event,
)
self.sender_login = self.data.actor
self.comment = self.data.event_dict.get("comment")

def run(self) -> TaskResults:
help_message = "PLACEHOLDER_HELP_MESSAGE_DELETE_ME_LATER"

# TODO UNCOMMENT THE FOLLOWING ONCE COMMENT PARSERS ARE AVAILABLE
# commands = get_packit_commands_from_comment(
# self.comment, # type: ignore
# self.service_config.comment_command_prefix,
# )
# if self.comment.startswith("/packit-ci"): # type: ignore
# parser = get_pr_comment_parser_fedora_ci(
# prog=HELP_COMMENT_PROG_FEDORA_CI,
# description=HELP_COMMENT_DESCRIPTION,
# epilog=HELP_COMMENT_EPILOG,
# )
# else:
# parser = get_pr_comment_parser(
# prog=HELP_COMMENT_PROG,
# description=HELP_COMMENT_DESCRIPTION,
# epilog=HELP_COMMENT_EPILOG,
# )

# help_message = parser.format_help()

self.pr.comment(body=help_message)
return TaskResults(success=True, details={"msg": help_message})
51 changes: 51 additions & 0 deletions packit_service/worker/jobs.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,14 @@
from packit_service.config import ServiceConfig
from packit_service.constants import (
COMMENT_REACTION,
PACKIT_HELP_COMMAND,
PACKIT_VERIFY_FAS_COMMAND,
TASK_ACCEPTED,
)
from packit_service.events import (
abstract,
github,
gitlab,
koji,
pagure,
testing_farm,
Expand All @@ -42,6 +44,7 @@
CoprBuildHandler,
GithubAppInstallationHandler,
GithubFasVerificationHandler,
GitPullRequestHelpHandler,
KojiBuildHandler,
ProposeDownstreamHandler,
TestingFarmHandler,
Expand Down Expand Up @@ -264,6 +267,15 @@ def process(self) -> list[TaskResults]:
).apply_async()
# should we comment about not processing if the comment is not
# on the issue created by us or not in packit/notifications?
elif isinstance(
self.event,
(github.pr.Comment, gitlab.mr.Comment, pagure.pr.Comment),
) and self.is_help_comment(self.event.comment):
self.event.comment_object.add_reaction(COMMENT_REACTION)
GitPullRequestHelpHandler.get_signature(
event=self.event,
job=None,
).apply_async()
else:
if (
isinstance(
Expand Down Expand Up @@ -1116,6 +1128,45 @@ def is_fas_verification_comment(self, comment: str) -> bool:

return bool(command and command[0] == PACKIT_VERIFY_FAS_COMMAND)

def retieve_comment_command_prefix(self, comment: str) -> Optional[str]:
"""
Retrieves the Packit prefix used in comment.

Args:
comment: Comment to retrieve prefix from.

Returns:
Packit comment command prefix or None if none is found.
"""
prefixes = ["/packit-ci-stg", "/packit-ci", "/packit-stg", "/packit"]

for prefix in prefixes:
if comment.startswith(prefix):
return prefix

return None

def is_help_comment(self, comment: str) -> bool:
"""
Checks whether the comment contains Packit help command:
`/packit(-stg) | /packit-ci(-stg) help`

Args:
comment: Comment to be checked.

Returns:
`True`, if is help comment, `False` otherwise.
"""
if not (packit_comment_command_prefix := self.retieve_comment_command_prefix(comment)):
return False

command = get_packit_commands_from_comment(
comment,
packit_comment_command_prefix,
)

return bool(command and command[0] == PACKIT_HELP_COMMAND)

def report_task_accepted_for_downstream_retrigger_comments(
self,
handler_kls: type[JobHandler],
Expand Down
16 changes: 16 additions & 0 deletions packit_service/worker/mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,22 @@ def issue(self):
return self._issue


class GetPullRequest(Protocol):
@property
@abstractmethod
def pr(self) -> PullRequest: ...


class GetPullRequestMixin(GetPullRequest, ConfigFromEventMixin):
_pr: Optional[PullRequest] = None

@property
def pr(self) -> PullRequest:
if not self._pr:
self._pr = self.project.get_pr(self.data.pr_id)
return self._pr


class GetBranches(Protocol):
@property
@abstractmethod
Expand Down
15 changes: 15 additions & 0 deletions packit_service/worker/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
DownstreamTestingFarmHandler,
DownstreamTestingFarmResultsHandler,
GithubAppInstallationHandler,
GitPullRequestHelpHandler,
KojiBuildHandler,
KojiTaskReportHandler,
ProposeDownstreamHandler,
Expand Down Expand Up @@ -296,6 +297,20 @@ def run_github_fas_verification_handler(
return get_handlers_task_results(handler.run_job(), event)


@celery_app.task(name=TaskName.help, base=TaskWithRetry)
def run_pr_help_handler(
event: dict,
package_config: dict,
job_config: dict,
Comment on lines +303 to +304
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The package_config and job_config arguments can be None when this task is called for the help command. The type hints should be updated to Optional[dict] to reflect this.

Suggested change
package_config: dict,
job_config: dict,
package_config: Optional[dict],
job_config: Optional[dict],

):
handler = GitPullRequestHelpHandler(
package_config=None,
job_config=None,
event=event,
)
return get_handlers_task_results(handler.run_job(), event)


@celery_app.task(bind=True, name=TaskName.testing_farm, base=TaskWithRetry)
def run_testing_farm_handler(
self,
Expand Down
Loading
Loading