From c7e43e091abf1b4833e727a93be6f3925f03b530 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 10 Apr 2026 14:31:18 +0000 Subject: [PATCH 1/2] fix: bug: setup_ops_repo tries POST /api/v1/orgs/disinto-admin/repos but disinto-admin is a user, not an org (#585) --- lib/ops-setup.sh | 50 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/lib/ops-setup.sh b/lib/ops-setup.sh index bacefd1..2c9c994 100644 --- a/lib/ops-setup.sh +++ b/lib/ops-setup.sh @@ -54,30 +54,58 @@ setup_ops_repo() { # If not found, try to create it in the configured namespace if [ -z "$actual_ops_slug" ]; then echo "Creating ops repo in namespace: ${org_name}" - # Create org if it doesn't exist - curl -sf -X POST \ - -H "Authorization: token ${admin_token}" \ - -H "Content-Type: application/json" \ - "${forge_url}/api/v1/orgs" \ - -d "{\"username\":\"${org_name}\",\"visibility\":\"public\"}" >/dev/null 2>&1 || true + + # Determine if target namespace is a user or an org + local ns_type="" + if curl -sf -H "Authorization: token ${admin_token}" \ + "${forge_url}/api/v1/users/${org_name}" >/dev/null 2>&1; then + # User endpoint exists - check if it's an org + if curl -sf -H "Authorization: token ${admin_token}" \ + "${forge_url}/api/v1/users/${org_name}" | grep -q '"is_org":true'; then + ns_type="org" + else + ns_type="user" + fi + elif curl -sf -H "Authorization: token ${admin_token}" \ + "${forge_url}/api/v1/orgs/${org_name}" >/dev/null 2>&1; then + # Org endpoint exists + ns_type="org" + fi + + local create_endpoint="" + if [ "$ns_type" = "org" ]; then + # Org namespace — use org API + create_endpoint="/api/v1/orgs/${org_name}/repos" + # Create org if it doesn't exist + curl -sf -X POST \ + -H "Authorization: token ${admin_token}" \ + -H "Content-Type: application/json" \ + "${forge_url}/api/v1/orgs" \ + -d "{\"username\":\"${org_name}\",\"visibility\":\"public\"}" >/dev/null 2>&1 || true + else + # User namespace — use admin API (requires admin token) + create_endpoint="/api/v1/admin/users/${org_name}/repos" + fi + if curl -sf -X POST \ -H "Authorization: token ${admin_token}" \ -H "Content-Type: application/json" \ - "${forge_url}/api/v1/orgs/${org_name}/repos" \ + "${forge_url}${create_endpoint}" \ -d "{\"name\":\"${ops_name}\",\"auto_init\":true,\"default_branch\":\"${primary_branch}\",\"description\":\"Operational data for ${org_name}/${ops_name%-ops}\"}" >/dev/null 2>&1; then actual_ops_slug="${org_name}/${ops_name}" - echo "Ops repo: ${actual_ops_slug} created on Forgejo" + local via_msg="" + [ "$ns_type" = "user" ] && via_msg=" (via admin API)" + echo "Ops repo: ${actual_ops_slug} created on Forgejo${via_msg}" else - # Fallback: use admin API to create repo under the target namespace http_code=$(curl -s -o /dev/null -w "%{http_code}" \ -X POST \ -H "Authorization: token ${admin_token}" \ -H "Content-Type: application/json" \ - "${forge_url}/api/v1/admin/users/${org_name}/repos" \ + "${forge_url}${create_endpoint}" \ -d "{\"name\":\"${ops_name}\",\"auto_init\":true,\"default_branch\":\"${primary_branch}\",\"description\":\"Operational data for ${org_name}/${ops_name%-ops}\"}" 2>/dev/null || echo "0") if [ "$http_code" = "201" ]; then actual_ops_slug="${org_name}/${ops_name}" - echo "Ops repo: ${actual_ops_slug} created on Forgejo (via admin API)" + echo "Ops repo: ${actual_ops_slug} created on Forgejo${via_msg}" else echo "Error: failed to create ops repo '${org_name}/${ops_name}' (HTTP ${http_code})" >&2 return 1 From 6dc42c3d1a6d3ad0ddfd7d616db3e09cafbe7f1d Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 10 Apr 2026 14:37:54 +0000 Subject: [PATCH 2/2] fix: bug: via_msg unbound variable under set -euo pipefail (#585) --- lib/ops-setup.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/ops-setup.sh b/lib/ops-setup.sh index 2c9c994..4dd0911 100644 --- a/lib/ops-setup.sh +++ b/lib/ops-setup.sh @@ -72,7 +72,7 @@ setup_ops_repo() { ns_type="org" fi - local create_endpoint="" + local create_endpoint="" via_msg="" if [ "$ns_type" = "org" ]; then # Org namespace — use org API create_endpoint="/api/v1/orgs/${org_name}/repos" @@ -85,6 +85,7 @@ setup_ops_repo() { else # User namespace — use admin API (requires admin token) create_endpoint="/api/v1/admin/users/${org_name}/repos" + via_msg=" (via admin API)" fi if curl -sf -X POST \ @@ -93,8 +94,6 @@ setup_ops_repo() { "${forge_url}${create_endpoint}" \ -d "{\"name\":\"${ops_name}\",\"auto_init\":true,\"default_branch\":\"${primary_branch}\",\"description\":\"Operational data for ${org_name}/${ops_name%-ops}\"}" >/dev/null 2>&1; then actual_ops_slug="${org_name}/${ops_name}" - local via_msg="" - [ "$ns_type" = "user" ] && via_msg=" (via admin API)" echo "Ops repo: ${actual_ops_slug} created on Forgejo${via_msg}" else http_code=$(curl -s -o /dev/null -w "%{http_code}" \