Skip to content

Instantly share code, notes, and snippets.

@ildyria
Forked from philchristensen/svn-color.py
Last active February 9, 2017 09:50
Show Gist options
  • Select an option

  • Save ildyria/61fbbabf74f132d242365a1f8b733e85 to your computer and use it in GitHub Desktop.

Select an option

Save ildyria/61fbbabf74f132d242365a1f8b733e85 to your computer and use it in GitHub Desktop.
Merge with git log, change color of untracked files to dark grey, better link to the colors.

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://unix.stackexchange.com/questions/124407/what-color-codes-can-i-use-in-my-ps1-prompt

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
Additional modifications:
Author: Baptiste Marchand
Contact: [email protected]
Date: March 19, 2014
Additional modifications:
Author: Biv
Contact:
Date: February 9, 2016
"""
import os, sys, re, subprocess
tabsize = 4
colorizedSubcommands = (
'status',
'add',
'remove',
'diff',
)
all_colors = {
"M" : "31", # red
"\?" : "90", # grey
"A" : "32", # green
"X" : "33", # yellow
"C" : "30;41", # black on red
"!" : "30;41", # black on red
"-" : "31", # red
"D" : "31;1", # bold red
"\+" : "32", # green
}
log_colors = {
"r\d+ \|" : "33", # yellow
"\-+" : "33", # yellow
"\++" : "30", # black
}
statusColors = {
'status' : all_colors,
'st' : all_colors,
'log' : log_colors,
'add' : all_colors,
'remove' : all_colors,
'diff' : all_colors,
}
def colorize(line, cmd):
for color in statusColors[cmd]:
if re.match(color, line):
return ''.join(("\001\033[", statusColors[cmd][color], "m", line[:-1], "\033[m\002",'\n'))
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, sys.argv[1])
try:
sys.stdout.write(line)
except:
sys.exit(1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment