#!/usr/bin/env bash set -euo pipefail # verify_phase0.sh — prints tracker sanity and issues for Phase 0 (prefers open "Phase 0", then "Patch 0") # Usage: bash scripts/tracker/verify_phase0.sh [milestone_id] HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Auto-load .gitea.env if needed if [[ -z "${GITEA_BASE_URL:-}" || -z "${OWNER:-}" || -z "${REPO:-}" || -z "${GITEA_TOKEN:-}" ]]; then ENV_FILE="${HERE}/../../.gitea.env" if [[ -f "$ENV_FILE" ]]; then # shellcheck disable=SC1090 source "$ENV_FILE" fi fi if [[ -z "${GITEA_BASE_URL:-}" || -z "${OWNER:-}" || -z "${REPO:-}" || -z "${GITEA_TOKEN:-}" ]]; then echo "Missing Gitea env. Ensure .gitea.env exists or export GITEA_BASE_URL, OWNER, REPO, GITEA_TOKEN." exit 1 fi api() { local path="$1" curl -sS -H "Authorization: token ${GITEA_TOKEN}" -H "Content-Type: application/json" "${GITEA_BASE_URL}/api/v1${path}" } # Basic sanity: user & labels echo "== User ==" api "/user" | jq '{login, id}' echo "== Labels (count) ==" api "/repos/${OWNER}/${REPO}/labels" | jq 'length' # Fetch milestones once MS_JSON="$(api "/repos/${OWNER}/${REPO}/milestones")" echo "== Milestones ==" echo "$MS_JSON" | jq -c '.[] | {id, title, state, open_issues, closed_issues}' | jq . # Choose milestone id ms_id="${1:-}" if [[ -z "${ms_id}" ]]; then # Priority order: open Phase 0 → open Patch 0 → any Phase 0 → any Patch 0 for jqf in '.[] | select(.state=="open") | select(.title|test("(?i)phase 0")) | .id' '.[] | select(.state=="open") | select(.title|test("(?i)patch 0")) | .id' '.[] | select(.title|test("(?i)phase 0")) | .id' '.[] | select(.title|test("(?i)patch 0")) | .id' do cand="$(echo "$MS_JSON" | jq -r "$jqf" | head -n1)" if [[ -n "${cand}" && "${cand}" != "null" ]]; then ms_id="$cand" break fi done fi if [[ -z "${ms_id:-}" ]]; then echo "No matching milestone found (Phase 0 / Patch 0). Pass an ID explicitly." exit 1 fi # Print chosen milestone details MS_OBJ="$(echo "$MS_JSON" | jq -c ".[] | select(.id==${ms_id})")" if [[ -z "${MS_OBJ}" ]]; then echo "Milestone #${ms_id} not found in repository." exit 1 fi title="$(echo "$MS_OBJ" | jq -r '.title')" state="$(echo "$MS_OBJ" | jq -r '.state')" echo "== Using milestone #${ms_id} — ${title} (${state}) ==" # Issues under chosen milestone (open) echo "== Open issues in this milestone ==" api "/repos/${OWNER}/${REPO}/issues?milestones=${ms_id}&state=open" | jq -r '.[] | "#\(.number) \(.title)"' # All open issues (with milestone name, for quick scan) echo "== All Open Issues (title + milestone) ==" api "/repos/${OWNER}/${REPO}/issues?state=open" | jq -r '.[] | "\(.title) — [\(.milestone.title // "no milestone")]"'