# Clone and Transform Script

Script bash per clonare un repository GitLab usando API e token privato, con sostituzione automatica di stringhe nei file.

## Prerequisiti

- `bash` (4.0+)
- `git`
- `curl` (opzionale, per verificare l'accesso)
- Token privato GitLab con almeno scope `api` o `read_repository`

## Preparazione

### 1. Creare il file `transform.txt`

Crea un file `transform.txt` nella stessa directory dello script con il formato:

```txt
<old_string>=<new_string>
<old_string>=<new_string>
...
```

**Esempio di transform.txt:**

```txt
# Configurazioni di sviluppo verso produzione
DATABASE_HOST=localhost=DATABASE_HOST=prod.example.com
DATABASE_PORT=5432=DATABASE_PORT=5432
API_ENDPOINT=http://localhost:8080=API_ENDPOINT=https://api.prod.com
ENVIRONMENT=development=ENVIRONMENT=production
LOG_LEVEL=debug=LOG_LEVEL=info
SECRET_KEY=dev-secret=SECRET_KEY=prod-secret-key-xyz
```

### 2. Ottenere un token GitLab

1. Accedi a GitLab
2. Vai a **Profile → Access Tokens**
3. Crea un nuovo token con scopes:
   - `api` - accesso completo
   - oppure `read_repository` - solo lettura
4. Copia il token (non sarà più visibile dopo)

### 3. Rendere eseguibile lo script

```bash
chmod +x clone-and-transform.sh
```

## Utilizzo

### Sintassi base

```bash
./clone-and-transform.sh -u <URL> -t <TOKEN> -r <REPO-PATH> -d <DEST-DIR>
```

### Parametri

| Parametro | Breve | Descrizione | Esempio |
|-----------|-------|-------------|---------|
| `--url` | `-u` | URL base di GitLab | `https://gitlab.com` |
| `--token` | `-t` | Token di accesso privato | `glpat-xxxxx` |
| `--repo` | `-r` | Percorso del repository | `mygroup/myproject` |
| `--dest` | `-d` | Directory di destinazione | `./cloned-repo` |
| `--transform` | `-f` | Path del file transform.txt | `./transform.txt` (default) |
| `--help` | `-h` | Mostra l'aiuto | - |

### Esempi di utilizzo

**Esempio 1: Clone con trasformazioni usando file default**

```bash
./clone-and-transform.sh \
    -u https://gitlab.com \
    -t glpat-xxxxxxxxxxxx \
    -r mygroup/myproject \
    -d ./my-cloned-repo
```

**Esempio 2: Clone con file transform.txt personalizzato**

```bash
./clone-and-transform.sh \
    -u https://gitlab.internal.com \
    -t glpat-xxxxxxxxxxxx \
    -r company/backend \
    -d ./backend-clone \
    -f ./custom-transform.txt
```

**Esempio 3: Clone da GitLab Enterprise**

```bash
./clone-and-transform.sh \
    -u https://gitlab.mycompany.com \
    -t glpat-xxxxxxxxxxxx \
    -r products/idcidp \
    -d ./idcidp-prod
```

## Come funziona lo script

1. **Validazione**: Verifica i parametri e l'esistenza di `transform.txt`
2. **Clone**: Clona il repository usando autenticazione OAuth2
3. **Scoperta directory**: Identifica directory `kubernetes`, `containers`, `conf`
4. **Trasformazione**: Per ogni file trovato applica le sostituzioni definite in `transform.txt`
5. **Report**: Mostra il number di file modificati e suggerisce i prossimi passi

### Directory elaborate

Lo script elabora automaticamente questi percorsi:
- `kubernetes/`
- `containers/`
- `conf/`

Se una directory non esiste, viene saltata con un avvertimento.

### File binari

I file binari (immagini, archivi, ecc.) vengono automaticamente saltati per evitare corruzioni.

## Output esempio

```
[INFO] Starting GitLab repository clone and transformation...
[INFO] GitLab URL: https://gitlab.com
[INFO] Repository: mygroup/myproject
[INFO] Destination: ./my-cloned-repo
[INFO] Transform file: ./transform.txt
[INFO] Cloning repository...
[INFO] Repository cloned successfully
[INFO] Found directory: kubernetes
[INFO] Found directory: containers
[INFO] Applying transformations from ./transform.txt...
[INFO] Processing directory: kubernetes
[INFO]   Modified: ./my-cloned-repo/kubernetes/deployment.yaml
[INFO]   Modified: ./my-cloned-repo/kubernetes/service.yaml
[INFO] Processing directory: containers
[INFO] ========== TRANSFORMATION SUMMARY ==========
Total files processed: 12
Files modified: 5
[INFO] ==========================================
[INFO] Transformation completed successfully!

Next steps:
  1. Review changes: cd my-cloned-repo && git diff
  2. Commit changes: git add . && git commit -m 'Apply transformations'
  3. Push changes: git push
```

## Verifica delle modifiche

Dopo l'esecuzione, è consigliato verificare le modifiche:

```bash
cd ./my-cloned-repo
git diff
```

Per vedere solo i file modificati:

```bash
git status
```

## Commit e Push

Se le modifiche sono corrette:

```bash
git add .
git commit -m "Apply environment transformations"
git push
```

## Troubleshooting

### Errore: "Failed to clone repository"

**Causa**: Token non valido o senza permessi

**Soluzione**:
1. Verifica il token nel profilo GitLab
2. Assicurati che il token abbia scope `api`
3. Verifica che il repository sia accessibile con il token

### Errore: "Transform file not found"

**Causa**: Il file `transform.txt` non esiste

**Soluzione**:
1. Crea il file `transform.txt` nella directory dove esegui lo script
2. Usa l'opzione `-f` per specificare un percorso personalizzato

### Nessun file modificato

**Causa**: Le stringhe in `transform.txt` non corrispondono ai file

**Soluzione**:
1. Verifica il contenuto dei file nella directory clonata
2. Assicurati che le stringhe in `transform.txt` siano corrette
3. Usa pattern più generici se necessario

### Errore di escaping in stringhe complesse

Se le stringhe contengono caratteri speciali (barre, ampersand, etc.):

**Lo script gestisce automaticamente l'escaping**, ma se riscontri problemi:
1. Usa sequenze di escape nel file transform.txt
2. Ad esempio, per una barra inversa: `path\\old=path\\new`

## Sicurezza

### Best practices

1. **Non** commettere il token nel repository
2. Usa variabili d'ambiente per il token:
   ```bash
   ./clone-and-transform.sh \
       -u https://gitlab.com \
       -t $GITLAB_TOKEN \
       -r mygroup/myproject \
       -d ./clone
   ```

3. Usa file `.gitignore` per `transform.txt` se contiene dati sensibili:
   ```bash
   echo "transform.txt" >> .gitignore
   ```

4. Revoca il token dopo l'uso se è ad uso singolo

## Opzioni avanzate

### Usare con script di automazione

```bash
#!/bin/bash
export GITLAB_TOKEN="glpat-xxxxx"
export GITLAB_URL="https://gitlab.internal.com"

./clone-and-transform.sh \
    -u $GITLAB_URL \
    -t $GITLAB_TOKEN \
    -r company/backend \
    -d ./backend-clone
```

### Variazione per ambienti multipli

Crea diversi file di trasformazione:
- `transform-dev.txt`
- `transform-qa.txt`
- `transform-prod.txt`

```bash
# Per development
./clone-and-transform.sh \
    -u https://gitlab.com \
    -t $GITLAB_TOKEN \
    -r mygroup/myproject \
    -d ./clone-dev \
    -f transform-dev.txt

# Per production
./clone-and-transform.sh \
    -u https://gitlab.com \
    -t $GITLAB_TOKEN \
    -r mygroup/myproject \
    -d ./clone-prod \
    -f transform-prod.txt
```

## Changelog

### v1.0 (Initial Release)
- Clone repository con token privato
- Applicazione di trasformazioni su directory specifiche
- Supporto per file UTF-8
- Skip automatico file binari
- Output colorato e dettagliato

## Licenza

MIT
