5/15/2010

Gource et Dokuwiki

J'ai découvert comme tout un chacun les superbes vidéos de Gource permettant de faire une représentation des modifications faites sur un système de gestion de version comme GIT ou SVN. Je me suis alors rappelé que mon wiki préféré (DOKUWIKI) est lui aussi un système de gestion de version comme un autre... Il suffit en effet de soulever le capot et d'aller regarder dans l'arborescence des dossiers pour y trouver le dossier "data/meta" dans lequel les fichiers "*.changes" renferment justement les informations recherchées. Par exemple, le fichier "systemes_visualisation.changes" ressemble à :
1263135717 ::1 C informatique:systemes_visualisation Wolverine créée
1263135988 ::1 E informatique:systemes_visualisation Wolverine
1263136423 ::1 E informatique:systemes_visualisation Wolverine

Explication :
  1. Le première colonne est un Unix Timestamp,
  2. la deuxième est l'adresse IP (je suis en localhost ;-) ),
  3. la troisième l'action réalisée (C pour créée, E pour éditée,...),
  4. la quatrième est claire, la cinquième est l'identifiant de la personne ayant modifié la page
  5. et enfin la dernière colonne est le petit texte que vous pouvez remplir quand vous modifiez une page...
Que faire de tout ça pour le faire lire à Gource, rien de plus simple, il suffit de transformer cette arborescence en un fichier de log compréhensible par Gource. Pour ce faire, j'ai développé un petit script python, nommé gourcedoku.py :
#!/bin/python

"""
This program parse logs of a dokuwiki
and tranform them for gource (a log viewer)
http://code.google.com/p/gource/

developped by WolverineX02
site : http://wolverinex02.blogspot.com

"""

import os.path
import getopt
import sys
import re



def listdirectory2(path):
"""list all the files like *.changes,
read them and output them in gource's log syntax
"""
for root, dirs, files in os.walk(path):
for i in files:
if (re.search('\.changes$', i)):
fichier = os.path.join(root, i)
myfile = open(fichier, 'r')
for line in myfile.readlines():
mots = line.split()
if len(mots)>=5:
resultat = mots[0] + "|"
resultat += mots[4] + "|"
resultat += translate(mots[2]) + "|"
resultat += fichier
print resultat
elif len(mots)==4:
resultat = mots[0] + "|Anonymous|"
resultat += translate(mots[2]) + "|"
resultat += fichier
print resultat
myfile.close()
def translate(mot):
"""translate the dokuwiki vocabulary to the gource one
C -> A
E -> M
other -> M
"""
if mot == "C":
return "A"
elif mot == "E":
return "M"
else:
return "M"

def main(argv):
"""principal function
"""
try:
opts, args = getopt.getopt(argv, "hd:", ["help", "dokuwiki="])
except getopt.GetoptError:
usage()
sys.exit(2)
for opt, arg in opts:
if opt in ("-h","--help"):
usage()
sys.exit()
elif opt in ("-d","--dokuwiki"):
print listdirectory2(arg)


def usage():
"""this function will display how to use this script
"""
print "This script will output change logs of a dokuwiki"
print "in a friendly way for gource"
print "how to use it :"
print "python gourcedoku.py -d ~/Sites/MyDokuwiki/ | sort > dokusort.log"
print "and then :"
print "gource --log-format custom dokusort.log --stop-position 1.0 \ "
print "--stop-on-idle --file-idle-time 10000000"
print "---"
print "-h : help "
print "-d : meta directory of your dokuwiki"


#print listdirectory2(sys.argv[1])

if __name__ == "__main__":
main(sys.argv[1:])
Pour le lancer, rien de plus simple : il suffit de se placer dans l'arborescence de son magnifique dokuwiki et la commande magique :
python gourcedoku.py -d ~/Sites/MyDokuwiki/ | sort > dokusort.log
puis visualiser le résultat avec Gource avec la commande suivante :
gource --log-format custom dokusort.log --stop-position 1.0 --stop-on-idle --file-idle-time 10000000
Je vais essayer de mettre ce code sur le site de Gource pour la communauté ;-) N'hésitez pas à me poser des questions ou à améliorer mon script.

3 commentaires:

  1. Anonyme14:23

    Bonjour,

    Excellent travail !

    Serait-il possible de le publier sous la forme d'un plugin pour DokuWiki ?? Ce serait très pratique.

    Bonne continuation, Mathieu

    RépondreSupprimer
  2. En fait, il doit être possible de générer le logs consommable par Gource avec du PHP... Il est donc fortement possible de créer un plugin dokuwiki... Il restera néanmoins nécessaire d'utiliser Gource : ce qui n'est pas directement intégrable dans le dokuwiki ;-)
    Si d'autres personnes sont intéressées, je creuserai la question ;-)

    RépondreSupprimer
  3. Anonyme23:11

    Merci de votre réponse.
    Je me doute qu'il sera compliqué d'intégrer Gource dans DokuWiki :-D mais vous voyez l'esprit de ma demande : rendre l'utilisation + abordable, notamment pour qui n'a pas accès aux lignes de commande sur son serveur (hébergement mutualisé).

    Je croise les doigts pour que cette idée de contrib rencontre le succès ! ^^

    Mathieu

    RépondreSupprimer