Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

0. Qu’est-ce que hawser ?

hawser — the beam that binds the repos

Bienvenue ! Si tu as déjà travaillé sur un produit qui vit dans plus d’un dépôt Git, ce cours est fait pour toi. À la fin, tu sauras composer des dépôts, lancer du travail sur toute une flotte, ouvrir des pull requests multi-dépôts, et piloter tout ça depuis un cockpit au clavier — confortablement.

Commençons par le pourquoi. Car une fois que le problème devient clair, chaque commande de haw prend soudain tout son sens.

Version control across many repositories

Plusieurs dépôts, un tout coordonné — voilà le casse-tête que hawser résout.

🎯 Dans ce chapitre, tu vas apprendre à…

  • Reconnaître les trois taxes d’un produit multi-dépôts : la coordination des versions, les PR inter-dépôts et la reproductibilité.
  • Expliquer hawser en une ligne — un package.json + lockfile, mais pour une flotte de dépôts Git.
  • Garder tout le modèle mental en tête : manifeste → lockfile → stacks.
  • Savoir quand hawser est le bon outil pour ton monde.

🧩 Le problème : un produit, plusieurs dépôts

Imagine un vrai produit. Ce n’est presque plus jamais un seul dépôt. C’est une bibliothèque partagée, trois ou quatre services, un SDK, un peu d’infrastructure — chacun dans son propre dépôt Git, avec ses propres branches, sa propre CI, sa propre histoire.

A product split across many repositories

Un produit, éparpillé sur une étagère de dépôts séparés.

Ce découpage, c’est du bon génie logiciel. Mais il a un prix :

  • « Quelles versions vont ensemble ? » Le service A fonctionne avec la version 2.1 de la bibliothèque partagée — mais quel commit correspond exactement à la 2.1 ? Et ton collègue a-t-il bien le même ?
  • « Une fonctionnalité, cinq pull requests. » Un seul changement touche quatre dépôts. Tu crées une branche dans chacun à la main, tu ouvres quatre PR, et tu pries pour les fusionner dans le bon ordre.
  • « Ça marche sur ma machine. » Personne ne peut reproduire l’ensemble exact des commits qui étaient en production en mars dernier, parce que cet ensemble n’a jamais été noté nulle part.
This is fine — a cartoon dog sipping coffee as the room burns

Gérer dix dépôts et leurs versions à la main. Tout va bien. 🔥

Voici l’idée : un seul dépôt avait déjà résolu ces problèmes il y a des années. Ton package.json (ou Cargo.toml) déclare tes dépendances, et un lockfile (package-lock.json, Cargo.lock) fige les versions résolues exactes, pour que tout le monde — toi, ton collègue, le runner de CI — reconstruise un arbre identique.

Le modèle mental en une phrase : hawser, c’est un package.json + lockfile, mais pour une flotte de dépôts Git au lieu d’une flotte de paquets npm.

⚓ Ce que fait hawser

hawser compose un stack logiciel à partir de plusieurs dépôts Git, le fige dans un lockfile, et te laisse piloter chaque build, PR, revue et exécution de CI multi-dépôts depuis un seul endroit.

Ce n’est pas un wrapper autour de Git et ça ne réimplémente pas Git. C’est la couche au-dessus de Git — ce que ton package.json, ton tableau de projet et ton tableau de bord de PR faisaient discrètement pour un seul dépôt, désormais fait pour plusieurs.

L’outil en ligne de commande s’appelle haw. C’est un binaire unique, écrit en Rust, sans aucun runtime à installer.

🧠 Le modèle mental : manifeste → lockfile → stacks

Trois concepts portent tout le système. Apprends-les maintenant et tout le reste en découle.

  1. Le manifeste — haw.toml. C’est ton intention. Tu déclares quels dépôts existent, où ils vivent, et quelle révision tu veux. Vois-le comme le bloc dependencies.

  2. Le lockfile — haw.lock. C’est la réalité résolue. Quand tu synchronises, haw fige chaque dépôt sur un SHA de commit exact et l’écrit ici. Tu committes ce fichier. Désormais un collègue — ou la CI, ou un auditeur — reconstruit l’arbre identique, octet pour octet.

  3. Les stacks. Un stack est une composition nommée de dépôts. Un même manifeste peut définir plusieurs stacks qui partagent les mêmes dépôts sans les copier. (Un stack dans haw, c’est simplement « ces dépôts, ensemble, sous ce nom ».)

haw.toml   (intent)  ─────►  haw sync  ─────►  haw.lock   (pinned SHAs, committed)
   │                                               │
   └── declares repos + stacks                     └── the reproducible baseline

Sur le disque, il n’y a ni sous-modules, ni liens symboliques, ni HEAD détachés — chaque dépôt est un clone Git ordinaire et complet. haw se contente de les garder synchronisés et coordonnés.

🎯 Quand se tourner vers hawser

hawser est agnostique du domaine — un dépôt est un dépôt, un build est la commande shell que tu déclares. Il brille dès qu’un produit est réparti sur plusieurs dépôts :

Si ton monde ressemble à……hawser t’apporte
Microservices backend — une fonctionnalité couvrant N services + un proto/lib partagéune branche + des PR liées sur exactement les dépôts qu’elle touche
Plateformes ML / data — modèle + pipeline + infra de serviceune base de référence figée et reproductible des trois
Plateforme / infra — modules Terraform + charts Helmune base de référence déployée, versionnée et contrôlée contre la dérive
Mobile — une app + son SDK maisonl’app et le SDK modifiés et publiés de concert
Embarqué / automobile — un HAL/BSP partagé réutilisé sur plusieurs ECUdes bases de référence reproductibles, prêtes pour l’audit + des preuves de conformité

La boucle — composer → figer → modifier → builder/tester → gouverner — est la même dans chaque cas. Seuls les dépôts et les commandes de build déclarées changent. Voir Domains pour savoir comment chacun s’y rattache.

🚀 Ce que tu sauras faire à la fin de ce cours

  • Écrire un haw.toml, le synchroniser, et lire le lockfile en toute confiance.
  • Lancer des builds, des tests, des commandes et des recherches sur toute une flotte en parallèle.
  • Livrer une fonctionnalité sur N dépôts en un seul changeset — brancher, ouvrir la PR, atterrir dans l’ordre.
  • Vivre dans le cockpit TUI et fusionner, approuver et inspecter sans quitter le terminal.
  • Étendre haw avec un plugin que tu as écrit toi-même.
  • Le brancher dans la CI avec reproductibilité, signature et preuves d’audit.

C’est un ensemble de compétences réel et productif — et nous le construirons une petite étape à la fois.

Et voici où nous allons — le cockpit au clavier dans lequel tu vivras dès le chapitre 4 :

Le cockpit haw : lire la flotte, plonger dans n’importe quel dépôt ou PR, et agir — sans quitter le terminal.

🙌 À toi de jouer

Avant de toucher la moindre commande, fais l’expérience de pensée. Imagine le dernier produit sur lequel tu as travaillé qui vivait dans plus d’un dépôt. Note :

  • Combien de dépôts était-ce, vraiment ?
  • La dernière fois qu’une fonctionnalité t’a forcé à ouvrir des PR dans plusieurs d’entre eux à la fois — comment as-tu gardé le fil ?
  • Pourrais-tu reproduire, aujourd’hui, l’ensemble exact des commits qui étaient en production il y a trois mois ? Garde ces réponses. Dès le chapitre 3, tu auras une réponse en une commande à chacune.

✅ Récapitulatif

  • Répartir un produit sur plusieurs dépôts Git est normal, mais cela te coûte en coordination des versions, en PR multi-dépôts et en reproductibilité.
  • hawser est un manifeste + lockfile pour une flotte de dépôts — comme package.json + package-lock.json, mais pour des dépôts entiers.
  • Trois concepts : manifeste (haw.toml, l’intention) → lockfile (haw.lock, la réalité figée) → stacks (compositions nommées de dépôts).
  • La CLI est haw : un seul binaire Rust, aucun runtime.
  • Il convient à tout domaine où un produit s’étend sur plusieurs dépôts.

👉 La suite

Installons l’outil sur ta machine et ouvrons le cockpit pour la première fois → 1. Installation et première exécution.