forge/scripts/assign_and_depend.py
2025-10-20 09:01:28 +02:00

99 lines
3.3 KiB
Python

import requests
import backoff
import click
from pyforgejo import PyforgejoApi
@backoff.on_exception(
backoff.expo,
requests.exceptions.ConnectionError,
max_tries=5,
jitter=backoff.full_jitter,
)
def get_issues_from_pagure(url):
issues = requests.get(url)
return issues
@click.command()
@click.option(
"--pagure-base-url",
default="https://pagure.io/api/0",
help='Base URL for Pagure API, e.g., "https://pagure.io/api/0"',
)
@click.option(
"--pagure-project",
required=True,
help='Pagure project including (optionally) the namespace, e.g., "fedora-infra/ansible" or just "pagure"',
)
@click.option(
"--forgejo-base-url",
default="https://forge.fedoraproject.org/api/v1",
help='Base URL for Forgejo API. eg., "https://forge.fedoraproject.org/api/v1"',
)
@click.option(
"--forgejo-api-key",
required=True,
help="API key to write to the Forgejo repository",
)
@click.option(
"--forgejo-project",
required=True,
help='Forgejo project including the organization or user, e.g., "infrastructure/fedora-infrastructure"',
)
def assign_and_depend(
pagure_base_url, pagure_project, forgejo_base_url, forgejo_api_key, forgejo_project
):
client = PyforgejoApi(base_url=forgejo_base_url, api_key="token " + forgejo_api_key)
try:
forgejo_org, forgejo_project = filter(None, forgejo_project.split("/"))
except ValueError:
raise click.BadParameter(
"Forgejo project must be in the format 'organization/project' or 'user/project'."
)
issues_list_url = (
f"{pagure_base_url}/{pagure_project}/issues?per_page=100&status=all"
)
issues = get_issues_from_pagure(issues_list_url)
for page in range(1, issues.json()["pagination"]["pages"] + 1):
print(f"page{page}")
issues_page = get_issues_from_pagure(f"{issues_list_url}&page={page}")
for issue in issues_page.json()["issues"]:
issue_id = issue["id"]
if issue["assignee"] != None:
assignee_name = issue["assignee"]["name"]
print(f"Assigning {assignee_name} to issue {issue_id}...")
try:
client.issue.edit_issue(
forgejo_org,
forgejo_project,
issue_id,
assignees=[assignee_name],
)
except Exception as e:
print(f"Failed to assign {assignee_name} to issue {issue_id}: {e}")
if issue["depends"]:
for dep_issue_id in issue["depends"]:
print(f"Adding dependency {dep_issue_id} to issue {issue['id']}...")
try:
client.issue.create_issue_dependencies(
forgejo_org,
forgejo_project,
int(issue["id"]),
index=int(dep_issue_id),
owner=forgejo_org,
repo=forgejo_project,
)
except Exception as e:
print(
f"Failed to add dependency {dep_issue_id} to issue {issue['id']}: {e}"
)
if __name__ == "__main__":
assign_and_depend()