From b361eba2bbc2b1404e7332d18aeb524fa01839fe Mon Sep 17 00:00:00 2001 From: openhands Date: Wed, 25 Mar 2026 06:51:47 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20setup=5Fforge=20silently=20fails=20to=20?= =?UTF-8?q?create=20users=20and=20tokens=20=E2=80=94=20.env=20has=20no=20F?= =?UTF-8?q?ORGE=5FTOKEN=20after=20init=20(#658)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add database readiness check (retry loop on `forgejo admin user list`) after API becomes reachable to avoid the race where HTTP is up but SQLite isn't accepting writes yet. Remove `2>/dev/null || true` from user creation commands so failures are logged with the actual error message. Verify each user exists via API after creation. Fail init with a clear error if admin token, bot user creation, or bot token creation fails — instead of silently writing an incomplete .env. Co-Authored-By: Claude Opus 4.6 (1M context) --- bin/disinto | 57 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/bin/disinto b/bin/disinto index cc3e877..5fbb926 100755 --- a/bin/disinto +++ b/bin/disinto @@ -361,6 +361,23 @@ setup_forge() { echo " ready" fi + # Wait for Forgejo database to accept writes (API may be ready before DB is) + echo -n "Waiting for Forgejo database" + local db_ready=false + for _i in $(seq 1 30); do + if _forgejo_exec forgejo admin user list >/dev/null 2>&1; then + db_ready=true + break + fi + echo -n "." + sleep 1 + done + echo "" + if [ "$db_ready" != true ]; then + echo "Error: Forgejo database not ready after 30s" >&2 + exit 1 + fi + # Create admin user if it doesn't exist local admin_user="disinto-admin" local admin_pass @@ -368,12 +385,22 @@ setup_forge() { if ! curl -sf --max-time 5 "${forge_url}/api/v1/users/${admin_user}" >/dev/null 2>&1; then echo "Creating admin user: ${admin_user}" - _forgejo_exec forgejo admin user create \ + local create_output + if ! create_output=$(_forgejo_exec forgejo admin user create \ --admin \ --username "${admin_user}" \ --password "${admin_pass}" \ --email "admin@disinto.local" \ - --must-change-password=false 2>/dev/null || true + --must-change-password=false 2>&1); then + echo "Error: failed to create admin user '${admin_user}':" >&2 + echo " ${create_output}" >&2 + exit 1 + fi + # Verify admin user was actually created + if ! curl -sf --max-time 5 "${forge_url}/api/v1/users/${admin_user}" >/dev/null 2>&1; then + echo "Error: admin user '${admin_user}' not found after creation" >&2 + exit 1 + fi fi # Get or create admin token @@ -393,6 +420,11 @@ setup_forge() { | jq -r '.[0].sha1 // empty') || admin_token="" fi + if [ -z "$admin_token" ]; then + echo "Error: failed to obtain admin API token" >&2 + exit 1 + fi + # Create bot users and tokens local dev_token="" review_token="" for bot_user in dev-bot review-bot; do @@ -403,11 +435,23 @@ setup_forge() { -H "Authorization: token ${admin_token}" \ "${forge_url}/api/v1/users/${bot_user}" >/dev/null 2>&1; then echo "Creating bot user: ${bot_user}" - _forgejo_exec forgejo admin user create \ + local create_output + if ! create_output=$(_forgejo_exec forgejo admin user create \ --username "${bot_user}" \ --password "${bot_pass}" \ --email "${bot_user}@disinto.local" \ - --must-change-password=false 2>/dev/null || true + --must-change-password=false 2>&1); then + echo "Error: failed to create bot user '${bot_user}':" >&2 + echo " ${create_output}" >&2 + exit 1 + fi + # Verify bot user was actually created + if ! curl -sf --max-time 5 \ + -H "Authorization: token ${admin_token}" \ + "${forge_url}/api/v1/users/${bot_user}" >/dev/null 2>&1; then + echo "Error: bot user '${bot_user}' not found after creation" >&2 + exit 1 + fi fi # Generate token via API (using admin credentials for the bot) @@ -429,6 +473,11 @@ setup_forge() { | jq -r '.sha1 // empty') || token="" fi + if [ -z "$token" ]; then + echo "Error: failed to create API token for '${bot_user}'" >&2 + exit 1 + fi + if [ "$bot_user" = "dev-bot" ]; then dev_token="$token" else