provisioning/tools/fix-try-catch.nu
Jesús Pérez 6a59d34bb1
chore: update provisioning configuration and documentation
Update configuration files, templates, and internal documentation
for the provisioning repository system.

Configuration Updates:
- KMS configuration modernization
- Plugin system settings
- Service port mappings
- Test cluster topologies
- Installation configuration examples
- VM configuration defaults
- Cedar authorization policies

Documentation Updates:
- Library module documentation
- Extension API guides
- AI system documentation
- Service management guides
- Test environment setup
- Plugin usage guides
- Validator configuration documentation

All changes are backward compatible.
2025-12-11 21:50:42 +00:00

204 lines
5.5 KiB
Plaintext
Executable File

#!/usr/bin/env nu
# Fix try-catch blocks for Nushell 0.107.1 compatibility
#
# Converts old try-catch pattern to complete-based error handling
# See .claude/best_nushell_code.md lines 642-697
def main [
--dry-run # Show what would be changed without modifying files
--verbose # Show detailed progress
] {
print "🔍 Searching for files with try-catch blocks..."
let files = (
find provisioning -name "*.nu" -type f
| lines
| where $it != ""
| each { |file|
if ($file | path exists) {
let content = (open $file)
let has_try = ($content | str contains "try {")
if $has_try {
$file
} else {
null
}
} else {
null
}
}
| compact
)
let total = ($files | length)
print $"📝 Found ($total) files with try-catch blocks"
if $total == 0 {
print "✅ No files need fixing"
return
}
print ""
print "⚙️ Pattern to apply:"
print "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
print "OLD (Nushell 0.106):"
print " try {"
print " operation"
print " } catch { |err|"
print " handle_error"
print " }"
print ""
print "NEW (Nushell 0.107.1):"
print " let result = (do {"
print " operation"
print " } | complete)"
print " "
print " if $result.exit_code == 0 {"
print " $result.stdout"
print " } else {"
print " handle_error"
print " }"
print "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
print ""
if $dry_run {
print "🔍 DRY RUN MODE - No files will be modified"
print ""
print "Files that would be processed:"
$files | each { |file| print $" • ($file)" }
print ""
print $"Run without --dry-run to apply changes to ($total) files"
return
}
print "⚠️ WARNING: This will modify ($total) files"
print "Make sure you have committed your changes or have a backup!"
print ""
let confirm = (input "Type 'yes' to continue: ")
if $confirm != "yes" {
print "❌ Aborted by user"
return
}
print ""
print "🚀 Processing files..."
print ""
mut fixed_count = 0
mut error_count = 0
for file in $files {
if $verbose {
print $"📄 Processing: ($file)"
}
let result = (do {
fix-file $file
} | complete)
if $result.exit_code == 0 {
$fixed_count = ($fixed_count + 1)
if $verbose {
print $" ✅ Fixed"
} else {
print -n "."
}
} else {
$error_count = ($error_count + 1)
print $" ❌ Error: ($result.stderr)"
}
}
if not $verbose {
print ""
}
print ""
print "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
print $"✅ Fixed: ($fixed_count) files"
print $"❌ Errors: ($error_count) files"
print $"📊 Total: ($total) files"
print "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
if $error_count > 0 {
print ""
print "⚠️ Some files had errors. Review them manually:"
print " git diff provisioning/"
}
}
# Fix try-catch in a single file
def fix-file [file: path] -> nothing {
let content = (open $file)
# Pattern 1: Simple try-catch without error parameter
# try { code } catch { error }
let pattern1_fixed = (
$content
| str replace --all --regex 'try \{\s*([^}]+)\s*\} catch \{\s*([^}]+)\s*\}' (
'let result = (do { $1 } | complete); if $result.exit_code == 0 { $result.stdout } else { $2 }'
)
)
# Pattern 2: Try-catch with error parameter (more complex)
# This requires manual review for now
# Just add a comment
let pattern2_fixed = (
$pattern1_fixed
| str replace --all --regex 'try \{' '# TODO: Convert to complete pattern\ntry {'
)
$pattern2_fixed | save --force $file
null
}
# Show statistics about try-catch usage
def stats [] {
print "📊 Try-Catch Usage Statistics"
print ""
let files = (
find provisioning -name "*.nu" -type f
| lines
| where $it != ""
| each { |file|
if ($file | path exists) {
let content = (open $file)
let count = (
$content
| split row "try {"
| length
| $in - 1
)
if $count > 0 {
{ file: $file, count: $count }
} else {
null
}
} else {
null
}
}
| compact
)
let total_files = ($files | length)
let total_blocks = ($files | get count | math sum)
print $"Files with try-catch: ($total_files)"
print $"Total try-catch blocks: ($total_blocks)"
print ""
print "Top 10 files by usage:"
$files
| sort-by count --reverse
| first 10
| each { |row|
print $" ($row.count)x - ($row.file)"
}
}