# # # patch "monotone.py" # from [1cd3ca6de2612c55cf63eb87a10a3e3f34f9e90c] # to [d50d23e9528adf5dd5b6ad0139985c8d1164d0f6] # ============================================================ --- monotone.py 1cd3ca6de2612c55cf63eb87a10a3e3f34f9e90c +++ monotone.py d50d23e9528adf5dd5b6ad0139985c8d1164d0f6 @@ -1,11 +1,13 @@ import utility import string import urllib import pipes import sets +import sha import re import os +from colorsys import hls_to_rgb # # a python wrapper for the "monotone" command @@ -24,6 +26,15 @@ log_entry_re = re.compile(r'^(\S+): (.*)$') +def colour_from_string(str): + def f(off): + return ord(hashval[off]) / 256.0 + hashval = sha.new(str).digest() + hue = f(0) + li = f(1) * 0.15 + 0.75 + sat = f(2) * 0.3 + .5 + return ''.join(map(lambda x: "%.2x" % int(x * 256), hls_to_rgb(hue, li, sat))) + class Monotone: def __init__(self, mt, dbfile): self.mt = mt @@ -186,13 +197,18 @@ d = dot_escape(attrs['Date'][0]) d = d[0:d.find("T")] label += " on %s" % d - if attrs.has_key('Author'): label += "\\n%s" % (dot_escape(attrs['Author'][0])) + if attrs.has_key('Author'): + label += "\\n%s" % (dot_escape(attrs['Author'][0])) + override_fillcolor = colour_from_string(attrs['Author'][0]) + else: override_fillcolor = None #opts = 'fontname=Windsor,fontsize=8,shape=box,href="revision.psp?id=%s",label="%s"' % (urllib.quote(revision), label) opts = 'label="%s"' % label #revision[0:8] for opt in graphopts['nodeopts']: + if opt == 'fillcolor' and override_fillcolor != None: continue opts += ',%s="%s"' % (opt, graphopts['nodeopts'][opt]) if revision == id: opts += ",color=blue" opts += ',href="revision.psp?id=%s"' % urllib.quote(revision) + if override_fillcolor != None: opts += ',fillcolor="#%s"' % (override_fillcolor) #opts += ',tooltip="by %s at %s on %s"' % (dot_escape(attrs['ChangeLog'][0]), # dot_escape(attrs['Date'][0]), # dot_escape(attrs['Branch'][0]))