Anvil

une forgeSi je n’ai pas été actif ces derniers temps, ce n’est pas par fainéantise (encore que…), mais parce que j’ai été fort occupé par mon dernier projet.

Vous connaissez sûrement GitHub ou Bitbucket, forges non-libres « sociales » qui facilitent l’emploi de git et mercurial, respectivement. Et de ce fait promeuvent donc ces deux outils.

Bazaar, qui est mon gestionnaire de versions favori, n’a lui que Launchpad comme forge dédiée et un tant soi peu « sociale ». Mais Launchpad n’a rien d’hype et il n’est pas vraiment simple à utiliser non plus. Du coup, je me suis dit qu’il fallait que je fasse le mien pour combler ce manque.

Je vous annonce donc la sortie d’Anvil 0.01 (enclume en anglais). Son but est de proposer un environnement collaboratif simple et une interface attrayante à Bazaar. Il est écrit en Python avec le framework libre web.py et la base de données MySQL. Anvil est disponible sous GPLv3.

Fonctionnalités

Accès au code

Point important pour une forge, Anvil propose un accès en HTTP pour les pull (accès public), et un accès via SSH pour les opérations de push.

Les dépôts gérés par la forge sont dans une arborescence du dossier de l’utilisateur bzr, lequel est dédié au logiciel. La partie SSH s’appuie quant à elle sur le fichier authorized_keys, qui permet de lancer un greffon pour Bazaar lors des connexions entrantes qui vérifie les droits d’accès et ré-écrit les chemins dynamiquement.

Messagerie interne

Anvil se veut social, même s’il n’a pas beaucoup de fonctionalités en ce sens pour l’instant. Il est toutefois déjà possible de contacter d’autres utilisateurs directement sur le logiciel plutôt que par email.

Le système de messagerie interne n’est pour le moment pas géré en AJAX et n’est donc mis à jour que lorsque la page est rafraichie. Ce système sera amené à évoluer dans les prochaines version pour plus d’utilité.

Branches Bazaar

Envoyer une branche sur Anvil est très simple puisqu’il suffit d’en pousser une qui n’existe pas encore. Bazaar crée alors dynamiquement la branche. Anvil apporte toutefois une possibilité que n’offre pas Bazaar directement, à savoir la suppression d’une branche (il suffit en fait de supprimer le dossier de la branche).

L’interface web permet de naviguer dans l’arborescence de la branche et de voir les fichiers avec coloration syntaxique.

Gestion de projet

Outre ses branches personnelles, les projets ont eux aussi leurs propres branches. L’intérêt réside dans le fait qu’on puisse y ajouter d’autres utilisateurs qui ont alors aussi le droit de modifier les branches du projet.

Gestion de bugs

Le système de gestion d’incidents d’Anvil se veut simpliste et ouvert. On peut par exemple y reporter des bugs sans pour autant être enregistré sur la forge.

Gestion documentaire

Anvil permet une gestion documentaire très simple et permet d’écrire des documents en Markdown attachés au projet. Il ne gère pour le moment pas les versions des documents.

Ubiquité de Markdown

Markdown est un format pratique, et Anvil l’utilise un peu partout, aussi bien dans les profils utilisateurs que les descriptions de projet ou la documentation. Le but est de permettre aux développeurs d’offrir facilement un contenu riche.

État des lieux

Cette version est la première à être utilisable, mais présente bien des défauts.

Le code est plutôt mal organisé, manque de commentaires et les bugs sont probablement légion. L’interface est en Anglais et pour le moment rien n’a été prévu pour les traductions.

Installer Anvil est assez simple mais réclame tout de même une petite expérience d’administration système. J’ai écrit un readme qui décrit l’installation pas à pas de la forge avec Apache2 et mod_fcgid.

Futur

Les buts pour la version 0.02 n’ont pas encore été définis formellement, mais l’accent sera mis sur la correction des bugs et le nettoyage du code, ainsi que l’amélioration du thème par défaut.

Liens

Hacker bazaar

Salut à tous.

Je n’ai pas été actif sur ce blog ces derniers jours (grippe, tout ça), mais je n’ai pas pour autant été fainéant. J’ai en effet quelques tutos dans les cartons, et en particulier concernant Bazaar (le dvcs qui est mieux que git).

J’ai dernièrement dû hacker Bazaar pour un autre projet que j’annoncerai bientôt. Ça m’a donc permis de me familiariser avec les tripes de la bête et en particulier bzrlib. Car si bazaar est un bon dvcs, sa force reste le fait qu’on peut programmatiquement tout faire grâce à sa bibliothèque.

Voici donc un petit tuto pour lister les fichiers d’une branche de bazaar (et même d’une branche d’un repo sans arbre):

from bzrlib.branch import Branch
b = Branch.open("/emplacement/de/ma/branche/")
t = b.basis_tree()
b.lock_read()
files = t.iter_entries_by_dir()
for f in files:
    print f[0]
b.unlock()

Ce qui pourra donner ceci:

index.php
movicon
run-tests.php
apps/movicon
apps/tests
apps/movicon/app.ini
apps/movicon/controllers
...

Chaque élément de l’itérateur renvoyé par iter_entries_by_dir() est un tuple dans la forme (fichier, objet). L’objet en second membre contient les informations nécessaires pour connaitre la taille du fichier, son hash sha1, et sa référence unique pour pouvoir l’obtenir (ce qui nous intéresse davantage).

On peut donc obtenir un fichier directement et le manipuler à notre guise (le tout sans tree, c’est classe).

... # Voir plus haut
for f in files:
    if f[1].__class__ == bzrlib.inventory.InventoryFile:
        print t.get_file_text(f[1].file_id)
        break
b.unlock()

Ici on itère dans les fichiers encore, et on teste le type du second membre du tuple. On peut soit avoir le type CHKInventoryDirectory (pour un dossier) ou bien InventoryFile (pour un fichier). Lorsqu’il s’agit d’un fichier, on attrape son contenu et on l’affiche dans stdout. ensuite je break pour éviter de flooder la sortie (c’est juste un test).

Évidemment on peut faire une ribambelle d’autre choses avec bzrlib, mais autant commencer par les choses simples.

Pourquoi git me hérisse le poil

Voici un article trollesque en perpective. En fait j’aimerais bien, parce qu’au-delà de doper mes statistiques, ça voudrait dire que git est efficace et que je suis un menteur, donc que je n’ai jamais fait l’expérience que je vais vous relater.

Commençons par une petite définition. Programmer est une activité délicate qui demande beaucoup de concentration, et toute la partie logistique de la programmation, bien que passionnante, doit se faire aussi transparente que possible. Pousser son code quelque part ou ajouter le code de son voisin au sien doit être une étape simple, avec des commandes simples (si on doit regarder la page de man c’est foutu).

Vous n’êtes pas sans savoir que je me suis retrouvé impliqué dans le projet Movim, un réseau social libre basé sur XMPP, lequel utilisait git à l’époque. Il n’y avait qu’un seul dévelopeur, donc le workflow était très simple et n’importe quel VCS aurait fait l’affaire.

Suite à mon arrivée dans le projet, nous avons mit en place un workflow similaire à celui employé dans le noyau linux pour le projet, c’est à dire que chacun travaille sur une feature dans son coin et on merge dans le master (sorte de branche commune au projet) quand c’est mûr. Jusque là rien de compliqué.

Sauf que git ne l’entendait apparemment pas de cette oreille. Ainsi nous perdions environ une heure à chaque merge à essayer de comprendre pourquoi diable git ne voulait pas fusionner nos changements. C’est ainsi que lors d’un merge, les messages d’erreurs de l’outil étaient trop cryptiques pour moi, et donc comme d’habitude quand je suis dépassé, je demande de l’aide. Je me suis pointé sur le salon IRC de git, et quelques bonnes âmes expérimentées ont essayé de m’aider. Sans succès. Au final j’ai décidé de fusionner les deux codes à la main (enfin avec emacs et emerge) puis commiter, très sale mais au bout de 2h face à un mur, on n’est plus à ça près.

Après deux ou trois sorties de Movim à faire face à ce problème sans que la situation s’améliore (oui on pensait que c’était notre faute), nous avons finalement décidé d’arrêter les frais et de tenter le coup avec un autre VCS; n’importe lequel. On nous a chaudement conseillé Mercurial, et Bazaar un peu moins. Mais Mercurial ressemblait un peu à git et chat échaudé craint l’eau froide. Qui plus est j’avais déjà eu l’occasion d’utiliser Bazaar dans un workflow centralisé (comme subversion), et donc connaissais sa versatilité.

Nous avons donc décidé de faire la sortie suivante sur bazaar en synchronisant sur git (au cas où). Et nous avons été ébahi lorsque bazaar ne s’est pas une seule fois plaint, que les conflits étaient très explicitement indiqués et finalement nous sommes passés d’1h par merge à 5 minutes.

Depuis il m’arrive de voir des articles qui vantent les mérites de git contre d’autres, et c’est sûrement vrai qu’il est techniquement très efficace, voire supérieur, mais ce n’est pas un outil fait pour aider le programmeur.

Petite remarque sur EMACS24

Après vous avoir révélé les nouveautés de la version 24 d’EMACS, j’ai donc installé emacs-snapshot histoire d’en avoir un avant goût.

Je n’ai pas encore beaucoup testé la chose, mais je peux déjà dire qu’il est très très rapide. En effet EMACS23 prenait environ 4s ou 5s pour lire toute ma configuration et être utilisable, alors que le nouvel EMACS est prêt en 1s ou moins. Je ne sais pas comment ils ont fait, en tout cas j’en suis très satisfait :)

Si vous voulez aussi tester emacs-snapshot, vous pouvez le faire facilement sur debian, je pense qu’il y a un ppa aussi pour ubuntu, mais je vous laisse le chercher.

Emacs 24

St IGNUciusLa future mouture d’EMACS, version 24, apporte de nombreux changements, en particulier au niveau de la standardisation en introduisant plusieurs fonctions génériques qui simplifient beaucoup les modes et unifient leur comportement.

Un outil d’auto-complétion pcomplete a été introduit. Il s’agit d’un moteur d’auto-complétion programmable, qui sera notamment utilisé dans shell-mode, avec un comportement comme celui de bash ou zsh. Pour les modes, completion-at-point est une commande générique d’EMACS permettant de standardiser les systèmes de complétion. En effet jusqu’ici, les différents modes majeurs avaient chacun leurs petites fonction d’auto-complétion plus ou moins bien codées, et surtout avec des comportements différents.

EMACS est désormais lié à gtk3 et propose une meilleure intégration au thème gtk de l’environnement. Ce n’est guère important pour ceux qui virent l’interface, mais c’est un pas en avant.

Changement intéressant, EMACS 24 incorpore un gestionnaire de paquets qu’on peut accéder avec M-x list-packages. Cela permet d’installer facilement des modes et d’autres outils. Seul bémol, le dépôt par défaut est celui du projet GNU qui nécessite une attribution de droit d’auteur, donc il n’y a pas beaucoup de paquets. Heureusement, des dépôts alternatifs ont déjà vu le jour.

Voici venir la fin d’une ère. L’illustre paquet color-theme voit en effet ses derniers jours dans EMACS 23 et sera remplacé par un système de thèmes intégré à l’éditeur. Ce système est non seulement plus léger, il enlève aussi certains bugs ennuyeux de color-theme (comme quand on change thème dans une même session par exemple).

cc-mode, le mode majeur pour C peut maintenant deviner le style de code du buffer. Cela évitera bien des griefs en modifiant le fichier de quelqu’un qui indente son code différemment.

Le développement d’EMACS est passé du vénérable CVS à bazaar il y a peu. En conséquence, le support des dvcs dans vc-mode a été amélioré.

De nouveaux modes font aussi leur apparition dans cette nouvelle version.

occur-mode permet de lister toutes les lignes correspondant à une regexp particulière dans un buffer à l’intérieur d’un buffer temporaire. On peut faire des changements dans ce buffer temporaire qui seront automatiquement appliqués au buffer original.

Les deux modes mineurs electric-pair-mode et electric-indent-mode ont été intégré. Leur but est de proposer plus de standardisation en evitant aux modes d’implémenter leur propres fonctions électrique.

Un mode de gestion de mot de passe qui se lie à Gnome-keyring ou KDE Wallet a été ajouté. Pratique quand on utilise tramp pour accéder à son code via FTP ou SSH.

EMACS s’intègre maintenant avec le système de notification du bureau. Pratique quand on reçoit un hl dans ERC ou dans jabber.el.

Enfin, un morceau particulièrement juteux, soap-client et soap-inspect ont été ajoutés. Ils permettent de se connecter à un serveur SOAP et le débugger les doigts dans le pif. Voici une fonction super utile pour moi :-) .

Il y a bien sûr beaucoup beaucoup d’autres changements, mais je vous ai listé ceux qui m’intéresse en particulier. Vous pouvez jeter un oeil sur le blog qui m’a inspiré pour plus d’informations.

Ah et tant que j’y suis, voici la conversion de mon thème etenil-pastel pour EMACS 24:

(deftheme etenil-pastel
  "Theme for etenil")

(custom-theme-set-faces
 'etenil-pastel
 '(default ((t (:background "#111111" :foreground "#cccccc"))))
 '(cursor ((t (:background "#cccccc" :foreground "#111111"))))
 '(region ((t (:slant italic :background "#444444"))))
 '(mode-line ((t (:background "#444444" :foreground "#cccccc"))))
 '(mode-line-inactive ((t (:background "#444444" :foreground "#888888"))))
 '(fringe ((t (:background "#444444"))))
 '(minibuffer-prompt ((t (:foreground "#cccccc"))))
 '(font-lock-builtin-face ((t (:foreground "#88cc66"))))
 '(font-lock-comment-face ((t (:foreground "#555555"))))
 '(font-lock-constant-face ((t (:foreground "#cc6666" :weight bold))))
 '(font-lock-function-name-face ((t (:foreground "#cccc66"))))
 '(font-lock-keyword-face ((t (:foreground "#88cc66"))))
 '(font-lock-string-face ((t (:foreground "#cc6688"))))
 '(font-lock-type-face ((t (:foreground "#66cccc" :underline t))))
 '(font-lock-variable-name-face ((t (:foreground "#6688cc"))))
 '(font-lock-warning-face ((t (:foreground "#bb0000"))))
 '(isearch ((t (:background "#cd00cd" :foreground "#b0e2ff"))))
 '(lazy-highlight ((t (:background "#afeeee"))))
 '(link ((t (:foreground "#0000ff" :underline t))))
 '(link-visited ((t (:foreground "#8b008b" :underline t))))
 '(button ((t (:underline t))))
 '(header-line ((t (:background "#444444" :foreground "#111111")))))

(provide-theme 'etenil-pastel)

;; Local Variables:
;; no-byte-compile: t
;; End:

;;; etenil-pastel-theme.el  ends here