Files
AWatch-rus/scripts/create_public_issues_from_manifest.sh
T

84 lines
2.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
MANIFEST="$ROOT/docs/public-issues/public-issues-manifest.json"
if [[ "${CONFIRM_CREATE_GITHUB_ISSUES:-}" != "YES" ]]; then
printf 'create_public_issues=refused\n' >&2
printf 'Set CONFIRM_CREATE_GITHUB_ISSUES=YES to create GitHub issues.\n' >&2
printf 'Run scripts/prepare_public_issues.sh first and review the issue bodies.\n' >&2
exit 2
fi
if ! command -v gh >/dev/null 2>&1; then
printf 'create_public_issues=fail\n' >&2
printf 'gh CLI is not installed or not in PATH.\n' >&2
exit 2
fi
if ! command -v jq >/dev/null 2>&1; then
printf 'create_public_issues=fail\n' >&2
printf 'jq is required for manifest-driven issue creation.\n' >&2
exit 2
fi
if [[ ! -s "$MANIFEST" ]]; then
printf 'create_public_issues=fail\n' >&2
printf 'Missing manifest: docs/public-issues/public-issues-manifest.json\n' >&2
exit 2
fi
jq -e . "$MANIFEST" >/dev/null
jq -e '
(.status == "planned_issue_templates_ready" or .status == "public_issue_urls_recorded")
and .github_issue_tracker == "manual_or_gh_cli_creation_required"
and .github_role == "public_mirror_validation_only"
and .registry_release_evidence == "requires_russian_build_runner"
and (.issues | length == 12)
and all(.issues[];
(
.status == "ready_to_create"
and .github_issue_url == null
)
or (
.status == "created"
and (.github_issue_url | type == "string")
and (.github_issue_url | test("^https://github\\.com/igor04091968/AWatch-rus/issues/[0-9]+$"))
)
)
' "$MANIFEST" >/dev/null
gh auth status >/dev/null
existing_labels="$(mktemp)"
trap 'rm -f "$existing_labels"' EXIT
gh label list --limit 500 --json name --jq '.[].name' >"$existing_labels"
while IFS= read -r label; do
if ! grep -Fxq "$label" "$existing_labels"; then
gh label create "$label" --color "ededed" --description "AWatch-rus public governance label"
printf '%s\n' "$label" >>"$existing_labels"
fi
done < <(jq -r '.issues[] | select(.status == "ready_to_create") | .labels[]' "$MANIFEST" | sort -u)
created=0
while IFS=$'\t' read -r title labels source; do
body="$ROOT/$source"
if [[ ! -s "$body" ]]; then
printf 'create_public_issues=fail\n' >&2
printf 'Missing issue body: %s\n' "$source" >&2
exit 2
fi
url="$(gh issue create --title "$title" --label "$labels" --body-file "$body")"
printf 'created_issue=%s\n' "$url"
created=$((created + 1))
done < <(
jq -r '.issues[] | select(.status == "ready_to_create") | [.title, (.labels | join(",")), .source] | @tsv' "$MANIFEST"
)
printf 'create_public_issues=ok\n'
printf 'created=%d\n' "$created"
printf 'Update docs/public-issues/public-issues-manifest.json with the printed issue URLs.\n'