# L8 — Git **Binôme :** `dev-git` / `test-git` **Zones :** `infrastructure/git`, `application/git`, `frontend/features/git` **Dépendances amont :** L0, L1, L2. ## Objectif Support Git intégré (local) via libgit2. ## Périmètre (DEV) - Adapter `Git2Repository` (git2) : `status`, `stage`/`unstage`, `commit`, `branches`, `checkout`, `current_branch`, `diff`, `log`, `pull`, `push`, `clone`, `init`. - Use cases Git (`GitStatus`, `GitCommit`, `GitCheckout`, `GitPush`, …). - Front : panneau Git (changements, staging, commit, branches). ## Périmètre (TEST) - Use cases avec `GitRepository` mocké. - Intégration : `Git2Repository` sur repo temporaire (init → commit → branch → status). - Front : feature git avec gateway mock. ## Definition of Done - `cargo test` (git) + `vitest` verts ; opérations git de base utilisables (dev manuel). ## Spike - Vendoring statique git2/openssl pour l'AppImage (coordonné avec L11). ## Avancement ### ✅ Backend (vert) - **Dépendance** : `git2` 0.20 (`default-features = false`, pas d'openssl) liée à la **libgit2 système** via `.cargo/config.toml` (`LIBGIT2_SYS_USE_PKG_CONFIG=1`) — évite cmake/vendoring ; le vendoring statique AppImage reste pour L11. - **Infra** : `Git2Repository` (`infrastructure/git/mod.rs`) implémente `GitPort` — `init`, `status`, `stage`, `unstage`, `commit` (signature de repli `IdeA ` si pas de config user), `branches`, `current_branch`, `checkout`, `log`. `pull`/`push` renvoient une erreur explicite (réseau/credentials → L9). Appels libgit2 synchrones sans `await` ⇒ futures `Send`. 3 tests d'intégration (vrai repo temporaire). - **Application** (`application/git/`) : `GitStatus`, `GitStage`, `GitUnstage`, `GitCommit` (valide message non vide + event `GitStateChanged`), `GitBranches` (liste + courante), `GitCheckout` (+ event), `GitLog`, `GitInit` (+ event). 7 tests use cases (mock `GitPort`). - `cargo test --workspace` : **298 verts, 0 régression** ; clippy clean. ### ✅ IPC `app-tauri` (vert) - Composition root : `Git2Repository` construit, 8 use cases injectés. 8 commands (`git_status`, `git_stage`, `git_unstage`, `git_commit`, `git_branches`, `git_checkout`, `git_log`, `git_init`), résolution `projectId → root` via `resolve_project`. DTOs `GitFileStatusDto`/`GitCommitDto`/`GitBranchesDto` + request DTOs camelCase. Tests `tests/dto_git.rs` (12). `cargo test -p app-tauri` 74 verts ; workspace **310 verts, 0 régression** ; clippy clean. ### ✅ Front (vert) - Port `GitGateway` complet (8 méthodes) + types `GitFileStatus`/`GitCommit`/`GitBranches` ; adapter `TauriGitGateway` ; `MockGitGateway` stateful (état par projet, seedé) pour le mode offline. - Feature `features/git` : `useGit(projectId)` + `GitPanel` (sections Staged/Unstaged + stage/unstage, message + commit, branches + checkout, log récent), monté dans l'onglet projet. 17 tests ; suite front **157 verts** ; `tsc` clean ; garde-fou « no invoke » OK. ### ⏳ Hors périmètre L8 - `pull`/`push`/`clone` (réseau + credentials) → L9 (`RemoteGitRepository` + callbacks) ; vendoring statique git2 pour l'AppImage → L11.