{"id":14246,"date":"2013-05-14T20:09:23","date_gmt":"2013-05-14T18:09:23","guid":{"rendered":"http:\/\/davidbosman.fr\/blog\/?p=14246"},"modified":"2014-02-28T15:44:47","modified_gmt":"2014-02-28T14:44:47","slug":"scripts-pour-automatiser-le-controle-de-version-avec-mercurial","status":"publish","type":"post","link":"https:\/\/www.davidbosman.fr\/blog\/2013\/05\/14\/scripts-pour-automatiser-le-controle-de-version-avec-mercurial\/","title":{"rendered":"Scripts pour automatiser le contr\u00f4le de version avec Mercurial"},"content":{"rendered":"<p>Pour r\u00e9pondre \u00e0 l&#8217;avalanche des <em>deux<\/em> demandes, voici le script que j&#8217;utilise pour automatiser les &#8220;commits&#8221; (les versions) de mes manuscrits dans Mercurial.<\/p>\n\n<p>Pour m\u00e9moire :<\/p>\n\n<ol>\n<li><a href=\"http:\/\/davidbosman.fr\/blog\/2013\/05\/07\/controle-de-version-on-y-trempe-le-bout-du-pied\/\">J&#8217;utilise Mercurial comme outil de contr\u00f4le de versions<\/a>, sur certains de mes \u00e9crits et fichiers, dont les articles du blog \u2014 \u00e7a permet de facilement suivre l&#8217;\u00e9volution d&#8217;un texte et, surtout, de retrouver une ancienne version si je change d&#8217;avis \u2014 moi, changer d&#8217;avis ? Jamais.<br>\n<a href=\"http:\/\/davidbosman.fr\/blog\/wp-content\/uploads\/2013\/05\/lesfautes.png\"><img decoding=\"async\" src=\"http:\/\/davidbosman.fr\/blog\/wp-content\/uploads\/2013\/05\/lesfautespng.jpg\" alt=\"Lesfautes\" \/><\/a><br \/>\n<em>(Clic = grand)Je peux suivre la croissance, les branches mortes, les greffons, etc. de cet article en phase d&#8217;\u00e9criture, c&#8217;est compl\u00e8tement <strong>organique<\/strong>.<\/em>  <\/li>\n<li>Pour que ce soit efficace, \u00e7a doit \u00eatre automatis\u00e9. Sinon, j&#8217;oublie et apr\u00e8s je pleure et file me r\u00e9fugier sous la premi\u00e8re coquille d&#8217;oeuf.<\/li>\n<li>Vous connaissez peut-\u00eatre <a href=\"https:\/\/github.com\/commandline\/flashbake\">FlashBake<\/a>, qui fonctionne avec Git \u00e0 la place de Mercurial. Il fait beaucoup plus et mieux. Malheureusement, je n&#8217;ai jamais r\u00e9ussi \u00e0 le faire fonctionner comme je le souhaitais et je n&#8217;ai pas vraiment besoin de ses plug-ins.<\/li>\n<\/ol>\n\n<p>D&#8217;o\u00f9 mon script. Infiniment moins subtil, mais qui me suffit :<\/p>\n\n<p><!--more--><img decoding=\"async\" src=\"http:\/\/davidbosman.fr\/blog\/wp-content\/uploads\/2013\/05\/autocommit.png\" alt=\"Autocommit\" \/><\/p>\n\n<h3>Avec quelques explications, pleines de rebondissements<\/h3>\n\n<p><code>#!\/bin\/sh<br>\n    #<br>\n    DATE=\"<code>date '+%A %d %B %Y @ %Hh%M'<\/code>\"<\/code><\/p>\n\n<p>La variable DATE me permet de r\u00e9cup\u00e9rer la date et l&#8217;heure et de les formater comme je le souhaite.<\/p>\n\n<p><code>for r in \/Users\/david\/Dropbox\/perso\/_drafts\/<br>\n    \/Users\/david\/Documents\/Fictions\/lmsk\/<br>\n    \/Users\/david\/Documents\/Fictions\/le-krau\/<br>\n    \/Users\/david\/Dropbox\/perso\/scripts\/scripts\/<\/code><\/p>\n\n<p>Ici, le script va boucler sur chaque chemin d&#8217;acc\u00e8s vers un dossier. J&#8217;ajoute simplement un dossier \u00e0 cette liste pour l&#8217;inclure dans le script. Pour le moment, il surveille le dossier des scripts, les brouillons du blog et deux histoires que j&#8217;\u00e9cris.<\/p>\n\n<p>Et ensuite, me demandera le lecteur incapable d&#8217;attendre plus longtemps pour conna\u00eetre le d\u00e9nouement de cette tr\u00e9pidante aventure. Ensuite ? Mais ils v\u00e9curent heureux et eurent beaucoup de versions. Bien s\u00fbr :<\/p>\n\n<p><code>do<br>\n        \/usr\/local\/bin\/hg addremove -R \"$r\"<br>\n        \/usr\/local\/bin\/hg commit -m \"Automated commit @ $DATE\" -R \"$r\"<br>\n    done<\/code><\/p>\n\n<p><a href=\"http:\/\/josh-in-antarctica.blogspot.fr\/2008\/03\/automatic-change-tracking-with-cron-and.html\">J&#8217;ai carr\u00e9ment piqu\u00e9 l&#8217;id\u00e9e ici<\/a>. \u00c7a fait quoi ? Pas grand-chose, mais tellement bien \ud83d\ude09<\/p>\n\n<p>Il invoque les commandes Mercurial \u2014 avec un chemin absolu, sinon \u00e7a posait trop de souci et :<\/p>\n\n<ul>\n<li><code>Addremove<\/code> se charge d&#8217;ajouter les nouveaux fichiers ou les fichiers modifi\u00e9s et de retirer les fichiers supprim\u00e9s, par rapport \u00e0 la derni\u00e8re version enregistr\u00e9e.<\/li>\n<li>La seconde ligne se charge du &#8220;commit&#8221;, l&#8217;action de dire \u00e0 Mercurial &#8220;<em>H\u00e9, coco,  tu te bouges ? Faut me cr\u00e9er une version de tout \u00e7a. Et magne-toi. Dis pas merci de te filer du boulot, surtout.<\/em>&#8221; Le tout accompagn\u00e9 d&#8217;une phrase de description pour chaque commit.<\/li>\n<\/ul>\n\n<p>Comme le commit est automatis\u00e9 la phrase de description est elle aussi automatis\u00e9e (subtil), elle affiche la date et l&#8217;heure :<\/p>\n\n<p><img decoding=\"async\" src=\"http:\/\/davidbosman.fr\/blog\/wp-content\/uploads\/2013\/05\/autocommit_2.png\" alt=\"Autocommit 2\" \/><\/p>\n\n<h3>Et elle est o\u00f9 ton automatisation, David ?<\/h3>\n\n<p>Pas l\u00e0. Bien vu.<\/p>\n\n<p>Sous OS X, depuis que Apple semble avoir maudit Cron, je ne connais pas mieux que Lingon pour facilement automtiser l&#8217;ex\u00e9cution d&#8217;un script. Lingon est propos\u00e9 en deux versions : sur le Store et chez le dev (<a href=\"http:\/\/www.peterborgapps.com\/lingon\/\">Lingon X<\/a>). Je vous conseile cette derni\u00e8re version qui, seule, permet d&#8217;ex\u00e9cuter les scripts en tant que root.<\/p>\n\n<p><img decoding=\"async\" src=\"http:\/\/davidbosman.fr\/blog\/wp-content\/uploads\/2013\/05\/autocommit_3.png\" alt=\"Autocommit 3\" \/><\/p>\n\n<p>Dans Lingon <strong>X<\/strong>, donc, j&#8217;ai cr\u00e9\u00e9 une action qui s&#8217;ex\u00e9cute toutes les 10 minutes, en tant que root (sinon, \u00e7a ne fonctionne pas).<\/p>\n\n<p>Ainsi, toutes les 10 minutes mes dossiers sont surveill\u00e9s par Mercurial qui fait sagement et en toute discr\u00e9tion son travail. Je sais que je peux compter sur lui pour pr\u00e9server mes versions \u2014 une fa\u00e7on technique de parler de brouillons, en ce qui me concerne \u2014 et il ne m&#8217;emb\u00eate jamais.<\/p>\n\n<p>Les modifs \u00e9ventuelle entre deux versions sont perdues&#8230; sauf que je peux aussi faire des commits manuellement, si j&#8217;en ressens le besoin. Encore une fois, si vous n&#8217;avez pas lu l&#8217;article pr\u00e9c\u00e9dent : l&#8217;int\u00e9r\u00eat de cet outil compar\u00e9 \u00e7 Versions livr\u00e9 avec OSX, c&#8217;est que :<\/p>\n\n<ul>\n<li>Je peux utiliser les applications de mon choix, pour \u00e9diter mes fichiers<\/li>\n<li>Je peux \u00e9diter le m\u00eame fichier depuis n&#8217;importe quelle machine, y compris un iPad. M\u00eame sous Windows ou GNU\/Linux.<\/li>\n<li>Je peux facilement pr\u00e9server ces versions en ligne, sur un serveur s\u00e9curis\u00e9 et priv\u00e9 gratuit comme BitBucket.<\/li>\n<li>Les versions ont cach\u00e9es dans le dossier m\u00eame o\u00f9 sont les fichiers. Il n&#8217;y a donc aucun risque de les perdre m\u00eame quand je change de machine.<\/li>\n<\/ul>\n\n<h3>Cr\u00e9er un d\u00e9p\u00f4t<\/h3>\n\n<p>Chaque dossier surveill\u00e9 par Mercurial doit \u00eatre &#8220;initialis\u00e9&#8221;, c&#8217;est-\u00e0-dire qu&#8217;on doit y cr\u00e9er un d\u00e9p\u00f4t Mercurial, quoi. On peut le faire de fa\u00e7on graphique depuis SourceTree, mais l\u00e0 aussi je me suis cr\u00e9\u00e9 un tout petit script b\u00eate, mais qui fait son travail et me permet de cr\u00e9er un dossier et tout le contenu typique dont j&#8217;ai besoin instantan\u00e9ment.<\/p>\n\n<p>Faites-moi savoir si \u00e7a vous int\u00e9resse \u2014 tiens, les commentaires sont ouverts&#8230;<\/p>\n\n<p>Il y a s\u00fbrement mieux ou plus subtil, n&#8217;h\u00e9sitez pas \u00e0 me proposer des am\u00e9liorations \u2014 Tiens <em>bis<\/em>,les commentaires sont ouverts.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pour r\u00e9pondre \u00e0 l&#8217;avalanche des deux demandes, voici le script que j&#8217;utilise pour automatiser les &#8220;commits&#8221; (les versions) de mes manuscrits dans Mercurial. Pour m\u00e9moire : J&#8217;utilise Mercurial comme outil de contr\u00f4le de versions, sur certains de mes \u00e9crits et &hellip; <a href=\"https:\/\/www.davidbosman.fr\/blog\/2013\/05\/14\/scripts-pour-automatiser-le-controle-de-version-avec-mercurial\/\">Read more &rarr;<\/a><\/p>","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[38,52,51],"class_list":["post-14246","post","type-post","status-publish","format-standard","hentry","category-general","tag-markdown","tag-scripts","tag-txt"],"_links":{"self":[{"href":"https:\/\/www.davidbosman.fr\/blog\/wp-json\/wp\/v2\/posts\/14246","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.davidbosman.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.davidbosman.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.davidbosman.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.davidbosman.fr\/blog\/wp-json\/wp\/v2\/comments?post=14246"}],"version-history":[{"count":9,"href":"https:\/\/www.davidbosman.fr\/blog\/wp-json\/wp\/v2\/posts\/14246\/revisions"}],"predecessor-version":[{"id":15291,"href":"https:\/\/www.davidbosman.fr\/blog\/wp-json\/wp\/v2\/posts\/14246\/revisions\/15291"}],"wp:attachment":[{"href":"https:\/\/www.davidbosman.fr\/blog\/wp-json\/wp\/v2\/media?parent=14246"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.davidbosman.fr\/blog\/wp-json\/wp\/v2\/categories?post=14246"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.davidbosman.fr\/blog\/wp-json\/wp\/v2\/tags?post=14246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}