DokuWiki

It's better when it's simple

User Tools

Site Tools

Trace: gource_analysis

tips:gource_analysis

Visualize Changes in Gource

I am fond of the wonderful videos made with Gource. This tool makes a representation of changes made on a version control system like git or SVN. Then I remember that DokuWiki is also a version control system like any other ... Just have a look in the folder tree to find the directory dokuwiki/data/meta in which the files *.changes contain exactly the information needed.

More information on this blog (french version) or a translate version on this blog.

I wrote a small python script to generate logs from .changes files that can be used by Gource :

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 glob
import os.path
import getopt
import sys
import re
 
WHITE = "11FFAA"
GREEN = "00F000"
vector = (1,10,100)
start_page_name = "start"
 
def RGBToHTMLColor(rgb_tuple):
 """ convert an (R, G, B) tuple to #RRGGBB """
 hexcolor = '#%02X%02X%02X' % rgb_tuple
 # that's it! '%02x' means zero-padded, 2-digit hex values
 return hexcolor
 
def HTMLColorToRGB(colorstring):
 """ convert #RRGGBB to an (R, G, B) tuple """
 colorstring = colorstring.strip()
 if colorstring[0] == '#': colorstring = colorstring[1:]
 if len(colorstring) != 6:
 raise ValueError, "input #%s is not in #RRGGBB format" % colorstring
 r, g, b = colorstring[:2], colorstring[2:4], colorstring[4:]
 r, g, b = [int(n, 16) for n in (r, g, b)]
 return (r, g, b)
 
def colormodify(colorstring):
 rgb_tuple = HTMLColorToRGB(colorstring)
 r, g, b = (rgb_tuple[0]+vector[0]) % 255,(rgb_tuple[1]+vector[1]) % 255,(rgb_tuple[2]+vector[2]) % 255
 return RGBToHTMLColor((r, g, b))
 
def listdirectory(path,color):
 l = glob.glob(path+"/*")
 for i in l:
 if os.path.isdir(i):
 listdirectory(i,colormodify(color))
 else:
 readfile(i,color)
 
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)
 readfile(fichier,GREEN)
 
def readfile(fichier,color):
 """read the file and output for each line of this
 file a log line for Gource
 """
 
 myfile = open(fichier, 'r')
 for line in myfile.readlines():
 mots = line.split('\t')
 if len(mots)>=6:
 resultat = mots[0] + "|"
 if mots[4] == '':
 mots[4] = 'Anonymous'
 resultat += mots[4] + "|"
 resultat += translate(mots[2]) + "|"
 resultat += mots[3].replace(':', '/')
 if mots[3].rfind(start_page_name) == len(mots[3])-len(start_page_name):
 resultat += "|" + color
 else:
 resultat += "|" + colormodify(color)
 print resultat
 myfile.close()
 
 
def translate(mot):
 """translate the dokuwiki vocabulary to the gource one
 C (also cc and sc from discussion plugin) ->A
 E (also ec from discussion plugin) -> M
 D (also dc and hc from discssion plugin) -> D
 other -> M 
 """
 if mot.upper == "C" or mot == 'cc' or mot == 'sc':
 return "A"
 elif mot.upper == "E" or mot == 'ec':
 return "M"
 elif mot.upper == "D" or mot == 'dc' or mot == 'hc':
 return "D"
 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 listdirectory(arg,WHITE)
 
 
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"
 
if __name__ == "__main__":
 main(sys.argv[1:])

launch the script inside your dokuwiki directory :

python gourcedoku.py -d ~/Sites/MyDokuwiki/ | sort > dokusort.log

then you can use Gource to watch logs :

gource --log-format custom dokusort.log --stop-position 1.0 --stop-on-idle --file-idle-time 10000000
tips/gource_analysis.txt · Last modified: by 193.9.13.135

AltStyle によって変換されたページ (->オリジナル) /