#!/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."