Queues
12/17/2008 01:43:00 AM
La suite du billet précédent...
Initialement, je me suis mis à Mercurial dans l'idée de mieux gérer mes projets, à commencer par Savonet. J'ai commencé par tester Mercurial sur un projet en solo, où j'utilise des ropes annotées (oui, c'est une réponse lapidaire à un billet précédent) pour écrire proprement un éditeur de texte qui supporte bien l'analyse lexicale et syntaxique du texte (oui, c'est bed). Cela m'avait plu, et inspiré les remarques du précédent billet.
Maintenant, quel interêt a Mercurial pour un projet comme Savonet? Nous avons actuellement un écosystème assez bien foutu autour de notre SVN, dont nous sommes globalement contents. Pas de vrai besoin de décentralisation, ni de super gestion des branches. Les apports de Mercurial seraient en fait: le commit local, les queues de patchs. Je ne parlerai que des queues de patchs car elles permettent grosso modo d'émuler le commit local de toutes façons.
Dans Mercurial, un patch est une modification (révision, changeset...) modifiable. Imaginez faire quelques commits, puis vouloir en fusionner deux ou en modifier un. C'est quelque chose de risqué: si quelqun a déja vos modifications et que vous les modifiez, c'est très dur de se resynchroniser. Mais si les modifications sont restées locales, tout va bien. Et ça peut être très pratique pour éviter de se retrouver avec un historique SVN plein de modifications type "Typo", "Oops, I didn't mean to commit that file" ou encore "Remove debug code" et autres "Fixed the fix".
Les patchs sont gérées dans une queue, d'où l'appellation mercurial queue (MQ). C'est à dire qu'on va avoir une queue de modifications en attente, qu'on peut appliquer à son dépôt, ou annuler de façon très pratique. Par exemple, on va avoir un patch avec du code de debug, un patch avec un correctif, et on peut rapidement enlever l'un ou l'autre pour tester si le correctif a bien l'effet voulu, avec plus ou moins d'informations affichées. Une fois qu'on a un patch bien propre, on peut le transformer en révision normale et la partager avec le monde. Si on a envie de passer à autre chose, on met le patch en attente. Avant, pour faire ça, j'avais plusieurs copies du dépôt Savonet: une pour bosser le système de type, une pour bosser sur le smart cross, etc.
Travailler avec MQ est très intuitif et très pratique. Je me suis donc demandé comment l'utiliser pour Savonet, pour espérer avoir un jour des logs un peu plus lisibles.
J'ai testé hgsubversion pour convertir le dépôt SVN de savonet en Mercurial. Bien qu'expérimentale, cette extension marche bien, et surtout bien plus rapidement que l'import SVN actuellement officiellement inclus dans Mercurial. On obtient un dépôt Mercurial avec tout l'historique SVN, et on peut échanger de nouvelles révisions avec le dépôt SVN. J'ai ainsi pu élaborer un patch, puis le commiter sur le SVN. Par contre, il semble inutile de vouloir partager le dépôt Mercurial et mélanger le versioning Mercurial et SVN, ça pète assez vite. En plus, on perd quelques trucs propres au SVN dans Savonet: l'inclusion de la révision SVN dans la version, et les liens
Une autre possibilité est de rester à SVN mais d'utiliser MQ par dessus. Cela implique encore de mélanger le versioning SVN et Mercurial: si on fait une mise a jour SVN, il faut la propager à la main dans le dépôt Mercurial, avant de ré-appliquer éventuellement les patches en queue. Je n'ai pas encore essayé, mais je ne suis pas très optimiste.
Enfin, on peut utiliser les outils de gestion de patches qui ont inspiré MQ, notamment quilt. Je me disais qu'il n'y avait pas tant que ça à perdre, mais ils ne mentent pas dans Mercurial: l'intégration des queues dans Mercurial même fait toute la différence. Il est beaucoup plus pénible de bosser avec quilt: par exemple, il n'a aucun moyen de savoir qu'un fichier est modifié par rapport à sa version SVN, et donc de passer cette modification locale dans un patch. On peut bricoler deux trois trucs, et arriver à ses fins, mais ça reste peu confortable. Au fond, quilt ne m'inspire pas trop, c'est assez rugueux à l'usage, pis... c'est codé en shell.
Bref, il y a encore du boulot pour pousser les développeurs Savonet à tous utiliser un gestionnaire de patches avant de passer une modif sur le SVN. La seule chose claire dans tout ça, c'est qu'on peut déja utiliser ma queue de patches, quel que soit l'outil et la méthode, c'est relativement standard: elle est publiée (sous forme de dépôt Mercurial) sur dolebrai.net. C'était d'abord une queue Mercurial mais je l'utilise désormais via quilt sur des dépôts SVN. Dans les deux cas je partage ainsi des patchs entre mon portable et le serveur: ainsi, je ne salis pas le SVN pour tester sur le serveur une modif en cours d'élaboration.
Initialement, je me suis mis à Mercurial dans l'idée de mieux gérer mes projets, à commencer par Savonet. J'ai commencé par tester Mercurial sur un projet en solo, où j'utilise des ropes annotées (oui, c'est une réponse lapidaire à un billet précédent) pour écrire proprement un éditeur de texte qui supporte bien l'analyse lexicale et syntaxique du texte (oui, c'est bed). Cela m'avait plu, et inspiré les remarques du précédent billet.
Maintenant, quel interêt a Mercurial pour un projet comme Savonet? Nous avons actuellement un écosystème assez bien foutu autour de notre SVN, dont nous sommes globalement contents. Pas de vrai besoin de décentralisation, ni de super gestion des branches. Les apports de Mercurial seraient en fait: le commit local, les queues de patchs. Je ne parlerai que des queues de patchs car elles permettent grosso modo d'émuler le commit local de toutes façons.
Dans Mercurial, un patch est une modification (révision, changeset...) modifiable. Imaginez faire quelques commits, puis vouloir en fusionner deux ou en modifier un. C'est quelque chose de risqué: si quelqun a déja vos modifications et que vous les modifiez, c'est très dur de se resynchroniser. Mais si les modifications sont restées locales, tout va bien. Et ça peut être très pratique pour éviter de se retrouver avec un historique SVN plein de modifications type "Typo", "Oops, I didn't mean to commit that file" ou encore "Remove debug code" et autres "Fixed the fix".
Les patchs sont gérées dans une queue, d'où l'appellation mercurial queue (MQ). C'est à dire qu'on va avoir une queue de modifications en attente, qu'on peut appliquer à son dépôt, ou annuler de façon très pratique. Par exemple, on va avoir un patch avec du code de debug, un patch avec un correctif, et on peut rapidement enlever l'un ou l'autre pour tester si le correctif a bien l'effet voulu, avec plus ou moins d'informations affichées. Une fois qu'on a un patch bien propre, on peut le transformer en révision normale et la partager avec le monde. Si on a envie de passer à autre chose, on met le patch en attente. Avant, pour faire ça, j'avais plusieurs copies du dépôt Savonet: une pour bosser le système de type, une pour bosser sur le smart cross, etc.
Travailler avec MQ est très intuitif et très pratique. Je me suis donc demandé comment l'utiliser pour Savonet, pour espérer avoir un jour des logs un peu plus lisibles.
J'ai testé hgsubversion pour convertir le dépôt SVN de savonet en Mercurial. Bien qu'expérimentale, cette extension marche bien, et surtout bien plus rapidement que l'import SVN actuellement officiellement inclus dans Mercurial. On obtient un dépôt Mercurial avec tout l'historique SVN, et on peut échanger de nouvelles révisions avec le dépôt SVN. J'ai ainsi pu élaborer un patch, puis le commiter sur le SVN. Par contre, il semble inutile de vouloir partager le dépôt Mercurial et mélanger le versioning Mercurial et SVN, ça pète assez vite. En plus, on perd quelques trucs propres au SVN dans Savonet: l'inclusion de la révision SVN dans la version, et les liens
external
.Une autre possibilité est de rester à SVN mais d'utiliser MQ par dessus. Cela implique encore de mélanger le versioning SVN et Mercurial: si on fait une mise a jour SVN, il faut la propager à la main dans le dépôt Mercurial, avant de ré-appliquer éventuellement les patches en queue. Je n'ai pas encore essayé, mais je ne suis pas très optimiste.
Enfin, on peut utiliser les outils de gestion de patches qui ont inspiré MQ, notamment quilt. Je me disais qu'il n'y avait pas tant que ça à perdre, mais ils ne mentent pas dans Mercurial: l'intégration des queues dans Mercurial même fait toute la différence. Il est beaucoup plus pénible de bosser avec quilt: par exemple, il n'a aucun moyen de savoir qu'un fichier est modifié par rapport à sa version SVN, et donc de passer cette modification locale dans un patch. On peut bricoler deux trois trucs, et arriver à ses fins, mais ça reste peu confortable. Au fond, quilt ne m'inspire pas trop, c'est assez rugueux à l'usage, pis... c'est codé en shell.
Bref, il y a encore du boulot pour pousser les développeurs Savonet à tous utiliser un gestionnaire de patches avant de passer une modif sur le SVN. La seule chose claire dans tout ça, c'est qu'on peut déja utiliser ma queue de patches, quel que soit l'outil et la méthode, c'est relativement standard: elle est publiée (sous forme de dépôt Mercurial) sur dolebrai.net. C'était d'abord une queue Mercurial mais je l'utilise désormais via quilt sur des dépôts SVN. Dans les deux cas je partage ainsi des patchs entre mon portable et le serveur: ainsi, je ne salis pas le SVN pour tester sur le serveur une modif en cours d'élaboration.
Libellés : code