Changements : - Ajout verification connectivite remote avant fetch (git ls-remote) - Affichage "HORS LIGNE" si le serveur est inaccessible - Synchronisation auto de l'URL origin depuis config.ini - Documentation versioning et convention de commit dans CLAUDE.md Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
135 lines
5.5 KiB
Markdown
135 lines
5.5 KiB
Markdown
# Git Update Checker
|
|
|
|
## Description
|
|
|
|
Outil Windows (.exe) avec interface graphique qui vérifie les mises à jour de **plusieurs dépôts Git distants** et propose de les télécharger.
|
|
Conçu pour être placé sur une **clé USB** dont la lettre de lecteur peut changer.
|
|
Le programme peut **s'auto-mettre à jour** car il est lui-même dans un dépôt git.
|
|
|
|
## Structure du projet
|
|
|
|
```
|
|
Lanceur-geco/
|
|
├── git_updater.py # Script principal Python (GUI tkinter)
|
|
├── version.txt # Fichier contenant le numéro de version (ex: "0.5.1")
|
|
├── config.ini # Configuration multi-repo
|
|
├── build.bat # Script de compilation en .exe via PyInstaller
|
|
├── log/ # Dossier de logs (créé automatiquement, 1 fichier par jour)
|
|
└── CLAUDE.md
|
|
```
|
|
|
|
## Règles importantes
|
|
|
|
- **Tous les chemins doivent être relatifs** à l'emplacement de l'exe. Jamais de chemin absolu (pas de `C:\`, `G:\`, etc.). Utiliser `..` et des chemins relatifs pour référencer les dossiers.
|
|
- **Accès lecture seule** : le programme ne fait que `git fetch`, `git pull` et `git checkout`. Jamais de `git push`, `git commit`, `git add`, ou toute opération d'écriture vers le remote.
|
|
- **Multi-repo** : le programme peut surveiller plusieurs dépôts Git configurés dans `config.ini`.
|
|
|
|
## Versioning
|
|
|
|
- La version est définie en dur dans `git_updater.py` via la constante `VERSION` (ex: `VERSION = "0.5.1"`)
|
|
- Le fichier `version.txt` à la racine du projet contient le même numéro de version (utilisé par le mécanisme d'auto-update distant)
|
|
- Format : **semver simplifié** `MAJEUR.MINEUR.PATCH` (ex: `0.5.1`)
|
|
- **Les deux doivent toujours être synchronisés** : quand on change la version, mettre à jour `VERSION` dans `git_updater.py` ET `version.txt`
|
|
|
|
### Mise à jour de la version
|
|
|
|
A chaque changement de version, il faut mettre à jour **4 éléments** :
|
|
1. `VERSION` dans `git_updater.py` (constante en haut du fichier)
|
|
2. `version.txt` à la racine du projet
|
|
3. **Recompiler l'exe** via `build.bat` et copier `dist/GitUpdateChecker.exe` à la racine du projet
|
|
4. **Créer un commit** avec le message suivant :
|
|
|
|
```
|
|
v{VERSION} - {description courte des changements}
|
|
|
|
Changements :
|
|
- {changement 1}
|
|
- {changement 2}
|
|
- ...
|
|
```
|
|
|
|
Exemple :
|
|
```
|
|
v0.5.2 - Detection depot hors ligne
|
|
|
|
Changements :
|
|
- Ajout verification connectivite remote avant fetch (git ls-remote)
|
|
- Affichage "HORS LIGNE" si le serveur est inaccessible
|
|
- Synchronisation auto de l'URL origin depuis config.ini
|
|
```
|
|
|
|
### Mécanisme de comparaison
|
|
|
|
- La fonction `_version_tuple(v)` convertit la chaîne version en tuple d'entiers (ex: `"0.5.1"` -> `(0, 5, 1)`) pour permettre la comparaison numérique
|
|
- L'auto-update télécharge `version.txt` depuis le serveur Gitea via HTTP (`{repo_url}/raw/branch/master/version.txt`) et compare avec la `VERSION` locale
|
|
- Si la version distante est supérieure, une mise à jour est proposée
|
|
|
|
## Fonctionnement
|
|
|
|
### Auto-update
|
|
1. Au démarrage, le programme télécharge `version.txt` depuis le serveur Gitea via HTTP
|
|
2. Compare la version distante avec la constante `VERSION` locale (comparaison par tuple numérique)
|
|
3. Si la version distante est supérieure, propose de télécharger le nouvel exe
|
|
4. Stratégie de remplacement : télécharge dans `.new`, renomme l'exe actuel en `.old`, place le nouveau
|
|
5. Après mise à jour, demande un redémarrage
|
|
|
|
### Vérification des dépôts
|
|
1. Lit la liste des dépôts depuis `config.ini` (chemins relatifs à l'exe)
|
|
2. Pour chaque dépôt :
|
|
- `git fetch` pour récupérer l'état distant
|
|
- Compare commits locaux vs distants
|
|
- Détecte les fichiers supprimés/modifiés localement
|
|
3. Affiche le résultat dans une interface graphique (tkinter)
|
|
4. Propose pour chaque dépôt :
|
|
- `git pull` si nouveaux commits distants
|
|
- `git checkout -- .` si fichiers locaux manquants/modifiés
|
|
|
|
## Configuration (config.ini)
|
|
|
|
Supporte plusieurs sections `[repo:NomDuRepo]` :
|
|
|
|
```ini
|
|
[repo:Batch]
|
|
url = http://192.168.1.235:3125/zogzog/Batch
|
|
path = ../Batch
|
|
|
|
[repo:Powershell]
|
|
url = http://192.168.1.235:3125/zogzog/Powershell
|
|
path = ../Powershell
|
|
```
|
|
|
|
- `url` : URL du dépôt Git distant
|
|
- `path` : Chemin **relatif** vers le dossier local du dépôt (relatif à l'exe)
|
|
|
|
## Logging
|
|
|
|
- Les logs sont écrits dans `log/` à côté de l'exe (1 fichier par jour, format `YYYY-MM-DD.log`)
|
|
- Les vieux logs sont nettoyés automatiquement (30 jours de rétention)
|
|
- Chaque action git, erreur, et résultat est loggé avec timestamp
|
|
- Bouton "Ouvrir les logs" dans la GUI pour accéder au dossier
|
|
|
|
## Build
|
|
|
|
```bat
|
|
build.bat
|
|
```
|
|
Requiert Python + pip. Installe PyInstaller automatiquement si absent.
|
|
Produit `dist/GitUpdateChecker.exe`. Copier `config.ini` à côté de l'exe.
|
|
|
|
## Contraintes techniques
|
|
|
|
- **Chemins relatifs** : Tout est relatif à l'exe, jamais de chemin absolu
|
|
- **Encodage** : Force UTF-8 pour les caractères Unicode
|
|
- **Clé USB** : Fonctionne sur n'importe quelle lettre de lecteur
|
|
- **Git requis** : Git doit être installé et dans le PATH de la machine
|
|
- **Serveur Gitea** : Le remote origin pointe vers une instance Gitea locale (192.168.1.235:3125)
|
|
- **Lecture seule** : Aucune opération d'écriture vers le remote (pas de push/commit)
|
|
- **Interface** : GUI tkinter (inclus dans Python, pas de dépendance externe)
|
|
- **Logs** : Dossier `log/` à côté de l'exe, rotation automatique 30 jours
|
|
|
|
## Conventions
|
|
|
|
- Langage : Python 3, pas de dépendances externes (seulement stdlib + tkinter)
|
|
- Interface : GUI tkinter en français
|
|
- Langue : Français pour l'interface utilisateur
|