# Gestionnaire Git Flow interactif

Ce projet contient un petit gestionnaire Bash interactif qui simplifie l'utilisation de 4 scripts Git existants :

- `start-branch.sh`
- `finish-feature.sh`
- `create-release.sh`
- `deploy-release.sh`

Le script principal est :

```bash
./flow.sh
```

Il affiche un menu et demande les informations nécessaires au fur et à mesure.

---

## Objectif

Le but est d'éviter de retenir toutes les commandes à lancer manuellement.

Au lieu d'exécuter directement :

```bash
./start-branch.sh feature login
./finish-feature.sh
./create-release.sh 1.0.0
./deploy-release.sh 1.0.0
```

Tu peux lancer :

```bash
./flow.sh
```

Puis choisir l'action voulue dans le menu.

---

## Fichiers nécessaires

Les 5 fichiers doivent être placés dans le même dossier :

```text
.
├── flow.sh
├── start-branch.sh
├── finish-feature.sh
├── create-release.sh
└── deploy-release.sh
```

Le gestionnaire interactif ne remplace pas les scripts existants. Il les utilise simplement pour lancer les bonnes actions avec les bons paramètres.

---

## Installation

### 1. Placer les fichiers dans ton projet

Copie les fichiers `.sh` à la racine de ton dépôt Git, ou dans un dossier dédié du projet.

Exemple :

```bash
cd mon-projet
```

Puis vérifie que les fichiers sont présents :

```bash
ls -la
```

Tu dois voir au minimum :

```text
flow.sh
start-branch.sh
finish-feature.sh
create-release.sh
deploy-release.sh
```

### 2. Rendre les scripts exécutables

Lance :

```bash
chmod +x flow.sh
chmod +x start-branch.sh
chmod +x finish-feature.sh
chmod +x create-release.sh
chmod +x deploy-release.sh
```

Tu peux aussi tout faire en une seule commande :

```bash
chmod +x *.sh
```

---

## Prérequis

Avant d'utiliser les scripts, vérifie que :

1. Tu es dans un dépôt Git.
2. Le remote `origin` existe.
3. Les branches `develop` et `master` existent.
4. Tu as les droits pour pousser sur le dépôt distant.
5. Tu as une connexion SSH fonctionnelle pour le déploiement.
6. Tu n'as pas de changements non commités avant certaines actions sensibles.

Pour vérifier que tu es bien dans un dépôt Git :

```bash
git status
```

Pour vérifier les branches :

```bash
git branch
```

Pour vérifier les remotes :

```bash
git remote -v
```

---

## Lancer le gestionnaire interactif

Commande principale :

```bash
./flow.sh
```

Le menu affiché ressemble à ceci :

```text
========================================
  Gestionnaire Git Flow
========================================

Que veux-tu faire ?
1) Créer une branche feature/hotfix
2) Finaliser la branche actuelle
3) Créer une release
4) Déployer une release
5) Voir le statut Git
6) Aide
0) Quitter

Choix :
```

Tu choisis un numéro, puis le script demande les détails nécessaires.

---

## Commandes disponibles

Tu peux utiliser le mode menu ou lancer directement une action.

### Afficher le menu

```bash
./flow.sh
```

### Créer une branche feature ou hotfix

```bash
./flow.sh start
```

### Finaliser la branche actuelle

```bash
./flow.sh finish
```

### Créer une release

```bash
./flow.sh release
```

### Déployer une release

```bash
./flow.sh deploy
```

### Voir le statut Git

```bash
./flow.sh status
```

### Afficher l'aide

```bash
./flow.sh help
```

Ou :

```bash
./flow.sh --help
./flow.sh -h
```

---

## Workflow complet recommandé

Le workflow standard est le suivant :

```text
develop
   │
   ├── feature-login
   │       │
   │       └── merge vers develop
   │
   ├── release-1.0.0
   │       │
   │       ├── merge vers master
   │       ├── merge vers develop
   │       ├── tag de version
   │       └── déploiement serveur
```

En pratique :

```bash
./flow.sh start
# développement sur la branche créée
./flow.sh finish
./flow.sh release
./flow.sh deploy
```

---

## 1. Créer une branche feature ou hotfix

Commande :

```bash
./flow.sh start
```

Le script demande :

```text
Quel type de branche veux-tu créer ?
1) feature
2) hotfix
Choix (1/2) :
```

Puis :

```text
Nom court de la branche :
```

Exemple :

```text
Choix : 1
Nom court de la branche : login
```

Le script lancera automatiquement :

```bash
./start-branch.sh feature login
```

Cela créera une branche :

```text
feature-login
```

Pour un correctif urgent :

```text
Choix : 2
Nom court de la branche : bug-cache
```

Cela créera :

```text
hotfix-bug-cache
```

### Ce que fait le script de création

Le script `start-branch.sh` :

1. Vérifie que tu es dans un dépôt Git.
2. Vérifie qu'il n'y a pas de changements non commités.
3. Récupère les dernières informations du remote.
4. Se place sur `develop`.
5. Met à jour `develop` avec `git pull`.
6. Crée la branche demandée.
7. Pousse la branche sur `origin`.

---

## 2. Travailler sur la branche

Une fois la branche créée, tu peux développer normalement.

Exemple :

```bash
# modifier des fichiers
git status
git add .
git commit -m "feature: ajout du login"
git push
```

Tu peux aussi laisser le script `finish` proposer un commit si des changements locaux existent encore.

---

## 3. Finaliser une feature

Commande :

```bash
./flow.sh finish
```

Le script affiche la branche actuelle et demande confirmation.

Exemple :

```text
Branche actuelle : feature-login
Cette action va finaliser la branche actuelle et la merger dans develop.
Continuer ? (yes/no)
```

Si tu réponds :

```text
yes
```

Le script lance :

```bash
./finish-feature.sh
```

### Ce que fait la finalisation

Le script `finish-feature.sh` :

1. Vérifie que tu es bien sur une branche feature ou hotfix.
2. Refuse de s'exécuter depuis `master`, `main` ou `develop`.
3. Propose de committer les changements locaux si nécessaire.
4. Récupère les dernières informations Git.
5. Met à jour `develop`.
6. Rebase ta branche sur `develop`.
7. Push ta branche avec `--force-with-lease`.
8. Merge ta branche dans `develop` avec `--no-ff`.
9. Push `develop`.
10. Propose de supprimer la branche locale et distante.

---

## 4. Créer une release

Commande :

```bash
./flow.sh release
```

Le script demande :

```text
Version de la release, exemple 1.0.0 :
```

Exemple :

```text
1.0.0
```

Le script lancera :

```bash
./create-release.sh 1.0.0
```

Cela créera une branche :

```text
release-1.0.0
```

### Ce que fait la création de release

Le script `create-release.sh` :

1. Vérifie qu'une version est fournie.
2. Vérifie qu'il n'y a pas de changements non commités.
3. Se place sur `develop`.
4. Met à jour `develop` depuis `origin`.
5. Vérifie que la branche release n'existe pas déjà en local.
6. Vérifie que la branche release n'existe pas déjà sur le remote.
7. Crée la branche `release-X.Y.Z`.
8. Pousse la branche sur `origin`.

---

## 5. Déployer une release

Commande :

```bash
./flow.sh deploy
```

Le script demande :

```text
Version à déployer, exemple 1.0.0 :
```

Exemple :

```text
1.0.0
```

Le script attend que tu sois sur :

```text
release-1.0.0
```

Si tu n'es pas sur cette branche, il propose de faire automatiquement :

```bash
git checkout release-1.0.0
```

Ensuite, il lance :

```bash
./deploy-release.sh 1.0.0
```

### Ce que fait le déploiement

Le script `deploy-release.sh` :

1. Vérifie que tu es sur la branche `release-X.Y.Z`.
2. Commit les changements locaux si nécessaire.
3. Push la branche release.
4. Merge la release vers `master`.
5. Push `master`.
6. Merge la release vers `develop`.
7. Push `develop`.
8. Crée un tag de version.
9. Push le tag.
10. Se connecte au serveur distant en SSH.
11. Met à jour le projet distant depuis `origin/master`.
12. Vide le cache applicatif.

---

## 6. Voir le statut Git

Commande :

```bash
./flow.sh status
```

Cette commande affiche :

1. La branche actuelle.
2. Le statut Git court.
3. Les 5 derniers commits.

Exemple :

```text
Branche actuelle :
feature-login

Statut Git :
 M src/Controller/LoginController.php

Derniers commits :
abc1234 feature: ajout du login
def5678 fix: correction cache
```

---

## 7. Afficher l'aide

Commande :

```bash
./flow.sh help
```

Ou :

```bash
./flow.sh --help
./flow.sh -h
```

Cela affiche les commandes disponibles.

---

## Règles importantes

### Répondre `yes`

Les confirmations attendent exactement :

```text
yes
```

Si tu écris autre chose, l'action est annulée.

Exemples qui annulent :

```text
y
oui
YES
no
```

### Branches utilisées

Le workflow utilise principalement :

```text
develop
master
feature-xxx
hotfix-xxx
release-x.y.z
```

### Nommage des branches

Quand tu crées une branche, le nom est nettoyé automatiquement par `start-branch.sh`.

Exemple :

```text
Mon Super Login
```

peut devenir :

```text
feature-mon-super-login
```

---

## Exemples complets

### Exemple 1 : créer et finaliser une feature

```bash
./flow.sh start
```

Réponses :

```text
Choix (1/2) : 1
Nom court de la branche : login
Créer cette branche ? yes
```

Développer la fonctionnalité :

```bash
# modifier les fichiers
git status
git add .
git commit -m "feature: ajout du login"
git push
```

Finaliser :

```bash
./flow.sh finish
```

Répondre :

```text
Continuer ? yes
Supprimer la branche feature locale et distante ? yes
```

---

### Exemple 2 : créer une release

```bash
./flow.sh release
```

Réponse :

```text
Version de la release, exemple 1.0.0 : 1.0.0
Créer cette release ? yes
```

Branche créée :

```text
release-1.0.0
```

---

### Exemple 3 : déployer une release

```bash
./flow.sh deploy
```

Réponse :

```text
Version à déployer, exemple 1.0.0 : 1.0.0
Déployer cette release ? yes
```

Le script va ensuite merger, taguer et déployer.

---

## Erreurs fréquentes

### `Ce dossier n'est pas un dépôt Git`

Tu n'es pas dans le bon dossier.

Solution :

```bash
cd chemin/vers/ton/projet
git status
```

Puis relance le script.

---

### `Tu as des changements non commités`

Certaines actions refusent de continuer si ton espace de travail n'est pas propre.

Solutions possibles :

```bash
git add .
git commit -m "message du commit"
```

Ou :

```bash
git stash
```

Puis relance le script.

---

### `Script introuvable`

Le gestionnaire ne trouve pas un des 4 scripts nécessaires.

Solution : vérifie que tous les scripts sont dans le même dossier :

```bash
ls -la *.sh
```

---

### `Permission denied`

Le fichier n'est pas exécutable.

Solution :

```bash
chmod +x *.sh
```

---

### `La branche existe déjà`

Une branche locale ou distante existe déjà avec le même nom.

Solutions possibles :

```bash
git branch
```

```bash
git branch -r
```

Puis choisis un autre nom ou supprime l'ancienne branche si elle n'est plus utile.

---

### Conflit pendant le rebase

Si `finish-feature.sh` rencontre un conflit, il affiche des instructions.

Workflow typique :

```bash
# corriger les fichiers en conflit
git add .
git rebase --continue
```

Quand le rebase est terminé, relance :

```bash
./flow.sh finish
```

---

## Déploiement serveur

Le script `deploy-release.sh` déploie sur le serveur configuré dans le fichier :

```bash
SERVER_USER=tutoriu
SERVER_HOST=ftp.cluster030.hosting.ovh.net
SERVER_PATH=/homez.1548/tutoriu/old
```

Avant de déployer, vérifie que la connexion SSH fonctionne :

```bash
ssh tutoriu@ftp.cluster030.hosting.ovh.net
```

Si la connexion échoue, le déploiement échouera aussi.

---

## Modifier le serveur de déploiement

Pour changer le serveur, ouvre :

```bash
deploy-release.sh
```

Puis modifie :

```bash
SERVER_USER=...
SERVER_HOST=...
SERVER_PATH=...
```

Exemple :

```bash
SERVER_USER=monuser
SERVER_HOST=monserveur.com
SERVER_PATH=/var/www/mon-projet
```

---

## Bonnes pratiques

Avant une release ou un déploiement :

```bash
git status
```

Vérifie que tout est propre.

Avant de finaliser une feature :

```bash
git pull
```

Fais des commits clairs :

```bash
git commit -m "feature: ajout du formulaire de login"
git commit -m "fix: correction du cache utilisateur"
git commit -m "release: préparation 1.0.0"
```

Évite de travailler directement sur :

```text
master
develop
```

Utilise plutôt :

```text
feature-xxx
hotfix-xxx
release-x.y.z
```

---

## Résumé rapide

```bash
# rendre les scripts exécutables
chmod +x *.sh

# afficher le menu
./flow.sh

# aide
./flow.sh help

# créer une branche
./flow.sh start

# finaliser une branche
./flow.sh finish

# créer une release
./flow.sh release

# déployer une release
./flow.sh deploy

# voir le statut Git
./flow.sh status
```

---

## Notes

- Le script interactif demande les détails au fur et à mesure.
- Les actions sensibles demandent une confirmation.
- Les confirmations doivent être écrites avec `yes`.
- Le script doit être lancé depuis un dépôt Git.
- Les 4 scripts de base doivent rester dans le même dossier que le gestionnaire.
