banniere.png

commit hook en Python pour mercurial

Mercurial est un système distribué de gestion de sources écrit en Python. Il permet à des développeurs de travailler avec leur code et de le versionner comme avec Subversion, mais sans avoir à dépendre d'un serveur centralisé: chaque modification est conservée localement, et le développeur peut à tout moment se synchroniser avec un autre repository, qu'il soit sur un serveur ou sur un autre poste de développement.

Un repository Mercurial est accessible entres autres en SSH, et peut être recopié localement pour être modifié (commande clone), puis mis à jour avec la commande push. L'utilisation de Mercurial est très similaire à celle de Subversion:

dabox:~ tarek$ hg
Mercurial Distributed SCM

basic commands (use "hg help" for the full list or option "-v" for details):

add add the specified files on the next commit
annotate show changeset information per file line
clone make a copy of an existing repository
commit commit the specified files or all outstanding changes
diff diff repository (or selected files)
export dump the header and diffs for one or more changesets
init create a new repository in the given directory
log show revision history of entire repository or files
parents show the parents of the working dir or revision
pull pull changes from the specified source
push push changes to the specified destination
remove remove the specified files on the next commit
revert revert files or dirs to their states as of some revision
serve export the repository via HTTP
status show changed files in the working directory
update update or merge working directory

Mettre en place un projet basé sur Mercurial consiste donc à mettre à disposition des développeurs un repository via un utilisateur SSH. Cette mise en place est expliquée sur cette page : http://www.selenic.com/mercurial/wiki/index.cgi/MultipleCommitters.

Mercurial propose, comme Subversion un système de hook pour effectuer des opérations lorsqu'un développeur "push" des modifications sur le serveur désigné comme "central". Un script pour envoyer des mails à chaque push est fourni sur le site, mais n'est pas très souple (script shell basic).

Voici un script Python qui offre un peu plus de souplesse:
#!/usr/bin/python
import sys
import os
import smtplib
from email.MIMEText import MIMEText
from ConfigParser import ConfigParser
from email.Utils import formatdate

conffile = os.path.join(os.path.dirname(__file__), 'commithook.conf')
config = ConfigParser()
config.read(conffile)

def command(cmd):
return os.popen(cmd, 'r').read()

def send_mail(log, email, subject):
msg = MIMEText(log, 'plain', 'UTF-8')
sender = config.get('configuration', 'sender')
prefix = config.get('configuration', 'prefix')
msg['From'] = sender
msg['To'] = email
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = '%s %s' % (prefix, subject)
server = smtplib.SMTP('localhost')
try:
server.sendmail(sender, [email], msg.as_string())
finally:
server.quit()

if __name__ == '__main__':
hg_node = os.getenv('HG_NODE')
subject = command('hg log -r %s | grep "^summary:" | cut -b 14-' % hg_node)
emails = config.get('configuration', 'emails').split(',')
for email in emails:
log = command('hg log -vpr %s' % hg_node)
send_mail(log, email, subject)
Il est associé à un fichier de configuration qui permet d'indiquer:
  • le nom de l'expéditeur
  • le préfix des mails
  • la liste des emails

exemple de fichier:
[configuration]
sender=tarek_at_ziade.org
prefix=[commit]
emails=bob_at_gmail.com,tarek_at_ziade.org
Ces deux fichiers sont placés dans le répertoire .hg du repository du serveur, et indiqués dans le fichier hgrc de ce même répertoire:
[hooks]
incoming = commithook
Mercurial, pour conclure, est probablement l'un des systèmes de gestion de source les plus souples pour des projets personnels : le repository local peut être à tout moment cloné sur une autre machine, ce qui offre énormément de facilité pour partager son travail versionné, ou mettre en place un système de sauvegarde passif basé sur des push réguliers vers un serveur.

Il est probablement équivalent à Bazaar, que je n'ai pas encore testé.

Vous aimez ce post ? partagez-le :


"Et darcs ?" posté par Stéphane Bortzmeyer le 28/12/2006 à 22:53
À part qu'il n'est pas écrit en Python, pourquoi pas Darcs ?

Je trouve Mercurial très pénible à utiliser, notamment avec son habitude de nécessiter des fusions (qu'il faut committer) dès qu'on synchronise deux dépôts.

"@Stéphane" posté par Tarek le 29/12/2006 à 15:03
Salut,
Le principe des merges ne me choque pas, je trouve ca bien qu'il soit explicite. Ceci
étant dit, je n'ai pas testé Mercurial sur des gros volumes d'échanges avec beaucoup
de commiters encore.

j'ai commencé à regarder Darcs, ca a l'air vraiment bien, je vais essayer aussi. 

Merci pour l'info
"Spam" posté par Labadie le 04/01/2007 à 12:47
je vois qu'un robot (sans doute) a posté son spam.

Je gère un forum, et je me demandai si ce spam qui vient de l'etranger serait bloqué par des questions en français dans plusieurs images (une partie de l'image contient une question), dans différents formats ?
"@labadie" posté par tarek le 06/01/2007 à 10:23
OUi, je dois ajouter un captcha, dès que j'ai le temps...
Trackback URL | Categories: coding 4 comments - add

Tarek Ziadé. Copyright 2006. Tous droits réservés. Licence contenu site
BuzTrucs
Add to Technorati Favorites