Skip to content

Commit 457d872

Browse files
committed
Add GitPullRequestHelpHandler class
1 parent aa1ffde commit 457d872

File tree

9 files changed

+473
-1
lines changed

9 files changed

+473
-1
lines changed

packit_service/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ def from_number(number: int):
232232
FASJSON_URL = "https://fasjson.fedoraproject.org"
233233

234234
PACKIT_VERIFY_FAS_COMMAND = "verify-fas"
235+
PACKIT_HELP_COMMAND = "help"
235236

236237
MISSING_PERMISSIONS_TO_BUILD_IN_COPR = "You don't have permissions to build in this copr."
237238
NOT_ALLOWED_TO_BUILD_IN_COPR = "is not allowed to build in the copr"

packit_service/worker/handlers/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from packit_service.worker.handlers.forges import (
2626
GithubAppInstallationHandler,
2727
GithubFasVerificationHandler,
28+
GitPullRequestHelpHandler,
2829
)
2930
from packit_service.worker.handlers.koji import (
3031
KojiBuildHandler,
@@ -61,6 +62,7 @@
6162
TestingFarmHandler.__name__,
6263
TestingFarmResultsHandler.__name__,
6364
GithubFasVerificationHandler.__name__,
65+
GitPullRequestHelpHandler.__name__,
6466
VMImageBuildHandler.__name__,
6567
VMImageBuildResultHandler.__name__,
6668
CoprOpenScanHubTaskFinishedHandler.__name__,

packit_service/worker/handlers/abstract.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ def _add_to_mapping(kls: type["JobHandler"]):
218218

219219

220220
class TaskName(str, enum.Enum):
221+
help = "task.run_help_handler"
221222
copr_build_start = "task.run_copr_build_start_handler"
222223
copr_build_end = "task.run_copr_build_end_handler"
223224
copr_build = "task.run_copr_build_handler"

packit_service/worker/handlers/forges.py

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,17 @@
1717
from packit_service.constants import CONTACTS_URL, DOCS_APPROVAL_URL, NOTIFICATION_REPO
1818
from packit_service.events import (
1919
github,
20+
gitlab,
21+
pagure,
2022
)
2123
from packit_service.models import (
2224
AllowlistModel,
2325
AllowlistStatus,
2426
GithubInstallationModel,
2527
)
26-
from packit_service.utils import get_packit_commands_from_comment
28+
from packit_service.utils import (
29+
get_packit_commands_from_comment, # , get_pr_comment_parser, get_pr_comment_parser_fedora_ci
30+
)
2731
from packit_service.worker.allowlist import Allowlist
2832
from packit_service.worker.checker.abstract import Checker
2933
from packit_service.worker.checker.forges import IsIssueInNotificationRepoChecker
@@ -35,6 +39,7 @@
3539
from packit_service.worker.mixin import (
3640
ConfigFromEventMixin,
3741
GetIssueMixin,
42+
GetPullRequestMixin,
3843
PackitAPIWithDownstreamMixin,
3944
)
4045
from packit_service.worker.reporting import create_issue_if_needed
@@ -279,3 +284,61 @@ def verify(self, namespace: str, fas_account: str) -> TaskResults:
279284
self.issue.comment(msg)
280285

281286
return TaskResults(success=True, details={"msg": msg})
287+
288+
289+
@reacts_to(event=github.pr.Comment)
290+
@reacts_to(event=gitlab.mr.Comment)
291+
@reacts_to(event=pagure.pr.Comment)
292+
class GitPullRequestHelpHandler(
293+
JobHandler,
294+
PackitAPIWithDownstreamMixin,
295+
GetPullRequestMixin,
296+
):
297+
task_name = TaskName.help
298+
299+
def __init__(
300+
self,
301+
package_config: PackageConfig,
302+
job_config: JobConfig,
303+
event: dict,
304+
):
305+
super().__init__(
306+
package_config=package_config,
307+
job_config=job_config,
308+
event=event,
309+
)
310+
self.sender_login = self.data.actor
311+
self.comment = self.data.event_dict.get("comment")
312+
313+
def run(self) -> TaskResults:
314+
help_message = "PLACEHOLDER_HELP_MESSAGE_DELETE_ME_LATER"
315+
316+
# TODO UNCOMMENT THE FOLLOWING ONCE COMMENT PARSERS ARE AVAILABLE
317+
# commands = get_packit_commands_from_comment(
318+
# self.comment, # type: ignore
319+
# self.service_config.comment_command_prefix,
320+
# )
321+
# if self.comment.startswith("/packit-ci"): # type: ignore
322+
# parser = get_pr_comment_parser_fedora_ci(
323+
# prog=HELP_COMMENT_PROG_FEDORA_CI,
324+
# description=HELP_COMMENT_DESCRIPTION,
325+
# epilog=HELP_COMMENT_EPILOG,
326+
# )
327+
# else:
328+
# parser = get_pr_comment_parser(
329+
# prog=HELP_COMMENT_PROG,
330+
# description=HELP_COMMENT_DESCRIPTION,
331+
# epilog=HELP_COMMENT_EPILOG,
332+
# )
333+
334+
# # prevent help message from being printed to stdout
335+
# # save help message to buffer
336+
# help_message_buffer = io.StringIO()
337+
# backup_stdout = sys.stdout
338+
# sys.stdout = help_message_buffer
339+
# parser.print_help()
340+
# sys.stdout = backup_stdout
341+
# help_message = help_message_buffer.getvalue()
342+
343+
self.pr.comment(body=help_message)
344+
return TaskResults(success=True, details={"msg": help_message})

packit_service/worker/jobs.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919
from packit_service.config import ServiceConfig
2020
from packit_service.constants import (
2121
COMMENT_REACTION,
22+
PACKIT_HELP_COMMAND,
2223
PACKIT_VERIFY_FAS_COMMAND,
2324
TASK_ACCEPTED,
2425
)
2526
from packit_service.events import (
2627
abstract,
2728
github,
29+
gitlab,
2830
koji,
2931
pagure,
3032
testing_farm,
@@ -42,6 +44,7 @@
4244
CoprBuildHandler,
4345
GithubAppInstallationHandler,
4446
GithubFasVerificationHandler,
47+
GitPullRequestHelpHandler,
4548
KojiBuildHandler,
4649
ProposeDownstreamHandler,
4750
TestingFarmHandler,
@@ -264,6 +267,15 @@ def process(self) -> list[TaskResults]:
264267
).apply_async()
265268
# should we comment about not processing if the comment is not
266269
# on the issue created by us or not in packit/notifications?
270+
elif isinstance(
271+
self.event,
272+
(github.pr.Comment, gitlab.mr.Comment, pagure.pr.Comment),
273+
) and self.is_help_comment(self.event.comment):
274+
self.event.comment_object.add_reaction(COMMENT_REACTION)
275+
GitPullRequestHelpHandler.get_signature(
276+
event=self.event,
277+
job=None,
278+
).apply_async()
267279
else:
268280
if (
269281
isinstance(
@@ -1116,6 +1128,24 @@ def is_fas_verification_comment(self, comment: str) -> bool:
11161128

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

1131+
def is_help_comment(self, comment: str) -> bool:
1132+
"""
1133+
Checks whether the comment contains Packit help command:
1134+
`/packit(-stg) | /packit-ci(-stg) help`
1135+
1136+
Args:
1137+
comment: Comment to be checked.
1138+
1139+
Returns:
1140+
`True`, if is help comment, `False` otherwise.
1141+
"""
1142+
command = get_packit_commands_from_comment(
1143+
comment,
1144+
self.service_config.comment_command_prefix,
1145+
)
1146+
1147+
return bool(command and command[0] == PACKIT_HELP_COMMAND)
1148+
11191149
def report_task_accepted_for_downstream_retrigger_comments(
11201150
self,
11211151
handler_kls: type[JobHandler],

packit_service/worker/mixin.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,22 @@ def issue(self):
289289
return self._issue
290290

291291

292+
class GetPullRequest(Protocol):
293+
@property
294+
@abstractmethod
295+
def pr(self) -> PullRequest: ...
296+
297+
298+
class GetPullRequestMixin(GetPullRequest, ConfigFromEventMixin):
299+
_pr: Optional[PullRequest] = None
300+
301+
@property
302+
def pr(self):
303+
if not self._pr:
304+
self._pr = self.project.get_pr(self.data.pr_id)
305+
return self._pr
306+
307+
292308
class GetBranches(Protocol):
293309
@property
294310
@abstractmethod

packit_service/worker/tasks.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
DownstreamTestingFarmHandler,
5656
DownstreamTestingFarmResultsHandler,
5757
GithubAppInstallationHandler,
58+
GitPullRequestHelpHandler,
5859
KojiBuildHandler,
5960
KojiTaskReportHandler,
6061
ProposeDownstreamHandler,
@@ -290,6 +291,20 @@ def run_github_fas_verification_handler(
290291
return get_handlers_task_results(handler.run_job(), event)
291292

292293

294+
@celery_app.task(name=TaskName.help, base=TaskWithRetry)
295+
def run_pr_help_handler(
296+
event: dict,
297+
package_config: dict,
298+
job_config: dict,
299+
):
300+
handler = GitPullRequestHelpHandler(
301+
package_config=None,
302+
job_config=None,
303+
event=event,
304+
)
305+
return get_handlers_task_results(handler.run_job(), event)
306+
307+
293308
@celery_app.task(bind=True, name=TaskName.testing_farm, base=TaskWithRetry)
294309
def run_testing_farm_handler(
295310
self,

0 commit comments

Comments
 (0)