summaryrefslogtreecommitdiffstats
path: root/scripts/colorsvn
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/colorsvn')
-rwxr-xr-xscripts/colorsvn201
1 files changed, 201 insertions, 0 deletions
diff --git a/scripts/colorsvn b/scripts/colorsvn
new file mode 100755
index 00000000..f89e1c2f
--- /dev/null
+++ b/scripts/colorsvn
@@ -0,0 +1,201 @@
+#! /usr/bin/env perl
+
+# colorsvn
+#
+# based on colorgcc
+#
+# Requires the ANSIColor module from CPAN.
+#
+# Usage:
+#
+# In a directory that occurs in your PATH _before_ the directory
+# where svn lives, create a softlink to colorsvn:
+#
+# svn -> colorsvn
+#
+# That's it. When "svn" is invoked, colorsvn is run instead.
+#
+# The default settings can be overridden with ~/.colorcvsrc.
+# See the colorcvsrc-sample for more information.
+#
+# Note:
+#
+# colorsvn will only emit color codes if:
+#
+# (1) tts STDOUT is a tty.
+# (2) the value of $TERM is not listed in the "nocolor" option.
+# (3) the svn command is not a commit or import (as the text editor
+# opened by svn will often be hampered by colorsvn).
+#
+# If colorsvn colorizes the output, svn's STDERR will be
+# combined with STDOUT. Otherwise, colorsvn just passes the output from
+# svn through without modification.
+#
+# Copyright 2002 Neil Stevens <neil@qualityassistant.com>
+#
+# Copyright 1999 Jamie Moyers <jmoyers@geeks.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License as published
+# by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+use Term::ANSIColor;
+use IPC::Open3;
+
+sub initDefaults
+{
+ $svnPath = "/usr/bin/svn";
+
+ $nocolor{"dumb"} = "true";
+
+ $colors{"P"} = color("reset");
+ $colors{"U"} = color("reset");
+ $colors{" "} = color("reset");
+ $colors{"C"} = color("bold red");
+ $colors{"M"} = color("bold yellow");
+ $colors{'G'} = color("bold yellow");
+ $colors{"A"} = color("cyan");
+ $colors{"R"} = color("cyan");
+ $colors{"D"} = color("red");
+ $colors{"I"} = color("bold");
+ $colors{"?"} = color("bold");
+ $colors{"!"} = color("bold");
+ $colors{"~"} = color("bold red");
+ $colors{"server"} = color("bold green");
+ $colors{"warning"} = color("bold cyan");
+
+ # Applies when only the properties changed
+ $propcolors{"C"} = color("bold red");
+ $propcolors{"M"} = color("yellow");
+}
+
+sub loadPreferences
+{
+# Usage: loadPreferences("filename");
+
+ my($filename) = @_;
+
+ open(PREFS, "<$filename") || return;
+
+ while(<PREFS>)
+ {
+ next if (m/^\#.*/); # It's a comment.
+ next if (!m/(.*):\s*(.*)/); # It's not of the form "foo: bar".
+
+ $option = $1;
+ $value = $2;
+
+ if ($option =~ /svn/)
+ {
+ $svnPath = $value;
+ }
+ elsif ($option eq "nocolor")
+ {
+ # The nocolor option lists terminal types, separated by
+ # spaces, not to do color on.
+ foreach $termtype (split(/\s+/, $value))
+ {
+ $nocolor{$termtype} = "true";
+ }
+ }
+ elsif ($option =~ /prop (.)/)
+ {
+ # Property color
+ $propcolors{$1} = color($value);
+ }
+ else
+ {
+ $colors{$option} = color($value);
+ }
+ }
+ close(PREFS);
+}
+
+#
+# Main program
+#
+
+# Set up default values for colors and svn path.
+initDefaults();
+
+# Read the configuration file, if there is one.
+$configFile = $ENV{"HOME"} . "/.colorcvsrc";
+if (-f $configFile)
+{
+ loadPreferences($configFile);
+}
+
+# Get the terminal type.
+$terminal = $ENV{"TERM"} || "dumb";
+
+$commit = 0;
+foreach (@ARGV)
+{
+ if(/^ci$/ || /^commit$/ || /^import$/ || /^prop/ || /^p[delsg]$/)
+ {
+ $commit = 1;
+ break;
+ }
+ elsif (! /^-/)
+ {
+ break;
+ }
+}
+
+# If it's in the list of terminal types not to color, or if
+# we're writing to something that's not a tty, don't do color.
+if (! -t STDOUT || $commit == 1 || $nocolor{$terminal})
+{
+ exec $svnPath, @ARGV
+ or die("Couldn't exec");
+}
+
+-f $svnPath or die ("$svnPath not found, add svn=/full/path/to/svn to ~/.colorcvsrc");
+
+# Keep the pid of the svn process so we can get its return
+# code and use that as our return code.
+$svn_pid = open3('<&STDIN', \*SVNOUT, \*SVNOUT, $svnPath, @ARGV);
+$svnName = $svnPath;
+$svnName =~ s,.*/(.*)$,\1,;
+
+# Colorize the output from the svn program.
+while(<SVNOUT>)
+{
+ chomp;
+ if (m/^ (.).+/) # Property changed only
+ {
+ print($propcolors{$1}, $_, color("reset"));
+ }
+ elsif (m/^(.).+/) # S filename
+ {
+ print($colors{$1}, $_, color("reset"));
+ }
+ elsif (m/warning:/) # warning
+ {
+ print($colors{"warning"}, $_, color("reset"));
+ }
+ elsif (m/^$svnName[^:]*: / || m/^svn server: /) # server message
+ {
+ print($colors{"server"}, $_, color("reset"));
+ }
+ else # Anything else
+ {
+ # Print normally.
+ print(color("reset"), $_);
+ }
+ print "\n";
+}
+
+# Get the return code of the svn program and exit with that.
+waitpid($svn_pid, 0);
+exit ($? >> 8);