First there was: http://snipplr.com/view/15246/color-coded-svn-status
Then there was: http://snipplr.com/view/16540/color-coded-svn-status-v2
A few days ago, I found a handy script online that colorized the output of SVN status. It worked pretty well, but needed a little polish and a couple of tweaks to make it use more common Python idioms. As I continued to use it and fix bugs and inefficiencies, I ended up replacing nearly every line in the original, but it was still a great starting point.
Additional changes include ANSI word-wrapping, a configurable tab expansion feature (for better code alignment), the 'colorizedSubcommands' sequence so that only applicable commands get colorized, use of proper subprocess module calls so that piping through less will work (for example, try svn-color diff | less -r to see colorized diff output).
To use, stick it somewhere, make executable (chmod 755), and then add this to your .profile:
alias svn=/usr/local/bin/svn-color.py
I hope you find my modifications useful. You can modify the colors used by looking up the ANSI color codes for your preferred color scheme and editing the 'statusColors' dictionary. Here's a useful reference for ANSI color values:
http://www.ibm.com/developerworks/linux/library/l-tip-prompt/colortable.gif
Requires Python 2.4 or greater.
#!/usr/bin/env python """ Author: Saophalkun Ponlu (http://phalkunz.com) Contact: [email protected] Date: May 23, 2009 Modified: June 15, 2009 Additional modifications: Author: Phil Christensen (http://bubblehouse.org) Contact: [email protected] Date: February 22, 2010 """ import os, sys, re, subprocess tabsize = 4 colorizedSubcommands = ( 'status', 'add', 'remove', 'diff', ) statusColors = { "M" : "31", # red "\?" : "37", # grey "A" : "32", # green "X" : "33", # yellow "C" : "30;41", # black on red "-" : "31", # red "D" : "31;1", # bold red "\+" : "32", # green } def colorize(line): for color in statusColors: if re.match(color, line): return ''.join(("\001\033[", statusColors[color], "m", line, "\033[m\002")) else: return line def escape(s): s = s.replace('$', r'\$') s = s.replace('"', r'\"') s = s.replace('`', r'\`') return s passthru = lambda x: x quoted = lambda x: '"%s"' % escape(x) if __name__ == "__main__": cmd = ' '.join(['svn']+[(passthru, quoted)[' ' in arg](arg) for arg in sys.argv[1:]]) output = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) cancelled = False for line in output.stdout: line = line.expandtabs(tabsize) if(sys.argv[1] in colorizedSubcommands): line = colorize(line) try: sys.stdout.write(line) except: sys.exit(1)
Comments
Subscribe to comments
You need to login to post a comment.

I'm getting some strange characters showing in my terminal when running svn status. Is this something to do with using the wrong white-space character?
Example:
D file1 A + file2 M file3
They appear to be 0001 0002 (whatever that is)
When I turn this line:
return ''.join(("\001\033[", statusColors[color], "m", line, "\033[m\002"))
into this:
return ''.join(("\033[", statusColors[color], "m", line, "\033[m"))
The script works fine :)
Linux 4GBL08518 2.6.32-26-generic #48-Ubuntu SMP Wed Nov 24 09:00:03 UTC 2010 i686 GNU/Linux (Ubuntu 10.04.1 LTS)
GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)