convertito in formato unix sync enhanced

This commit is contained in:
2025-10-13 22:41:22 +02:00
parent 6d1bc7db4d
commit dcc4f5d26b

View File

@@ -1,373 +1,373 @@
#!/bin/bash #!/bin/bash
# #
# Script migliorato per sincronizzare file .m da server remoto # Script migliorato per sincronizzare file .m da server remoto
# e generare richiesta automatica per Claude Code # e generare richiesta automatica per Claude Code
# #
# Basato su: sync_server_file.sh # Basato su: sync_server_file.sh
# Aggiunge: Rilevamento automatico modifiche e generazione richiesta Claude # Aggiunge: Rilevamento automatico modifiche e generazione richiesta Claude
# #
# Configurazione # Configurazione
REMOTE_USER="alex" REMOTE_USER="alex"
REMOTE_HOST="80.211.60.65" REMOTE_HOST="80.211.60.65"
REMOTE_PORT="2022" REMOTE_PORT="2022"
REMOTE_SRC="/usr/local/matlab_func" REMOTE_SRC="/usr/local/matlab_func"
LOCAL_DST="/home/alex/devel/matlab-ase" LOCAL_DST="/home/alex/devel/matlab-ase"
PYTHON_DIR="${LOCAL_DST}/matlab_func" PYTHON_DIR="${LOCAL_DST}/matlab_func"
# Colori per output # Colori per output
RED='\033[0;31m' RED='\033[0;31m'
GREEN='\033[0;32m' GREEN='\033[0;32m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
BLUE='\033[0;34m' BLUE='\033[0;34m'
BOLD='\033[1m' BOLD='\033[1m'
NC='\033[0m' # No Color NC='\033[0m' # No Color
# ================================================ # ================================================
# FUNZIONI UTILITY # FUNZIONI UTILITY
# ================================================ # ================================================
print_header() { print_header() {
echo -e "\n${BLUE}${BOLD}========================================${NC}" echo -e "\n${BLUE}${BOLD}========================================${NC}"
echo -e "${BLUE}${BOLD}$1${NC}" echo -e "${BLUE}${BOLD}$1${NC}"
echo -e "${BLUE}${BOLD}========================================${NC}\n" echo -e "${BLUE}${BOLD}========================================${NC}\n"
} }
print_step() { print_step() {
echo -e "${YELLOW}[Step $1/$2]${NC} $3" echo -e "${YELLOW}[Step $1/$2]${NC} $3"
} }
print_success() { print_success() {
echo -e "${GREEN}${NC} $1" echo -e "${GREEN}${NC} $1"
} }
print_error() { print_error() {
echo -e "${RED}${NC} $1" echo -e "${RED}${NC} $1"
} }
print_info() { print_info() {
echo -e "${BLUE}${NC} $1" echo -e "${BLUE}${NC} $1"
} }
# Mappa file MATLAB → moduli Python # Mappa file MATLAB → moduli Python
get_affected_module() { get_affected_module() {
local file=$1 local file=$1
local basename=$(basename "$file" .m) local basename=$(basename "$file" .m)
# Mapping patterns # Mapping patterns
case "$basename" in case "$basename" in
CalcoloRSN*|MediaRSN*|ConvRSN*) CalcoloRSN*|MediaRSN*|ConvRSN*)
echo "RSN" ;; echo "RSN" ;;
CalcoloTLHR*|CalcoloBL*|CalcoloPL*|CalcoloKLHR*|MediaTilt*|ConvTilt*) CalcoloTLHR*|CalcoloBL*|CalcoloPL*|CalcoloKLHR*|MediaTilt*|ConvTilt*)
echo "Tilt" ;; echo "Tilt" ;;
arot*|asse_a*|asse_b*|qmult*|fqa*) arot*|asse_a*|asse_b*|qmult*|fqa*)
echo "Tilt" ;; echo "Tilt" ;;
CalcoloRL*|CalcoloLL*|CalcoloPL*|Calcolo3DEL*|CalcoloCrL*) CalcoloRL*|CalcoloLL*|CalcoloPL*|Calcolo3DEL*|CalcoloCrL*)
echo "ATD" ;; echo "ATD" ;;
CalcoloBiax*|corrTuL*|CalcoloStella*) CalcoloBiax*|corrTuL*|CalcoloStella*)
echo "ATD" ;; echo "ATD" ;;
ConvATD*|MediaATD*) ConvATD*|MediaATD*)
echo "ATD" ;; echo "ATD" ;;
database*|carica_parametri*|carica_calibrazione*) database*|carica_parametri*|carica_calibrazione*)
echo "Common" ;; echo "Common" ;;
ValidaTemp*|Despiking*) ValidaTemp*|Despiking*)
echo "Common" ;; echo "Common" ;;
*) *)
echo "Unknown" ;; echo "Unknown" ;;
esac esac
} }
# ================================================ # ================================================
# MAIN SCRIPT # MAIN SCRIPT
# ================================================ # ================================================
print_header "MATLAB → Python Sync Script with Claude Integration" print_header "MATLAB → Python Sync Script with Claude Integration"
# ------------------------------------------------ # ------------------------------------------------
# Step 1: Sincronizzazione MATLAB # Step 1: Sincronizzazione MATLAB
# ------------------------------------------------ # ------------------------------------------------
print_step 1 6 "Sincronizzazione file MATLAB da server remoto" print_step 1 6 "Sincronizzazione file MATLAB da server remoto"
echo " Host: ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PORT}" echo " Host: ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PORT}"
echo " Source: ${REMOTE_SRC}" echo " Source: ${REMOTE_SRC}"
echo " Destination: ${LOCAL_DST}" echo " Destination: ${LOCAL_DST}"
echo "" echo ""
rsync -avzm -e "ssh -p ${REMOTE_PORT}" \ rsync -avzm -e "ssh -p ${REMOTE_PORT}" \
--include='*/' \ --include='*/' \
--include='*.m' \ --include='*.m' \
--exclude='*' \ --exclude='*' \
"${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_SRC}" "${LOCAL_DST}" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_SRC}" "${LOCAL_DST}"
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
print_success "Sincronizzazione completata" print_success "Sincronizzazione completata"
else else
print_error "Errore durante la sincronizzazione Rsync" print_error "Errore durante la sincronizzazione Rsync"
exit 1 exit 1
fi fi
# ------------------------------------------------ # ------------------------------------------------
# Step 2: Rilevamento modifiche # Step 2: Rilevamento modifiche
# ------------------------------------------------ # ------------------------------------------------
print_step 2 6 "Rilevamento modifiche nei file MATLAB" print_step 2 6 "Rilevamento modifiche nei file MATLAB"
cd "${PYTHON_DIR}" || exit 1 cd "${PYTHON_DIR}" || exit 1
# Aggiungi file .m all'area di staging # Aggiungi file .m all'area di staging
find "${LOCAL_DST}" -type f -name "*.m" -print0 | xargs -0 git add 2>/dev/null find "${LOCAL_DST}" -type f -name "*.m" -print0 | xargs -0 git add 2>/dev/null
# Ottieni lista modifiche # Ottieni lista modifiche
CHANGED_FILES=$(git diff --staged --name-only | grep "\.m$" || echo "") CHANGED_FILES=$(git diff --staged --name-only | grep "\.m$" || echo "")
CHANGED_COUNT=$(echo "$CHANGED_FILES" | grep -v '^$' | wc -l) CHANGED_COUNT=$(echo "$CHANGED_FILES" | grep -v '^$' | wc -l)
if [ -z "$CHANGED_FILES" ] || [ "$CHANGED_COUNT" -eq 0 ]; then if [ -z "$CHANGED_FILES" ] || [ "$CHANGED_COUNT" -eq 0 ]; then
print_success "Nessun file MATLAB modificato - Sistema già sincronizzato" print_success "Nessun file MATLAB modificato - Sistema già sincronizzato"
echo "" echo ""
echo "Nessuna azione richiesta." echo "Nessuna azione richiesta."
exit 0 exit 0
fi fi
print_success "Rilevati ${CHANGED_COUNT} file modificati" print_success "Rilevati ${CHANGED_COUNT} file modificati"
# ------------------------------------------------ # ------------------------------------------------
# Step 3: Analisi moduli interessati # Step 3: Analisi moduli interessati
# ------------------------------------------------ # ------------------------------------------------
print_step 3 6 "Analisi moduli Python interessati" print_step 3 6 "Analisi moduli Python interessati"
declare -A affected_modules declare -A affected_modules
for file in $CHANGED_FILES; do for file in $CHANGED_FILES; do
module=$(get_affected_module "$file") module=$(get_affected_module "$file")
if [ "$module" != "Unknown" ]; then if [ "$module" != "Unknown" ]; then
affected_modules[$module]=1 affected_modules[$module]=1
fi fi
done done
echo " Moduli da aggiornare:" echo " Moduli da aggiornare:"
for module in "${!affected_modules[@]}"; do for module in "${!affected_modules[@]}"; do
print_info "$module" print_info "$module"
done done
# ------------------------------------------------ # ------------------------------------------------
# Step 4: Generazione richiesta per Claude # Step 4: Generazione richiesta per Claude
# ------------------------------------------------ # ------------------------------------------------
print_step 4 6 "Generazione richiesta per Claude Code" print_step 4 6 "Generazione richiesta per Claude Code"
TIMESTAMP=$(date +%Y%m%d_%H%M%S) TIMESTAMP=$(date +%Y%m%d_%H%M%S)
REQUEST_FILE="${PYTHON_DIR}/CLAUDE_SYNC_REQUEST_${TIMESTAMP}.md" REQUEST_FILE="${PYTHON_DIR}/CLAUDE_SYNC_REQUEST_${TIMESTAMP}.md"
# Crea richiesta formattata # Crea richiesta formattata
cat > "$REQUEST_FILE" <<EOF cat > "$REQUEST_FILE" <<EOF
# Richiesta Sincronizzazione MATLAB → Python # Richiesta Sincronizzazione MATLAB → Python
**Generato automaticamente da**: sync_server_file_enhanced.sh **Generato automaticamente da**: sync_server_file_enhanced.sh
**Data**: $(date +"%Y-%m-%d %H:%M:%S") **Data**: $(date +"%Y-%m-%d %H:%M:%S")
**File modificati**: ${CHANGED_COUNT} **File modificati**: ${CHANGED_COUNT}
--- ---
## 📋 File MATLAB Modificati ## 📋 File MATLAB Modificati
\`\`\` \`\`\`
$CHANGED_FILES $CHANGED_FILES
\`\`\` \`\`\`
--- ---
## 🎯 Moduli Python Interessati ## 🎯 Moduli Python Interessati
EOF EOF
for module in "${!affected_modules[@]}"; do for module in "${!affected_modules[@]}"; do
case "$module" in case "$module" in
RSN) RSN)
echo "- **RSN Module** → \`src/rsn/\`" >> "$REQUEST_FILE" echo "- **RSN Module** → \`src/rsn/\`" >> "$REQUEST_FILE"
echo " - Files: elaboration.py, conversion.py, averaging.py, db_write.py" >> "$REQUEST_FILE" echo " - Files: elaboration.py, conversion.py, averaging.py, db_write.py" >> "$REQUEST_FILE"
;; ;;
Tilt) Tilt)
echo "- **Tilt Module** → \`src/tilt/\`" >> "$REQUEST_FILE" echo "- **Tilt Module** → \`src/tilt/\`" >> "$REQUEST_FILE"
echo " - Files: elaboration.py, conversion.py, averaging.py, geometry.py, db_write.py" >> "$REQUEST_FILE" echo " - Files: elaboration.py, conversion.py, averaging.py, geometry.py, db_write.py" >> "$REQUEST_FILE"
;; ;;
ATD) ATD)
echo "- **ATD Module** → \`src/atd/\`" >> "$REQUEST_FILE" echo "- **ATD Module** → \`src/atd/\`" >> "$REQUEST_FILE"
echo " - Files: elaboration.py, conversion.py, averaging.py, db_write.py, star_calculation.py" >> "$REQUEST_FILE" echo " - Files: elaboration.py, conversion.py, averaging.py, db_write.py, star_calculation.py" >> "$REQUEST_FILE"
;; ;;
Common) Common)
echo "- **Common Module** → \`src/common/\`" >> "$REQUEST_FILE" echo "- **Common Module** → \`src/common/\`" >> "$REQUEST_FILE"
echo " - Files: database.py, config.py, validators.py" >> "$REQUEST_FILE" echo " - Files: database.py, config.py, validators.py" >> "$REQUEST_FILE"
;; ;;
esac esac
done done
cat >> "$REQUEST_FILE" <<'EOF' cat >> "$REQUEST_FILE" <<'EOF'
--- ---
## 📝 Preview Modifiche (prime 30 righe per file) ## 📝 Preview Modifiche (prime 30 righe per file)
EOF EOF
for file in $CHANGED_FILES; do for file in $CHANGED_FILES; do
# Ottieni path relativo # Ottieni path relativo
rel_path=$(echo "$file" | sed "s|${LOCAL_DST}/||") rel_path=$(echo "$file" | sed "s|${LOCAL_DST}/||")
cat >> "$REQUEST_FILE" <<EOF cat >> "$REQUEST_FILE" <<EOF
### 📄 ${rel_path} ### 📄 ${rel_path}
\`\`\`diff \`\`\`diff
EOF EOF
# Aggiungi diff (massimo 30 righe) # Aggiungi diff (massimo 30 righe)
git diff --staged "$file" 2>/dev/null | head -n 30 >> "$REQUEST_FILE" || echo "No diff available" >> "$REQUEST_FILE" git diff --staged "$file" 2>/dev/null | head -n 30 >> "$REQUEST_FILE" || echo "No diff available" >> "$REQUEST_FILE"
echo '```' >> "$REQUEST_FILE" echo '```' >> "$REQUEST_FILE"
done done
cat >> "$REQUEST_FILE" <<'EOF' cat >> "$REQUEST_FILE" <<'EOF'
--- ---
## ✅ Azione Richiesta ## ✅ Azione Richiesta
Aggiornare il codice Python corrispondente ai file MATLAB modificati sopra. Aggiornare il codice Python corrispondente ai file MATLAB modificati sopra.
### Workflow Suggerito ### Workflow Suggerito
1. **Analizzare modifiche MATLAB** 1. **Analizzare modifiche MATLAB**
- Leggere i file modificati - Leggere i file modificati
- Identificare cambiamenti negli algoritmi - Identificare cambiamenti negli algoritmi
- Verificare nuovi parametri o modifiche formule - Verificare nuovi parametri o modifiche formule
2. **Applicare modifiche Python** 2. **Applicare modifiche Python**
- Aggiornare funzioni Python corrispondenti - Aggiornare funzioni Python corrispondenti
- Mantenere coerenza con architettura esistente - Mantenere coerenza con architettura esistente
- Aggiungere type hints e documentazione - Aggiungere type hints e documentazione
3. **Validare modifiche** 3. **Validare modifiche**
```bash ```bash
# Test base # Test base
python -m src.main CU001 A python -m src.main CU001 A
# Validazione completa vs MATLAB # Validazione completa vs MATLAB
python -m src.validation.cli CU001 A --output validation_report.txt python -m src.validation.cli CU001 A --output validation_report.txt
# Verifica report # Verifica report
cat validation_report.txt | grep "VALIDATION" cat validation_report.txt | grep "VALIDATION"
``` ```
4. **Commit e tag** 4. **Commit e tag**
```bash ```bash
git add src/ git add src/
git commit -m "Sync Python from MATLAB changes - $(date +%Y-%m-%d)" git commit -m "Sync Python from MATLAB changes - $(date +%Y-%m-%d)"
git tag python-sync-$(date +%Y%m%d) git tag python-sync-$(date +%Y%m%d)
``` ```
--- ---
## 📚 Riferimenti ## 📚 Riferimenti
- **Mapping completo**: [MATLAB_SYNC_GUIDE.md](MATLAB_SYNC_GUIDE.md) - **Mapping completo**: [MATLAB_SYNC_GUIDE.md](MATLAB_SYNC_GUIDE.md)
- **Quick reference**: [sync_matlab_changes.md](sync_matlab_changes.md) - **Quick reference**: [sync_matlab_changes.md](sync_matlab_changes.md)
- **Validation guide**: [README.md#validation](README.md#validation) - **Validation guide**: [README.md#validation](README.md#validation)
--- ---
## 💡 Note ## 💡 Note
- I file MATLAB sono già stati committati nel repository - I file MATLAB sono già stati committati nel repository
- Questo è un commit separato che richiede sync Python - Questo è un commit separato che richiede sync Python
- Dopo sync Python, eseguire validazione per verificare equivalenza - Dopo sync Python, eseguire validazione per verificare equivalenza
--- ---
*File generato automaticamente - Non modificare manualmente* *File generato automaticamente - Non modificare manualmente*
*Timestamp: $(date +"%Y-%m-%d %H:%M:%S")* *Timestamp: $(date +"%Y-%m-%d %H:%M:%S")*
EOF EOF
print_success "Richiesta salvata: ${REQUEST_FILE}" print_success "Richiesta salvata: ${REQUEST_FILE}"
# ------------------------------------------------ # ------------------------------------------------
# Step 5: Commit MATLAB changes # Step 5: Commit MATLAB changes
# ------------------------------------------------ # ------------------------------------------------
print_step 5 6 "Commit modifiche MATLAB" print_step 5 6 "Commit modifiche MATLAB"
SYNC_DATE=$(date +"%Y-%m-%d %H:%M:%S") SYNC_DATE=$(date +"%Y-%m-%d %H:%M:%S")
COMMIT_MSG="Sync from remote server: ${SYNC_DATE}" COMMIT_MSG="Sync from remote server: ${SYNC_DATE}"
git commit -m "${COMMIT_MSG}" -m "Files changed: ${CHANGED_COUNT}" -m "$(echo "$CHANGED_FILES")" 2>/dev/null git commit -m "${COMMIT_MSG}" -m "Files changed: ${CHANGED_COUNT}" -m "$(echo "$CHANGED_FILES")" 2>/dev/null
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
MATLAB_COMMIT=$(git rev-parse --short HEAD) MATLAB_COMMIT=$(git rev-parse --short HEAD)
print_success "Commit MATLAB completato (${MATLAB_COMMIT})" print_success "Commit MATLAB completato (${MATLAB_COMMIT})"
else else
print_error "Nessuna modifica da committare (potrebbe essere già committato)" print_error "Nessuna modifica da committare (potrebbe essere già committato)"
MATLAB_COMMIT="N/A" MATLAB_COMMIT="N/A"
fi fi
# ------------------------------------------------ # ------------------------------------------------
# Step 6: Summary e istruzioni # Step 6: Summary e istruzioni
# ------------------------------------------------ # ------------------------------------------------
print_step 6 6 "Preparazione finale" print_step 6 6 "Preparazione finale"
# Copia negli appunti se xclip disponibile # Copia negli appunti se xclip disponibile
CLIPBOARD_COPIED=false CLIPBOARD_COPIED=false
if command -v xclip &> /dev/null; then if command -v xclip &> /dev/null; then
cat "$REQUEST_FILE" | xclip -selection clipboard 2>/dev/null && CLIPBOARD_COPIED=true cat "$REQUEST_FILE" | xclip -selection clipboard 2>/dev/null && CLIPBOARD_COPIED=true
if [ "$CLIPBOARD_COPIED" = true ]; then if [ "$CLIPBOARD_COPIED" = true ]; then
print_success "Richiesta copiata negli appunti" print_success "Richiesta copiata negli appunti"
fi fi
fi fi
# ================================================ # ================================================
# SUMMARY FINALE # SUMMARY FINALE
# ================================================ # ================================================
print_header "Sincronizzazione Completata" print_header "Sincronizzazione Completata"
echo -e "${BOLD}Status:${NC}" echo -e "${BOLD}Status:${NC}"
print_success "File MATLAB sincronizzati: ${CHANGED_COUNT}" print_success "File MATLAB sincronizzati: ${CHANGED_COUNT}"
print_success "Commit MATLAB: ${MATLAB_COMMIT}" print_success "Commit MATLAB: ${MATLAB_COMMIT}"
print_success "File richiesta Claude: ${REQUEST_FILE}" print_success "File richiesta Claude: ${REQUEST_FILE}"
[ "$CLIPBOARD_COPIED" = true ] && print_success "Richiesta negli appunti: Pronta per essere incollata" [ "$CLIPBOARD_COPIED" = true ] && print_success "Richiesta negli appunti: Pronta per essere incollata"
echo "" echo ""
echo -e "${BOLD}${YELLOW}⚠️ Prossimi Step - AZIONE RICHIESTA:${NC}" echo -e "${BOLD}${YELLOW}⚠️ Prossimi Step - AZIONE RICHIESTA:${NC}"
echo "" echo ""
echo -e " ${BLUE}1.${NC} Aprire Claude Code" echo -e " ${BLUE}1.${NC} Aprire Claude Code"
echo -e " ${BLUE}2.${NC} Incollare o fornire il file:" echo -e " ${BLUE}2.${NC} Incollare o fornire il file:"
echo -e " ${GREEN}${REQUEST_FILE}${NC}" echo -e " ${GREEN}${REQUEST_FILE}${NC}"
echo -e " ${BLUE}3.${NC} Claude analizzerà e aggiornerà Python automaticamente" echo -e " ${BLUE}3.${NC} Claude analizzerà e aggiornerà Python automaticamente"
echo -e " ${BLUE}4.${NC} Validare con:" echo -e " ${BLUE}4.${NC} Validare con:"
echo -e " ${GREEN}python -m src.validation.cli CU001 A${NC}" echo -e " ${GREEN}python -m src.validation.cli CU001 A${NC}"
echo "" echo ""
echo -e "${BOLD}File modificati:${NC}" echo -e "${BOLD}File modificati:${NC}"
echo "$CHANGED_FILES" | sed 's/^/ - /' echo "$CHANGED_FILES" | sed 's/^/ - /'
echo "" echo ""
echo -e "${BOLD}Moduli Python da aggiornare:${NC}" echo -e "${BOLD}Moduli Python da aggiornare:${NC}"
for module in "${!affected_modules[@]}"; do for module in "${!affected_modules[@]}"; do
echo " - $module" echo " - $module"
done done
echo "" echo ""
print_header "Fine" print_header "Fine"
# Opzione per aprire file in editor # Opzione per aprire file in editor
echo -e "${BLUE}Premere ENTER per aprire la richiesta in editor, o CTRL+C per uscire...${NC}" echo -e "${BLUE}Premere ENTER per aprire la richiesta in editor, o CTRL+C per uscire...${NC}"
read -r read -r
# Apri in editor (priorità: $EDITOR, nano, vi) # Apri in editor (priorità: $EDITOR, nano, vi)
if [ -n "$EDITOR" ]; then if [ -n "$EDITOR" ]; then
$EDITOR "$REQUEST_FILE" $EDITOR "$REQUEST_FILE"
elif command -v nano &> /dev/null; then elif command -v nano &> /dev/null; then
nano "$REQUEST_FILE" nano "$REQUEST_FILE"
elif command -v vi &> /dev/null; then elif command -v vi &> /dev/null; then
vi "$REQUEST_FILE" vi "$REQUEST_FILE"
else else
echo "Nessun editor trovato. File disponibile in: $REQUEST_FILE" echo "Nessun editor trovato. File disponibile in: $REQUEST_FILE"
fi fi
echo "" echo ""
print_success "Processo completato!" print_success "Processo completato!"
echo "" echo ""