upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2026-02-24 08:58:23 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2026-02-24 08:58:23 +0000
commitf62846b2966e0a3ffc93e718bbe44137d01c66b3 (patch)
treecac224e3f330fefca79c728ed05235b6bb29d98f /docs
parentc54ce061d6d278cce8362d5af085808ca60c239b (diff)
fix migration scripts for non-interactive SSH and bash 5.3
01-fetch-events.sh: nak buffers output when stdout is not a TTY, causing it to hang silently in non-interactive SSH sessions. Wrap with 'script' to provide a pseudo-TTY, then strip the injected carriage returns and connection banner line from the output. 40-classify-actions.sh: bash 5.3 treats ${#assoc[@]} and array iteration as unbound variable errors under set -u when arrays are empty. Replace ${#assoc[@]} with explicit counters and guard array iterations with set +u/set -u.
Diffstat (limited to 'docs')
-rwxr-xr-xdocs/archive/2026-01-relay-ngit-dev-migration/scripts/01-fetch-events.sh9
-rwxr-xr-xdocs/archive/2026-01-relay-ngit-dev-migration/scripts/40-classify-actions.sh37
2 files changed, 38 insertions, 8 deletions
diff --git a/docs/archive/2026-01-relay-ngit-dev-migration/scripts/01-fetch-events.sh b/docs/archive/2026-01-relay-ngit-dev-migration/scripts/01-fetch-events.sh
index e0d6f26..7079bb9 100755
--- a/docs/archive/2026-01-relay-ngit-dev-migration/scripts/01-fetch-events.sh
+++ b/docs/archive/2026-01-relay-ngit-dev-migration/scripts/01-fetch-events.sh
@@ -124,7 +124,14 @@ fetch_kind() {
124 124
125 # Use --paginate to ensure we get all events, not just first page 125 # Use --paginate to ensure we get all events, not just first page
126 # nak outputs one event per line (JSONL format) 126 # nak outputs one event per line (JSONL format)
127 if ! nak req -k "$kind" --paginate "$relay" > "$output_file" 2>/dev/null; then 127 # NOTE: nak buffers output when stdout is not a TTY (e.g. non-interactive SSH).
128 # Use 'script' to provide a pseudo-TTY so nak flushes each line immediately.
129 # Then strip the nak connection banner ("connecting to ...") and carriage returns
130 # that 'script' injects into the output stream.
131 if ! script -q -c "nak req -k $kind --paginate $relay" /dev/null 2>/dev/null \
132 | tr -d '\r' \
133 | grep -v '^connecting to ' \
134 > "$output_file"; then
128 log_error "Failed to fetch $description from $relay" 135 log_error "Failed to fetch $description from $relay"
129 return 1 136 return 1
130 fi 137 fi
diff --git a/docs/archive/2026-01-relay-ngit-dev-migration/scripts/40-classify-actions.sh b/docs/archive/2026-01-relay-ngit-dev-migration/scripts/40-classify-actions.sh
index 8b61636..94487e6 100755
--- a/docs/archive/2026-01-relay-ngit-dev-migration/scripts/40-classify-actions.sh
+++ b/docs/archive/2026-01-relay-ngit-dev-migration/scripts/40-classify-actions.sh
@@ -103,11 +103,13 @@ log_info "Building lookup tables..."
103 103
104# Build prod category lookup: repo|npub -> category 104# Build prod category lookup: repo|npub -> category
105declare -A PROD_CAT 105declare -A PROD_CAT
106PROD_CAT_COUNT=0
106while IFS='|' read -r repo npub rest || [[ -n "$repo" ]]; do 107while IFS='|' read -r repo npub rest || [[ -n "$repo" ]]; do
107 repo="${repo// /}" # Remove all spaces 108 repo="${repo// /}" # Remove all spaces
108 npub="${npub// /}" # Remove all spaces 109 npub="${npub// /}" # Remove all spaces
109 [[ -z "$repo" || -z "$npub" ]] && continue 110 [[ -z "$repo" || -z "$npub" ]] && continue
110 PROD_CAT["$repo|$npub"]="cat1" 111 PROD_CAT["$repo|$npub"]="cat1"
112 PROD_CAT_COUNT=$((PROD_CAT_COUNT + 1))
111done < "$PROD_DIR/category1-complete-match.txt" 113done < "$PROD_DIR/category1-complete-match.txt"
112 114
113while IFS='|' read -r repo npub rest || [[ -n "$repo" ]]; do 115while IFS='|' read -r repo npub rest || [[ -n "$repo" ]]; do
@@ -115,6 +117,7 @@ while IFS='|' read -r repo npub rest || [[ -n "$repo" ]]; do
115 npub="${npub// /}" 117 npub="${npub// /}"
116 [[ -z "$repo" || -z "$npub" ]] && continue 118 [[ -z "$repo" || -z "$npub" ]] && continue
117 PROD_CAT["$repo|$npub"]="cat2" 119 PROD_CAT["$repo|$npub"]="cat2"
120 PROD_CAT_COUNT=$((PROD_CAT_COUNT + 1))
118done < "$PROD_DIR/category2-empty-blank.txt" 121done < "$PROD_DIR/category2-empty-blank.txt"
119 122
120while IFS='|' read -r repo npub rest || [[ -n "$repo" ]]; do 123while IFS='|' read -r repo npub rest || [[ -n "$repo" ]]; do
@@ -122,6 +125,7 @@ while IFS='|' read -r repo npub rest || [[ -n "$repo" ]]; do
122 npub="${npub// /}" 125 npub="${npub// /}"
123 [[ -z "$repo" || -z "$npub" ]] && continue 126 [[ -z "$repo" || -z "$npub" ]] && continue
124 PROD_CAT["$repo|$npub"]="cat3" 127 PROD_CAT["$repo|$npub"]="cat3"
128 PROD_CAT_COUNT=$((PROD_CAT_COUNT + 1))
125done < "$PROD_DIR/category3-partial-match.txt" 129done < "$PROD_DIR/category3-partial-match.txt"
126 130
127while IFS='|' read -r repo npub rest || [[ -n "$repo" ]]; do 131while IFS='|' read -r repo npub rest || [[ -n "$repo" ]]; do
@@ -129,17 +133,20 @@ while IFS='|' read -r repo npub rest || [[ -n "$repo" ]]; do
129 npub="${npub// /}" 133 npub="${npub// /}"
130 [[ -z "$repo" || -z "$npub" ]] && continue 134 [[ -z "$repo" || -z "$npub" ]] && continue
131 PROD_CAT["$repo|$npub"]="cat4" 135 PROD_CAT["$repo|$npub"]="cat4"
136 PROD_CAT_COUNT=$((PROD_CAT_COUNT + 1))
132done < "$PROD_DIR/category4-no-match.txt" 137done < "$PROD_DIR/category4-no-match.txt"
133 138
134log_info "Loaded ${#PROD_CAT[@]} prod entries" 139log_info "Loaded $PROD_CAT_COUNT prod entries"
135 140
136# Build archive category lookup: repo|npub -> category 141# Build archive category lookup: repo|npub -> category
137declare -A ARCHIVE_CAT 142declare -A ARCHIVE_CAT
143ARCHIVE_CAT_COUNT=0
138while IFS='|' read -r repo npub rest; do 144while IFS='|' read -r repo npub rest; do
139 repo="${repo// /}" 145 repo="${repo// /}"
140 npub="${npub// /}" 146 npub="${npub// /}"
141 [[ -z "$repo" || -z "$npub" ]] && continue 147 [[ -z "$repo" || -z "$npub" ]] && continue
142 ARCHIVE_CAT["$repo|$npub"]="cat1" 148 ARCHIVE_CAT["$repo|$npub"]="cat1"
149 ARCHIVE_CAT_COUNT=$((ARCHIVE_CAT_COUNT + 1))
143done < "$ARCHIVE_DIR/category1-complete-match.txt" 150done < "$ARCHIVE_DIR/category1-complete-match.txt"
144 151
145while IFS='|' read -r repo npub rest; do 152while IFS='|' read -r repo npub rest; do
@@ -147,6 +154,7 @@ while IFS='|' read -r repo npub rest; do
147 npub="${npub// /}" 154 npub="${npub// /}"
148 [[ -z "$repo" || -z "$npub" ]] && continue 155 [[ -z "$repo" || -z "$npub" ]] && continue
149 ARCHIVE_CAT["$repo|$npub"]="cat2" 156 ARCHIVE_CAT["$repo|$npub"]="cat2"
157 ARCHIVE_CAT_COUNT=$((ARCHIVE_CAT_COUNT + 1))
150done < "$ARCHIVE_DIR/category2-empty-blank.txt" 158done < "$ARCHIVE_DIR/category2-empty-blank.txt"
151 159
152while IFS='|' read -r repo npub rest; do 160while IFS='|' read -r repo npub rest; do
@@ -154,6 +162,7 @@ while IFS='|' read -r repo npub rest; do
154 npub="${npub// /}" 162 npub="${npub// /}"
155 [[ -z "$repo" || -z "$npub" ]] && continue 163 [[ -z "$repo" || -z "$npub" ]] && continue
156 ARCHIVE_CAT["$repo|$npub"]="cat3" 164 ARCHIVE_CAT["$repo|$npub"]="cat3"
165 ARCHIVE_CAT_COUNT=$((ARCHIVE_CAT_COUNT + 1))
157done < "$ARCHIVE_DIR/category3-partial-match.txt" 166done < "$ARCHIVE_DIR/category3-partial-match.txt"
158 167
159while IFS='|' read -r repo npub rest; do 168while IFS='|' read -r repo npub rest; do
@@ -161,9 +170,10 @@ while IFS='|' read -r repo npub rest; do
161 npub="${npub// /}" 170 npub="${npub// /}"
162 [[ -z "$repo" || -z "$npub" ]] && continue 171 [[ -z "$repo" || -z "$npub" ]] && continue
163 ARCHIVE_CAT["$repo|$npub"]="cat4" 172 ARCHIVE_CAT["$repo|$npub"]="cat4"
173 ARCHIVE_CAT_COUNT=$((ARCHIVE_CAT_COUNT + 1))
164done < "$ARCHIVE_DIR/category4-no-match.txt" 174done < "$ARCHIVE_DIR/category4-no-match.txt"
165 175
166log_info "Loaded ${#ARCHIVE_CAT[@]} archive entries" 176log_info "Loaded $ARCHIVE_CAT_COUNT archive entries"
167 177
168# Build purgatory lookup: repo|npub -> 1 (if purgatory expired) 178# Build purgatory lookup: repo|npub -> 1 (if purgatory expired)
169declare -A PURGATORY 179declare -A PURGATORY
@@ -237,7 +247,7 @@ process_deletions() {
237process_deletions "$PROD_DIR/raw/deletions.json" 247process_deletions "$PROD_DIR/raw/deletions.json"
238process_deletions "$ARCHIVE_DIR/raw/deletions.json" 248process_deletions "$ARCHIVE_DIR/raw/deletions.json"
239DELETED_COUNT=0 249DELETED_COUNT=0
240[[ ${#DELETED[@]} -gt 0 ]] && DELETED_COUNT=${#DELETED[@]} 250for _k in "${!DELETED[@]}"; do DELETED_COUNT=$((DELETED_COUNT + 1)); done
241log_info "Loaded $DELETED_COUNT deletion entries" 251log_info "Loaded $DELETED_COUNT deletion entries"
242 252
243# Build git ancestry lookup: repo|npub -> relationship (archive-ahead, prod-ahead, diverged, etc.) 253# Build git ancestry lookup: repo|npub -> relationship (archive-ahead, prod-ahead, diverged, etc.)
@@ -266,17 +276,20 @@ fi
266log_info "Building unique repo list..." 276log_info "Building unique repo list..."
267 277
268declare -A ALL_REPOS 278declare -A ALL_REPOS
279ALL_REPOS_COUNT=0
280set +u
269for key in "${!PROD_CAT[@]}"; do 281for key in "${!PROD_CAT[@]}"; do
270 ALL_REPOS["$key"]=1 282 [[ -z "${ALL_REPOS[$key]+x}" ]] && { ALL_REPOS["$key"]=1; ALL_REPOS_COUNT=$((ALL_REPOS_COUNT + 1)); }
271done 283done
272for key in "${!ARCHIVE_CAT[@]}"; do 284for key in "${!ARCHIVE_CAT[@]}"; do
273 ALL_REPOS["$key"]=1 285 [[ -z "${ALL_REPOS[$key]+x}" ]] && { ALL_REPOS["$key"]=1; ALL_REPOS_COUNT=$((ALL_REPOS_COUNT + 1)); }
274done 286done
275for key in "${!PURGATORY[@]}"; do 287for key in "${!PURGATORY[@]}"; do
276 ALL_REPOS["$key"]=1 288 [[ -z "${ALL_REPOS[$key]+x}" ]] && { ALL_REPOS["$key"]=1; ALL_REPOS_COUNT=$((ALL_REPOS_COUNT + 1)); }
277done 289done
290set -u
278 291
279log_info "Total unique repos: ${#ALL_REPOS[@]}" 292log_info "Total unique repos: $ALL_REPOS_COUNT"
280 293
281# ============================================================================ 294# ============================================================================
282# Phase 3: Classify each repo according to revised decision tree 295# Phase 3: Classify each repo according to revised decision tree
@@ -351,6 +364,7 @@ cat_to_status() {
351} 364}
352 365
353LOOP_COUNT=0 366LOOP_COUNT=0
367set +u
354for key in "${!ALL_REPOS[@]}"; do 368for key in "${!ALL_REPOS[@]}"; do
355 LOOP_COUNT=$((LOOP_COUNT + 1)) 369 LOOP_COUNT=$((LOOP_COUNT + 1))
356 [[ $((LOOP_COUNT % 100)) -eq 0 ]] && log_info "Processed $LOOP_COUNT repos..." 370 [[ $((LOOP_COUNT % 100)) -eq 0 ]] && log_info "Processed $LOOP_COUNT repos..."
@@ -473,6 +487,7 @@ for key in "${!ALL_REPOS[@]}"; do
473 ;; 487 ;;
474 esac 488 esac
475done 489done
490set -u
476 491
477# ============================================================================ 492# ============================================================================
478# Phase 4: Write output files 493# Phase 4: Write output files
@@ -488,9 +503,11 @@ TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%S+00:00")
488 echo "# Generated: $TIMESTAMP" 503 echo "# Generated: $TIMESTAMP"
489 echo "# Format: repo | npub | prod_status | archive_status | context | reason" 504 echo "# Format: repo | npub | prod_status | archive_status | context | reason"
490 echo "#" 505 echo "#"
506 set +u
491 for line in "${READY_LINES[@]}"; do 507 for line in "${READY_LINES[@]}"; do
492 echo "$line" 508 echo "$line"
493 done 509 done
510 set -u
494} > "$READY_FILE" 511} > "$READY_FILE"
495 512
496# Write needs-resync.txt 513# Write needs-resync.txt
@@ -503,9 +520,11 @@ TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%S+00:00")
503 echo "# purgatory-expired = archive tried to sync but failed (30min timeout)" 520 echo "# purgatory-expired = archive tried to sync but failed (30min timeout)"
504 echo "# none = archive never tried or announcement missing" 521 echo "# none = archive never tried or announcement missing"
505 echo "#" 522 echo "#"
523 set +u
506 for line in "${RESYNC_LINES[@]}"; do 524 for line in "${RESYNC_LINES[@]}"; do
507 echo "$line" 525 echo "$line"
508 done 526 done
527 set -u
509} > "$RESYNC_FILE" 528} > "$RESYNC_FILE"
510 529
511# Write manual-review.txt 530# Write manual-review.txt
@@ -514,9 +533,11 @@ TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%S+00:00")
514 echo "# Generated: $TIMESTAMP" 533 echo "# Generated: $TIMESTAMP"
515 echo "# Format: repo | npub | prod_status | archive_status | context | reason" 534 echo "# Format: repo | npub | prod_status | archive_status | context | reason"
516 echo "#" 535 echo "#"
536 set +u
517 for line in "${REVIEW_LINES[@]}"; do 537 for line in "${REVIEW_LINES[@]}"; do
518 echo "$line" 538 echo "$line"
519 done 539 done
540 set -u
520} > "$REVIEW_FILE" 541} > "$REVIEW_FILE"
521 542
522# ============================================================================ 543# ============================================================================
@@ -525,9 +546,11 @@ TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%S+00:00")
525 546
526log_info "Generating summary..." 547log_info "Generating summary..."
527 548
549set +u
528TOTAL_READY="${#READY_LINES[@]}" 550TOTAL_READY="${#READY_LINES[@]}"
529TOTAL_RESYNC="${#RESYNC_LINES[@]}" 551TOTAL_RESYNC="${#RESYNC_LINES[@]}"
530TOTAL_REVIEW="${#REVIEW_LINES[@]}" 552TOTAL_REVIEW="${#REVIEW_LINES[@]}"
553set -u
531TOTAL=$((TOTAL_READY + TOTAL_RESYNC + TOTAL_REVIEW)) 554TOTAL=$((TOTAL_READY + TOTAL_RESYNC + TOTAL_REVIEW))
532 555
533# Calculate percentages 556# Calculate percentages