/ Published in: Python
First there was: [http://snipplr.com/view/15246/color-coded-svn-status](http://snipplr.com/view/15246/color-coded-svn-status)
Then there was: [http://snipplr.com/view/16540/color-coded-svn-status-v2](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](http://www.ibm.com/developerworks/linux/library/l-tip-prompt/colortable.gif)
Requires Python 2.4 or greater.
Then there was: [http://snipplr.com/view/16540/color-coded-svn-status-v2](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](http://www.ibm.com/developerworks/linux/library/l-tip-prompt/colortable.gif)
Requires Python 2.4 or greater.
Expand |
Embed | Plain Text
Copy this code and paste it in your HTML
#!/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)