Skip to content
Draft
Show file tree
Hide file tree
Changes from all 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 retrieve_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.retrieve_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