La cartella dei progetti era fissata in comune.sh su ~/Work/workspace/oto, cioe' la cartella di chi ha scritto gli script, e il CLAUDE.md diceva di clonare li' anche questo repository. Adesso la sceglie la persona: progetti.sh la vuole con --in (o CARTELLA_PROGETTI), la chiede se puo' e altrimenti si ferma; il CLAUDE.md ha la regola di chiederla sempre prima di scaricare. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
149 lines
5.2 KiB
Bash
Executable File
149 lines
5.2 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# SCARICA I PROGETTI A CUI HAI ACCESSO SU GITEA.
|
|
#
|
|
# ./progetti.sh # chiede dove e quali scaricare
|
|
# ./progetti.sh --in CARTELLA nome1 nome2 # scarica questi in CARTELLA
|
|
#
|
|
# La cartella la sceglie la persona, ogni volta: non c'e' un posto di default
|
|
# (fino al 13/10/2026 era ~/Work/workspace/oto, cioe' la cartella di chi ha
|
|
# scritto lo script). Si passa con --in o con CARTELLA_PROGETTI; senza, lo
|
|
# script la chiede, e se non puo' chiederla si ferma. Un progetto gia'
|
|
# scaricato non si tocca. Vedi solo i repository che l'amministratore ti
|
|
# ha dato: se ne manca uno, e' da chiedere a lui.
|
|
# Esce 1 se un progetto chiesto non e' stato scaricato.
|
|
|
|
set -u
|
|
cd "$(dirname "$0")" || exit 1
|
|
. ./comune.sh
|
|
|
|
if [ "${1:-}" = "--in" ] ; then
|
|
if [ -z "${2:-}" ] ; then
|
|
male "--in vuole una cartella: ./progetti.sh --in CARTELLA nome1 nome2"
|
|
exit 1
|
|
fi
|
|
CARTELLA_PROGETTI="$2"
|
|
shift 2
|
|
fi
|
|
CARTELLA_PROGETTI="${CARTELLA_PROGETTI:-}"
|
|
if [ -z "$CARTELLA_PROGETTI" ] ; then
|
|
if [ ! -t 0 ] ; then
|
|
male "manca la cartella in cui scaricare: ./progetti.sh --in CARTELLA nome1 nome2"
|
|
exit 1
|
|
fi
|
|
read -r -p "In quale cartella scarico i progetti? " CARTELLA_PROGETTI
|
|
if [ -z "$CARTELLA_PROGETTI" ] ; then
|
|
male "nessuna cartella scelta: non scarico niente"
|
|
exit 1
|
|
fi
|
|
fi
|
|
# La tilde fra virgolette la shell non la espande, e su Windows la persona
|
|
# puo' scrivere C:\Users\...: in Git Bash cygpath la porta nella forma /c/...
|
|
case "$CARTELLA_PROGETTI" in
|
|
"~") CARTELLA_PROGETTI="$HOME" ;;
|
|
"~/"*) CARTELLA_PROGETTI="$HOME/${CARTELLA_PROGETTI#\~/}" ;;
|
|
esac
|
|
c_e cygpath && CARTELLA_PROGETTI="$(cygpath -u "$CARTELLA_PROGETTI")"
|
|
|
|
if [ -z "$(token_gitea)" ] ; then
|
|
male "token Gitea mancante: lancia prima ./configura.sh"
|
|
exit 1
|
|
fi
|
|
|
|
# Tutti i repository visibili, pagina per pagina. Ci si ferma solo su una
|
|
# pagina vuota vera ("[]"): un errore di Gitea a meta' non deve diventare
|
|
# "non vedi nessun progetto", ne' un elenco tagliato senza dirlo.
|
|
ELENCO=""
|
|
PAGINA=1
|
|
while : ; do
|
|
RISPOSTA="$(api_gitea "/user/repos?limit=50&page=$PAGINA")"
|
|
CODICE="${RISPOSTA##*$'\n'}"
|
|
CORPO="${RISPOSTA%$'\n'*}"
|
|
case "$CODICE" in
|
|
200) ;;
|
|
401|403) male "Gitea non accetta il tuo token: rilancia ./configura.sh" ; exit 1 ;;
|
|
000) male "Gitea ($GITEA_URL) non risponde: controlla la connessione e rilancia" ; exit 1 ;;
|
|
*) male "Gitea ha risposto HTTP $CODICE alla pagina $PAGINA dell'elenco: rilancia, e se si ripete avvisa l'amministratore" ; exit 1 ;;
|
|
esac
|
|
[ "$(printf '%s' "$CORPO" | tr -d '[:space:]')" = "[]" ] && break
|
|
BLOCCO="$(printf '%s' "$CORPO" | grep -o '"full_name"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*"\([^"]*\)"$/\1/')"
|
|
if [ -z "$BLOCCO" ] ; then
|
|
male "non capisco la risposta di Gitea alla pagina $PAGINA dell'elenco: avvisa l'amministratore"
|
|
exit 1
|
|
fi
|
|
ELENCO="$ELENCO
|
|
$BLOCCO"
|
|
PAGINA=$((PAGINA + 1))
|
|
done
|
|
ELENCO="$(printf '%s\n' "$ELENCO" | grep -v '^$' | grep -v '/_OTO_IT_onboard$' | sort -u)"
|
|
|
|
if [ -z "$ELENCO" ] ; then
|
|
attento "non vedi ancora nessun progetto: chiedi all'amministratore di aggiungerti ai repository"
|
|
exit 0
|
|
fi
|
|
|
|
# I nomi si scelgono corti (apulia_ecommerce) o completi (oto/apulia_ecommerce).
|
|
# Si tiene il nome completo: lo stesso nome corto in due organizzazioni e'
|
|
# ambiguo, e lo si dice invece di prendere il primo.
|
|
if [ "$#" -gt 0 ] ; then
|
|
SCELTI="$*"
|
|
else
|
|
titolo "Progetti che puoi scaricare"
|
|
printf '%s\n' "$ELENCO" | nl -w3 -s'. '
|
|
echo
|
|
read -r -p "Numeri o nomi, separati da spazio (invio = nessuno, 'tutti' = tutti): " RISPOSTA
|
|
[ -z "$RISPOSTA" ] && exit 0
|
|
if [ "$RISPOSTA" = "tutti" ] ; then
|
|
SCELTI="$ELENCO"
|
|
else
|
|
SCELTI=""
|
|
for R in $RISPOSTA ; do
|
|
case "$R" in
|
|
*[!0-9]*) SCELTI="$SCELTI $R" ;;
|
|
*) SCELTI="$SCELTI $(printf '%s\n' "$ELENCO" | sed -n "${R}p")" ;;
|
|
esac
|
|
done
|
|
fi
|
|
fi
|
|
|
|
ERRORI=0
|
|
if ! mkdir -p "$CARTELLA_PROGETTI" ; then
|
|
male "non riesco a creare $CARTELLA_PROGETTI"
|
|
exit 1
|
|
fi
|
|
titolo "Scarico in $CARTELLA_PROGETTI"
|
|
for NOME in $SCELTI ; do
|
|
# Confronto esatto, non una regex: il nome lo scrive la persona.
|
|
COMPLETI="$(printf '%s\n' "$ELENCO" | awk -v n="$NOME" '$0 == n || substr($0, index($0, "/") + 1) == n')"
|
|
if [ -z "$COMPLETI" ] ; then
|
|
male "$NOME: non lo vedi su Gitea (se ti serve, chiedilo all'amministratore)"
|
|
ERRORI=$((ERRORI + 1))
|
|
continue
|
|
fi
|
|
if [ "$(printf '%s\n' "$COMPLETI" | wc -l)" -gt 1 ] ; then
|
|
male "$NOME: c'e' in piu' di un'organizzazione ($(printf '%s ' $COMPLETI)): scrivi il nome completo"
|
|
ERRORI=$((ERRORI + 1))
|
|
continue
|
|
fi
|
|
CORTO="${COMPLETI#*/}"
|
|
if [ -d "$CARTELLA_PROGETTI/$CORTO/.git" ] ; then
|
|
ok "$CORTO: gia' scaricato"
|
|
continue
|
|
fi
|
|
if git clone -q "$GITEA_URL/$COMPLETI.git" "$CARTELLA_PROGETTI/$CORTO" ; then
|
|
ok "$CORTO"
|
|
else
|
|
male "$CORTO: git clone non riuscito (il messaggio di git e' qui sopra)"
|
|
ERRORI=$((ERRORI + 1))
|
|
fi
|
|
done
|
|
|
|
echo
|
|
if [ "$ERRORI" != "0" ] ; then
|
|
if [ "$ERRORI" = "1" ] ; then male "un progetto non scaricato (sopra, in rosso)"
|
|
else male "$ERRORI progetti non scaricati (sopra, in rosso)" ; fi
|
|
exit 1
|
|
fi
|
|
echo " In ogni progetto: ./start.sh (progetti con pannello) oppure bin/local-init.sh"
|
|
echo " (Drupal e WordPress). Apri claude nella cartella del progetto: ti spiega il resto."
|