Add exec-ryujinx-tasks subcommand

This commit is contained in:
TSR Berry 2023-09-17 17:55:30 +02:00
parent 51a8e39660
commit df0b94ba77
No known key found for this signature in database
GPG key ID: 52353C0A4CCA15E2
3 changed files with 104 additions and 1 deletions

View file

@ -3,6 +3,7 @@ import logging
from ryujinx_mako import commands from ryujinx_mako import commands
from ryujinx_mako._const import SCRIPT_NAME from ryujinx_mako._const import SCRIPT_NAME
from ryujinx_mako.commands import Subcommand
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
prog=SCRIPT_NAME, prog=SCRIPT_NAME,
@ -21,8 +22,9 @@ for subcommand in commands.SUBCOMMANDS:
description=subcommand.description(), description=subcommand.description(),
add_help=True, add_help=True,
) )
Subcommand.add_subcommand(subcommand.name(), subcommand(subcommand_parser))
# Keep a reference to the subcommand # Keep a reference to the subcommand
subcommands.append(subcommand(subcommand_parser)) subcommands.append(Subcommand.get_subcommand(subcommand.name()))
def run(): def run():

View file

@ -1,6 +1,7 @@
import logging import logging
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from argparse import ArgumentParser, Namespace from argparse import ArgumentParser, Namespace
from typing import Any
from github import Github from github import Github
from github.Auth import AppAuth from github.Auth import AppAuth
@ -9,6 +10,8 @@ from ryujinx_mako._const import APP_ID, PRIVATE_KEY, INSTALLATION_ID, SCRIPT_NAM
class Subcommand(ABC): class Subcommand(ABC):
_subcommands: dict[str, Any] = {}
@abstractmethod @abstractmethod
def __init__(self, parser: ArgumentParser): def __init__(self, parser: ArgumentParser):
parser.set_defaults(func=self.run) parser.set_defaults(func=self.run)
@ -33,6 +36,16 @@ class Subcommand(ABC):
def description() -> str: def description() -> str:
raise NotImplementedError() raise NotImplementedError()
@classmethod
def get_subcommand(cls, name: str):
return cls._subcommands[name]
@classmethod
def add_subcommand(cls, name: str, subcommand):
if name in cls._subcommands.keys():
raise ValueError(f"Key '{name}' already exists in {cls}._subcommands")
cls._subcommands[name] = subcommand
class GithubSubcommand(Subcommand, ABC): class GithubSubcommand(Subcommand, ABC):
_github = Github( _github = Github(

View file

@ -0,0 +1,88 @@
import json
import os
from argparse import ArgumentParser, Namespace
from pathlib import Path
from typing import Any
from github.Repository import Repository
from github.WorkflowRun import WorkflowRun
from ryujinx_mako.commands._subcommand import GithubSubcommand
class ExecRyujinxTasks(GithubSubcommand):
@staticmethod
def name() -> str:
return "exec-ryujinx-tasks"
@staticmethod
def description() -> str:
return "Execute all Ryujinx tasks for a specific event"
# noinspection PyTypeChecker
def __init__(self, parser: ArgumentParser):
self._workspace: Path = None
self._repo: Repository = None
self._workflow_run: WorkflowRun = None
self._event: dict[str, Any] = None
self._event_name: str = None
parser.add_argument(
"--event-name",
type=str,
required=True,
help="The name of the event that triggered the workflow run.",
)
parser.add_argument(
"--event-path",
type=str,
required=True,
help="The path to the file on the runner that contains the full "
"event webhook payload.",
)
parser.add_argument(
"-w",
"--workspace",
type=Path,
required=False,
default=Path(os.getcwd()),
help="The working directory on the runner."
)
parser.add_argument(
"repo_path",
type=str,
required=True,
help="The path to a GitHub repository."
)
parser.add_argument(
"run_id",
type=int,
required=True,
help="The unique identifier of the workflow run.",
)
super().__init__(parser)
def update_reviewers(self):
# Prepare update-reviewers
self.logger.info("Task: update-reviewers")
args = Namespace()
args.repo_path = self._repo.full_name
args.pr_number = self._event["number"]
args.config_path = Path(self._workspace, ".github", "reviewers.yml")
# Run task
self.get_subcommand("update-reviewers").run(args)
def run(self, args: Namespace):
self.logger.info("Executing Ryujinx tasks...")
self._workspace = args.workspace
self._repo = self.github.get_repo(args.repo_path)
self._workflow_run = self._repo.get_workflow_run(args.run_id)
self._event_name = args.event_name
with open(args.event_path, "r") as file:
self._event = json.load(file)
if args.event_name == "pull_request":
self.update_reviewers()
self.logger.info("Finished executing Ryujinx tasks!")