Petit outil pour se tenir au courant en temps réel des changements sur un SVN

En discutant avec Nelle (a.k.a Nux) de Basie, un Trac-like basé sur Trac, mais multi-projet, on est arrivé à la conclusion suivante, il manque le diff complet dans les flux RSS qui sortent de Trac|Redmine. Pourtant cela serait super pratique pour faire de la revue de code.

Puis en continuant dans mon coin, j’ai pensé que cela ne serait qu’un pas en avant. Le RSS est un outil que j’utilise pour regarder une quantité incroyable de news, et donc faire une revue de code entre un post d’@Korben et de The Sartorialist … HaHa.

En attendant qu’il y ai une option pour ça dans les Trac|Redmine, j’ai codé un petit script en python bien sympa qui m’ouvre automatiquement dans mon éditeur de texte du moment (cf. Textmate) le résultat de `svn log“svn diff` pour chaque révision qui arrive sur le serveur. Voici la video (à l’arrache, la prochaine fois je mettrai en musique de fond une musique d’ascenseur) :

Et le code du script (j’ai corrigé 2-3 trucs, suffisant pour le publier)

[sourcecode language='python']
# -*- coding: utf-8 -*-

# Mon nom c’est svnSPY
# Et mon auteur, c’est Jonathan Winandy (aka Metrokid)
# Et ma license, c’est une LGPL version 3
# Et si vous arrivez à me vendre, je vous félicite par avance !!

import os
import re #re pour les expressions régulières.

url = “http:// svn:// ou un chemin vers un checkout”
program = “mate” # remplacer par “bbedit” pour BBEdit, “edit” pour TextWrangler …
#”open -a %OtherApps%” pour les autres
file = open(“lastrev”,’r')
lastrev = int(file.read())
file.close

revisionRe = re.compile(r’revision=”(\d+)”‘,re.MULTILINE)
authorRE = re.compile(r’(.*)‘,re.MULTILINE)

fin, fout = os.popen4(“svn info –xml “+url);

outresult = fout.read()

revisionNum = lastrev # un moyen simple de régler le problème de connexion (l’erreur ne s’attrape pas finalement car elle est dans le langue du système (et je ne vois pas où récupérer l’exit code))
for first in revisionRe.findall(outresult):
revisionNum = int(first)

author = “–”
for first in authorRE.findall(outresult):
author = first

print author+” : “+str(revisionNum)

if lastrev < revisionNum:
file = open("lastrev",'w')
file.write(str(revisionNum))
file.close

mateargs = ""
for i in range(lastrev+1,revisionNum+1):
fin,finfo = os.popen4("svn log "+url+" -r "+str(i))
fin,fout = os.popen4("svn diff "+url+" -r "+str(i-1)+":"+str(i))

mateargs = mateargs + " rev"+str(i)+".diff"
file = open("rev"+str(i)+".diff",'w')
file.write(finfo.read())
file.write(fout.read())
file.close()

if (lastrev +1 <> revisionNum) or (author <> “Jon”):
#ouverture une première fois pour grouper les fichiers
fin,fout = os.popen4(program+” “+mateargs)
#ouverture une deuxième fois pour afficher les fichiers dans des tabs
for i in range(lastrev+1,revisionNum+1):
fin,fout = os.popen4(program+” rev”+str(i)+”.diff”)

[/sourcecode]

Bonne fin de week-end ;-)

Leave a Reply