99 lines
3.3 KiB
Python
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()
|