Scripts pour automatiser le contrôle de version avec Mercurial

Pour répondre à l’avalanche des deux demandes, voici le script que j’utilise pour automatiser les « commits » (les versions) de mes manuscrits dans Mercurial.

Pour mémoire :

  1. J’utilise Mercurial comme outil de contrôle de versions, sur certains de mes écrits et fichiers, dont les articles du blog — ça permet de facilement suivre l’évolution d’un texte et, surtout, de retrouver une ancienne version si je change d’avis — moi, changer d’avis ? Jamais.
    Lesfautes
    (Clic = grand)Je peux suivre la croissance, les branches mortes, les greffons, etc. de cet article en phase d’écriture, c’est complètement organique.
  2. Pour que ce soit efficace, ça doit être automatisé. Sinon, j’oublie et après je pleure et file me réfugier sous la première coquille d’oeuf.
  3. Vous connaissez peut-être FlashBake, qui fonctionne avec Git à la place de Mercurial. Il fait beaucoup plus et mieux. Malheureusement, je n’ai jamais réussi à le faire fonctionner comme je le souhaitais et je n’ai pas vraiment besoin de ses plug-ins.

D’où mon script. Infiniment moins subtil, mais qui me suffit :

Autocommit

Avec quelques explications, pleines de rebondissements

#!/bin/sh
#
DATE="date '+%A %d %B %Y @ %Hh%M'"

La variable DATE me permet de récupérer la date et l’heure et de les formater comme je le souhaite.

for r in /Users/david/Dropbox/perso/_drafts/
/Users/david/Documents/Fictions/lmsk/
/Users/david/Documents/Fictions/le-krau/
/Users/david/Dropbox/perso/scripts/scripts/

Ici, le script va boucler sur chaque chemin d’accès vers un dossier. J’ajoute simplement un dossier à cette liste pour l’inclure dans le script. Pour le moment, il surveille le dossier des scripts, les brouillons du blog et deux histoires que j’écris.

Et ensuite, me demandera le lecteur incapable d’attendre plus longtemps pour connaître le dénouement de cette trépidante aventure. Ensuite ? Mais ils vécurent heureux et eurent beaucoup de versions. Bien sûr :

do
/usr/local/bin/hg addremove -R "$r"
/usr/local/bin/hg commit -m "Automated commit @ $DATE" -R "$r"
done

J’ai carrément piqué l’idée ici. Ça fait quoi ? Pas grand-chose, mais tellement bien 😉

Il invoque les commandes Mercurial — avec un chemin absolu, sinon ça posait trop de souci et :

  • Addremove se charge d’ajouter les nouveaux fichiers ou les fichiers modifiés et de retirer les fichiers supprimés, par rapport à la dernière version enregistrée.
  • La seconde ligne se charge du « commit », l’action de dire à Mercurial « Hé, coco, tu te bouges ? Faut me créer une version de tout ça. Et magne-toi. Dis pas merci de te filer du boulot, surtout. » Le tout accompagné d’une phrase de description pour chaque commit.

Comme le commit est automatisé la phrase de description est elle aussi automatisée (subtil), elle affiche la date et l’heure :

Autocommit 2

Et elle est où ton automatisation, David ?

Pas là. Bien vu.

Sous OS X, depuis que Apple semble avoir maudit Cron, je ne connais pas mieux que Lingon pour facilement automtiser l’exécution d’un script. Lingon est proposé en deux versions : sur le Store et chez le dev (Lingon X). Je vous conseile cette dernière version qui, seule, permet d’exécuter les scripts en tant que root.

Autocommit 3

Dans Lingon X, donc, j’ai créé une action qui s’exécute toutes les 10 minutes, en tant que root (sinon, ça ne fonctionne pas).

Ainsi, toutes les 10 minutes mes dossiers sont surveillés par Mercurial qui fait sagement et en toute discrétion son travail. Je sais que je peux compter sur lui pour préserver mes versions — une façon technique de parler de brouillons, en ce qui me concerne — et il ne m’embête jamais.

Les modifs éventuelle entre deux versions sont perdues… sauf que je peux aussi faire des commits manuellement, si j’en ressens le besoin. Encore une fois, si vous n’avez pas lu l’article précédent : l’intérêt de cet outil comparé ç Versions livré avec OSX, c’est que :

  • Je peux utiliser les applications de mon choix, pour éditer mes fichiers
  • Je peux éditer le même fichier depuis n’importe quelle machine, y compris un iPad. Même sous Windows ou GNU/Linux.
  • Je peux facilement préserver ces versions en ligne, sur un serveur sécurisé et privé gratuit comme BitBucket.
  • Les versions ont cachées dans le dossier même où sont les fichiers. Il n’y a donc aucun risque de les perdre même quand je change de machine.

Créer un dépôt

Chaque dossier surveillé par Mercurial doit être « initialisé », c’est-à-dire qu’on doit y créer un dépôt Mercurial, quoi. On peut le faire de façon graphique depuis SourceTree, mais là aussi je me suis créé un tout petit script bête, mais qui fait son travail et me permet de créer un dossier et tout le contenu typique dont j’ai besoin instantanément.

Faites-moi savoir si ça vous intéresse — tiens, les commentaires sont ouverts…

Il y a sûrement mieux ou plus subtil, n’hésitez pas à me proposer des améliorations — Tiens bis,les commentaires sont ouverts.

23 commentaires » Ecrire un commentaire

  1. Rétrolien : Contrôle de version pour les auteurs | tiaaft

  2. J’étais assez sceptique au début (en dev, on a tendance à éviter l’automatisation pour ne pas oublier de dire ce que font les modifs), mais je dois dire que je tu m’a convaincu, du moins pour tout ce qui est du texte. Encore un truc qu’il faudra que je mette en route chez moi. Merci de l’idée !

    • Ta remarque est très juste, à propos des devs. Et c’est là où écrire diffère profondément de coder: à part sur de très gros textes ou sur de profonds changement, tu auras rarement besoin de baliser tes versions (Mon Super Roman 1.0; Mon Super Roman 1.1, j’ajoute le dragon; Mon Super Roman 1.2, le prince sauve la princesse; etc. ;)) — mais tu peux le faire sans souci si/quand ça te semble utile. Par contre, une chronologie 100% fiable et la possibilité de remonter dans le temps, ça 😉

  3. Merci David ! Cela m’a tout de même permis d’améliorer mon script. J’ai ajouté une condition pour initialiser un dossier qui ne le serait pas comme ceci: do if [[ ! -e "$r"/.hg ]]; then hg init fi

    /usr/local/bin/hg addremove -R "$r"
    /usr/local/bin/hg commit -m "Commit automatique : $MSG" -R "$r"
    

    done

    Si jamais ;D

  4. Merci David ! Cela m’a tout de même permis d’améliorer mon script. J’ai ajouté une condition pour initialiser un dossier qui ne le serait pas comme ceci:

    do if [[ ! -e "$r"/.hg ]]; then hg init fi /usr/local/bin/hg addremove -R "$r" /usr/local/bin/hg commit -m "Commit automatique : $MSG" -R "$r" done

    Si jamais cela peut servir…

    • Pas con. Je fais un peu autrement : càd que j’ai un petit script qui initialise hg dans chaque nouveau dossier et qui le peuple avec les fichiers dont j’ai besoin par défaut (+ le ignore) 🙂

  5. Rétrolien : Ulysses et Daedalus Touch | davidbosman.fr

  6. C’est pointu et précis comme de l’horlogerie californienne. Pour l’instant ça reste assez obscur (et là tu te dis, pourquoi, sombre crétin, te permets-tu ainsi de me dire que je fais du bon boulot si tu sais pas de quoi que’j cause ? – Parce que !) mais ça m’a définitivement donné envie de me pencher sur ce vaste programme qu’est le script. Je suis d’ailleurs desepérément à la recherche d’un moyen simple de faire entrer du script à la Photoshop dans Pixelmator. Si t’as une idée, je prends !

  7. Vu que les commentaires sont ouverts, je me permet un merci gratuit qui mange pas de pain – surtout que l’article m’a permis (en remontant toute la chaine d’information associée) d’y tremper un peu plus que le bout du pied 😉

  8. Rétrolien : Sauvegardes et versions dans Ulysses et dans Scrivener | tiaaft

  9. Rétrolien : Sauvegarde à l’ancienne de vos textes Ulysses III et Daedalus Touch | tiaaft

  10. Merci beaucoup pour ce détournement d’usage très intéressant et que je vais mettre à profit dès que j’aurais résolu le problème avec Lingon X ! En effet, j’utilise OS X 10.7.5 (je ne peux pas passer en 10.8.x, certains softs que j’utilise pour mes recherches ne sont pas compatible avec la nouvelle mouture de l’OS) et Lingon X ne fonctionne QUE sur Mountain Lion 🙁

    Connaîtriez-vous une alternative à Lingon X qui soit utilisable sur Lion ?

    Merci d’avance

    • Il est toujours possible d’acheter Lingon 2, mais je ne suis pas sûr qu’il permette d’utiliser root. Le plus sage serait de contacter le dev pour lui demander conseil 😉

    • Sinon expérimenter avec cron, mais j’ai abandonné tout espoir d’y arriver depuis Snow Leopard, si je me souviens bien.

      • Merci beaucoup David pour la réponse.

        L’utilisation de CRON n’est pas possible, Apple a pris un autre biais pour « scheduler » les tâches. Mac OS X emploi LAUNCHD à la place. La syntaxe d’un LAUNCHD quoi que complètement différente de celle d’un CRON, n’est pas très compliquée. Il s’agit d’un banal fichier XML… Mais bon, plus je deviens viens vieux, moins j’ai envie de programmer 🙂 Renseignements pris auprès de l’auteur, la version 2.1.1 est parfaitement fonctionnelle en mode ROOT et ce sur Snow Leopard, Lion, voire Mountain Lion 🙂

        On peut la récupérer sur le dépôt Source Forge ici : http://sourceforge.net/projects/lingon/files/Lingon/

  11. Rétrolien : Démarrer l’année en beauté : les backups | davidbosman.fr

  12. Rétrolien : Mac(hine) à écrire | davidbosman.fr