Introduction

Il y a quelques temps, j'ai décidé de quitter Github, en fermant mon compte. Depuis, j'expérimente des modes de contribution au logiciel libre de manière à peu près décentralisées.

Aujourd'hui, nous allons voir comment contribuer à un développement avec l'aide de git et du bon vieux courrier électronique via la commande git send-email !

Comment ça marche ?

Globalement le mode opératoire est asez simple:

  • Vous avez un clone du dépôt central.
  • Vous faîtes des modifications donc des commits.
  • Une fois que vous estimez que vos changements sont dignes d'êtres soumis au(x) responsable(s) du projet, vous utilisez git send-email.
  • De son côté, le responsable du projet utilise git am pour récupérer vos modifications.
  • S'il a des remarques à faire, il vous les renvoie en réponse à votre courrier électronique où finalement toute l'action de négociation se déroule (en privé par défaut).
  • Une fois que tout est ok pour le responsable projet, il intègre vos changements (ou non) et votre contribution est intégrée au projet (ou non).

Pour faire simple, git send-email propose un système proche des pull-requests de Github mais en passant par le canal complètement décentralisé du courrier électronique.

C'est plutôt une proposition intéressante car elle permet un développement immédiat avec quelques outils dont, à peu près tout le monde est équipé (git et une adresse de courrier électronique).

Quelques éléments de configuration

Avant de commencer, sachez que sous Debian, git email-send n'est pas installé par défaut avec le paquet git (ce qui est sans doute dommage). Vous pouvez l'installer via:

# apt install git-email

Ensuite, avant de pouvoir utiliser git send-email, il faut configurer git pour accéder à votre serveur de courrier électronique.

  • D'abord, vous devez savoir à quelle adresse de courrier électronique envoyer vos modifications (project@thesuperproject.example dans la suite de l'article). Cette configuration sera bien entendu différente pour chaque projet et elle doit être locale au dépôt git.
    git config --local sendemail.to project@thesuperproject.example
  • Ensuite, vous aurez besoin d'indiquer quel serveur SMTP sera utilisé pour réaliser l'envoi du courrier électronique proprement dit. Ces éléments de configuration seront sans doute indépendants du projet sur lequel vous travaillez. Vous pouvez donc les déclarer en global:
    git config --global sendemail.smtpServer smtpserver.example
    git config --global sendemail.smtpServerPort 25
    git config --global sendemail.smtpEncryption tls
    git config --global sendemail.from myaccount@smtpserver.example
    git config --global sendemail.smtpUser myaccount
  • Enfin, vous avez besoin de configurer quelques options générales de git send-email, notamment le fait d'annoter systématiquement vos patches (via annotate) ainsi que la configuration de l'encodage de vos messages:
    git config --global sendemail.verify on
    git config --global sendemail.annotate yes
    git config --global sendemail.transferEncoding 8bit

Un exemple concret

Du point de vue du contributeur externe

Ok, vous êtes un contributeur externe. Vous avez réalisé quelques commits sur la branche master et vous souhaitez les soumettre au responsable du projet. Vous avez configuré git send-email comme indiqué ci-dessus.

Dans vos changements, vous avez dépassé la référence origin/master de quelques commits. Vous avez juste à lancer la commande suivante:

$ git send-email origin/master

Votre éditeur de texte configuré dans git va s'ouvrir en vous permettant d'écrire un message au début du courrier électronique. C'est là que vous remplissez la description de votre soumission de patch.

Ensuite, après l'enregistrement, git send-email vous demande une confirmation ainsi que le mot de passe du serveur SMTP (car nous ne l'avons pas renseigné en dur dans la configuration de git pour des raisons de sécurité).

Si tout se passe bien, votre courrier électronique est envoyé ! S'il y a des problèmes dans l'authentification, vérifiez votre configuration SMTP. Par exemple, dans mon cas j'utilise STARTTLS sur mon serveur SMTP et j'ai dû configurer l'option sendemail.smtpEncryption à tls pour pouvoir faire l'authentification de manière correcte.

Si vous voulez envoyer un truc différent, vous pouvez utiliser le vocable des révisions git. Par exemple, si vous souhaitez envoyer uniquement un commit précis, vous pouvez mettre son uid:

$ git send-email 1bea5dff495173beb9b93e6e0ea7df6e2435a283

Du point de vue du développeur interne

Ok, vous êtes un développeur du projet et vous avez reçu un courrier électronique avec un patch dedans. Vous devez appliquer ce patch, le tester, faire d'éventuels réponses avec l'auteur du patch puis quelques aller-retours. Néanmoins, en dehors de l'application du patch sur le dépôt, tout ces éléments se dérouleront dans votre application de courrier électronique.

Pour appliquer le patch soumis, vous devez le sauvegarder et appliquer le patch avec git am.

Dans mon cas, je sauvegarde le message au format eml depuis Roundcube dans un fichier dédié. Ensuite, je lance la simple commande:

$ git am chemin/vers/fichier.eml

Ce qui est assez intéressant, c'est que git am reprend le sujet du courrier électronique comme sujet du commit ainsi que les commentaires globaux du patch.

Il y aura forcément des conflits, des trucs pas terribles mais, comme d'habitude dans git, vous aurez besoin de gérer les choses... ou de renvoyer à l'auteur du patch, à votre discrétion.

Conclusions

git send-email fait les choses très bien. Après avoir passé 5 minutes à le configurer correctement et compris comment ça marchait, vous avez maintenant un outil bien intégré pour faire des propositions d'évolution sur des projets externes. Et ce, sans avoir besoin d'avoir un compte sur cette plate-forme externe, ni d'utiliser votre navigateur web pour écrire des messages. C'est plutôt efficace et en plus, tout reste dans git. Pas besoin d'outil externe.

Bien entendu, votre "pull-request" n'est pas connue du grand public par défaut. Néanmoins si l'équipe de développement a mis en place une bonne vieille mailing-list des familles, votre soumission devrait être disponible dessus. Ce n'est pas mon cas sur medspx.fr car je préferre rester dans un mode plus discret et que je n'ai pas vraiment de contributeurs externes.

Pour information, j'ai trouvé trace de git send-email sur le blog de Drew Devault, le développeur principal du projet Sway.

Je vous invite aussi à lire le guide des contributions via git send-email sur la plate-forme sr.ht. Il est plein d'exemples assez intéressants...