Public Access
Post-merge / detect-type (push) Successful in 10s
Post-merge / validate-commit-msg (push) Successful in 10s
Post-merge / configure-repo (push) Successful in 11s
Post-merge / sync-wiki (push) Successful in 17s
Post-merge / vikunja (push) Successful in 18s
Post-merge / release (push) Successful in 36s
Post-merge / publish (push) Successful in 20s
Post-merge / badges (push) Successful in 35s
79 lines
2.3 KiB
Python
79 lines
2.3 KiB
Python
"""Shared utilities for tools modules."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import platform
|
|
import subprocess # nosec B404
|
|
|
|
import click
|
|
|
|
from devx.tokens import get_developer_token
|
|
|
|
|
|
def arch_string() -> str:
|
|
"""Return the architecture string used by release assets.
|
|
|
|
Maps ``platform.machine()`` to the common release asset naming:
|
|
``amd64`` for x86_64, ``arm64`` for aarch64.
|
|
|
|
Raises:
|
|
click.ClickException: If the architecture is not supported.
|
|
"""
|
|
machine = platform.machine().lower()
|
|
if machine in {"x86_64", "amd64"}:
|
|
return "amd64"
|
|
if machine in {"aarch64", "arm64"}:
|
|
return "arm64"
|
|
raise click.ClickException(f"Unsupported architecture: {machine}")
|
|
|
|
|
|
def detect_pr_number() -> int | None:
|
|
"""Detect the PR number for the current git branch.
|
|
|
|
Returns the PR number if the current branch has an open PR, or None
|
|
if no PR is found. Does NOT raise — callers decide how to handle None.
|
|
Best-effort: returns None on any failure (no token, API down, etc.).
|
|
"""
|
|
result = subprocess.run( # nosec B603, B607
|
|
["git", "rev-parse", "--abbrev-ref", "HEAD"],
|
|
capture_output=True,
|
|
text=True,
|
|
check=False,
|
|
)
|
|
if result.returncode != 0:
|
|
return None
|
|
branch = result.stdout.strip()
|
|
if branch == "HEAD":
|
|
return None
|
|
|
|
try:
|
|
token = get_developer_token()
|
|
except click.ClickException:
|
|
return None
|
|
|
|
owner = os.environ.get("DEVX_REPO_OWNER", "")
|
|
repo = os.environ.get("DEVX_REPO_NAME", "")
|
|
if not owner or not repo:
|
|
github_repo = os.environ.get("GITHUB_REPOSITORY", "")
|
|
if "/" in github_repo:
|
|
owner, repo = github_repo.split("/", 1)
|
|
|
|
if not owner or not repo:
|
|
return None
|
|
|
|
# Lazy import to avoid circular dependency
|
|
from devx.api_clients import APIError, GiteaClient # noqa: PLC0415
|
|
from devx.config import GITEA_API_URL # noqa: PLC0415
|
|
|
|
client = GiteaClient(GITEA_API_URL, token, owner, repo)
|
|
try:
|
|
prs = client.list_prs(state="open")
|
|
except APIError:
|
|
# Best-effort: API down or auth failure → no PR detected
|
|
return None
|
|
for pr in prs:
|
|
if pr.get("head", {}).get("ref") == branch:
|
|
return int(pr["number"])
|
|
return None
|