# 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. ## Langage **Go** (anciennement Python, migré en Go depuis v0.7.x). - GUI : `github.com/lxn/walk` (contrôles natifs Windows) - Exe unique, aucune dépendance externe à l'exécution - Build : `go build` via `build.bat` ## Structure du projet ``` Lanceur-geco/ ├── main.go # Point d'entrée, constante VERSION ├── config.go # Chargement config.ini (repos + self-update) ├── git.go # Opérations git (check, clone, pull, checkout, clean) ├── gui.go # Interface graphique (walk/TableView) ├── logger.go # Logging fichier (1 fichier/jour, rotation 30j) ├── selfupdate.go # Auto-mise à jour du programme ├── platform_windows.go # Code spécifique Windows (création processus) ├── version.txt # Numéro de version (utilisé par l'auto-update distant) ├── config.ini # Configuration multi-repo ├── build.bat # Script de compilation en .exe ├── app.manifest # Manifeste Windows (DPI, elevation) ├── icon.ico # Icône application ├── go.mod / go.sum # Dépendances Go ├── log/ # Dossier de logs (créé automatiquement) └── 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 ls-remote`, `git fetch`, `git pull`, `git checkout` et `git clean`. 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 `main.go` via la constante `VERSION` (ex: `const VERSION = "0.7.6"`) - 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.7.6`) - **Les deux doivent toujours être synchronisés** : quand on change la version, mettre à jour `VERSION` dans `main.go` ET `version.txt` ### Mise à jour de la version A chaque changement de version, il faut mettre à jour **4 éléments** : 1. `VERSION` dans `main.go` (constante en haut du fichier) 2. `version.txt` à la racine du projet 3. **Recompiler l'exe** via `build.bat` (produit `GitUpdateChecker.exe` à la racine) 4. **Créer un commit** avec le message suivant : ``` v{VERSION} - {description courte des changements} Changements : - {changement 1} - {changement 2} - ... ``` Exemple : ``` v0.7.6 - Clone dossier non-vide et verification rapide Changements : - Clone dans dossier non-vide (git init + remote add + fetch + checkout) - Verification rapide via git ls-remote au lieu de git fetch - Support branche par repo dans config.ini ``` ### Mécanisme de comparaison - La fonction `parseVersion(v)` convertit la chaîne version en `[3]int` (ex: `"0.7.6"` -> `[0, 7, 6]`) pour permettre la comparaison numérique - L'auto-update télécharge `version.txt` depuis le serveur Gitea via HTTP (`{repo_url}/raw/branch/{branch}/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, lance un script batch de 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 (en parallèle via goroutines) : - `git ls-remote` pour vérifier la disponibilité et comparer les hashs (rapide, timeout 15s) - `git status --porcelain` pour détecter les fichiers modifiés/non suivis localement 3. Affiche le résultat dans une interface graphique (walk/TableView) 4. Propose pour chaque dépôt : - `git pull` si MAJ disponible (hash distant différent) - `git checkout -- .` si fichiers locaux modifiés - `git clean -fd` si fichiers non suivis en trop ### Clone dans dossier non-vide Si le dossier cible existe déjà mais n'a pas de `.git` (ex: repos imbriqués), le programme fait un clone "in-place" : `git init` + `git remote add` + `git fetch` + `git checkout -b ` ## Configuration (config.ini) Supporte plusieurs sections `[repo:NomDuRepo]` : ```ini [self-update] url = http://192.168.1.235:3125/zogzog/Lanceur-geco exe_name = GitUpdateChecker.exe branch = master [repo:Scripts] url = http://192.168.1.235:3125/zogzog/Scripts path = ../SOFT/Batch/Scripts [repo:Soft] url = http://192.168.1.235:3125/zogzog/Soft.git path = ../SOFT/ branch = master ``` - `url` : URL du dépôt Git distant - `path` : Chemin **relatif** vers le dossier local du dépôt (relatif à l'exe) - `branch` : Branche à suivre (optionnel, défaut: `master`) ## 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 "Logs" dans la GUI pour ouvrir le dossier ## Build ```bat build.bat ``` Requiert Go installé et dans le PATH. Installe `rsrc` automatiquement si absent. Produit `GitUpdateChecker.exe` à la racine (exe unique, pas de dépendances). Flags de build : `-H windowsgui -s -w` (pas de console, symboles strippés). ## Contraintes techniques - **Chemins relatifs** : Tout est relatif à l'exe, jamais de chemin absolu - **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 native Windows via walk (pas de console) - **Logs** : Dossier `log/` à côté de l'exe, rotation automatique 30 jours - **Repos imbriqués** : Supporte les dépôts git imbriqués (ex: parent/enfant) via clone in-place ## Conventions - Langage : Go 1.22+ - GUI : github.com/lxn/walk (contrôles natifs Windows) - Interface en français - Pas de console (flag `-H windowsgui`)