Warning, /sdk/kde-dev-scripts/colorsvn is written in an unsupported language. File is not indexed.
0001 #! /usr/bin/env perl 0002 0003 # colorsvn 0004 # 0005 # based on colorgcc 0006 # 0007 # Requires the ANSIColor module from CPAN. 0008 # 0009 # Usage: 0010 # 0011 # In a directory that occurs in your PATH _before_ the directory 0012 # where svn lives, create a softlink to colorsvn: 0013 # 0014 # svn -> colorsvn 0015 # 0016 # That's it. When "svn" is invoked, colorsvn is run instead. 0017 # 0018 # The default settings can be overridden with ~/.colorcvsrc. 0019 # See the colorcvsrc-sample for more information. 0020 # 0021 # Note: 0022 # 0023 # colorsvn will only emit color codes if: 0024 # 0025 # (1) tts STDOUT is a tty. 0026 # (2) the value of $TERM is not listed in the "nocolor" option. 0027 # (3) the svn command is not a commit or import (as the text editor 0028 # opened by svn will often be hampered by colorsvn). 0029 # 0030 # If colorsvn colorizes the output, svn's STDERR will be 0031 # combined with STDOUT. Otherwise, colorsvn just passes the output from 0032 # svn through without modification. 0033 # 0034 # Copyright 2002 Neil Stevens <neil@qualityassistant.com> 0035 # 0036 # Copyright 1999 Jamie Moyers <jmoyers@geeks.com> 0037 # 0038 # This program is free software; you can redistribute it and/or modify 0039 # it under the terms of the GNU General Public License as published by 0040 # the Free Software Foundation; version 2 of the License as published 0041 # by the Free Software Foundation. 0042 # 0043 # This program is distributed in the hope that it will be useful, 0044 # but WITHOUT ANY WARRANTY; without even the implied warranty of 0045 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0046 # GNU General Public License for more details. 0047 # 0048 # You should have received a copy of the GNU General Public License 0049 # along with this program; if not, write to the Free Software 0050 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 0051 0052 use Term::ANSIColor; 0053 use IPC::Open3; 0054 use File::Spec::Functions qw/catfile file_name_is_absolute path/; 0055 0056 sub initDefaults 0057 { 0058 $svnCmd = "svn"; 0059 0060 $nocolor{"dumb"} = "true"; 0061 0062 $colors{"P"} = color("reset"); 0063 $colors{"U"} = color("reset"); 0064 $colors{" "} = color("reset"); 0065 $colors{"C"} = color("bold red"); 0066 $colors{"M"} = color("bold yellow"); 0067 $colors{'G'} = color("bold yellow"); 0068 $colors{"A"} = color("cyan"); 0069 $colors{"R"} = color("cyan"); 0070 $colors{"D"} = color("red"); 0071 $colors{"I"} = color("bold"); 0072 $colors{"?"} = color("bold"); 0073 $colors{"!"} = color("bold"); 0074 $colors{"~"} = color("bold red"); 0075 $colors{"server"} = color("bold green"); 0076 $colors{"warning"} = color("bold cyan"); 0077 0078 # Applies when only the properties changed 0079 $propcolors{"C"} = color("bold red"); 0080 $propcolors{"M"} = color("yellow"); 0081 } 0082 0083 sub loadPreferences 0084 { 0085 # Usage: loadPreferences("filename"); 0086 0087 my($filename) = @_; 0088 0089 open(PREFS, "<$filename") || return; 0090 0091 while(<PREFS>) 0092 { 0093 next if (m/^\#.*/); # It's a comment. 0094 next if (!m/(.*):\s*(.*)/); # It's not of the form "foo: bar". 0095 0096 $option = $1; 0097 $value = $2; 0098 0099 if ($option =~ /svn/) 0100 { 0101 $svnCmd = $value; 0102 } 0103 elsif ($option eq "nocolor") 0104 { 0105 # The nocolor option lists terminal types, separated by 0106 # spaces, not to do color on. 0107 foreach $termtype (split(/\s+/, $value)) 0108 { 0109 $nocolor{$termtype} = "true"; 0110 } 0111 } 0112 elsif ($option =~ /prop (.)/) 0113 { 0114 # Property color 0115 $propcolors{$1} = color($value); 0116 } 0117 else 0118 { 0119 $colors{$option} = color($value); 0120 } 0121 } 0122 close(PREFS); 0123 } 0124 0125 # 0126 # Main program 0127 # 0128 0129 # Set up default values for colors and svn path. 0130 initDefaults(); 0131 0132 # Read the configuration file, if there is one. 0133 $configFile = $ENV{"HOME"} . "/.colorcvsrc"; 0134 if (-f $configFile) 0135 { 0136 loadPreferences($configFile); 0137 } 0138 0139 # Get the terminal type. 0140 $terminal = $ENV{"TERM"} || "dumb"; 0141 0142 $commit = 0; 0143 foreach (@ARGV) 0144 { 0145 if(/^ci$/ || /^commit$/ || /^import$/ || /^prop/ || /^p[delsg]$/) 0146 { 0147 $commit = 1; 0148 break; 0149 } 0150 elsif (! /^-/) 0151 { 0152 break; 0153 } 0154 } 0155 0156 # If it's in the list of terminal types not to color, or if 0157 # we're writing to something that's not a tty, don't do color. 0158 if (! -t STDOUT || $commit == 1 || $nocolor{$terminal}) 0159 { 0160 exec $svnCmd, @ARGV; 0161 die("Couldn't exec"); 0162 } 0163 0164 sub svn_not_found() { 0165 die ("$svnCmd not found, add svn=/full/path/to/svn to ~/.colorcvsrc"); 0166 } 0167 0168 # Check if we have SVN binary accessible. Of course, there could 0169 # be a race, but we don't care - all we want is to print out 0170 # nice error if executable SVN binary could not be found. 0171 if (file_name_is_absolute($svnCmd)) { 0172 svn_not_found unless -f $svnCmd and -x $svnCmd; 0173 } else { 0174 my $found = 0; 0175 foreach (path()) { 0176 my $path = catfile($_, $svnCmd); 0177 if (-f $path and -x $path) { 0178 $found = 1; 0179 last; 0180 } 0181 } 0182 svn_not_found unless $found; 0183 } 0184 0185 # Keep the pid of the svn process so we can get its return 0186 # code and use that as our return code. 0187 $svn_pid = open3('<&STDIN', \*SVNOUT, \*SVNOUT, $svnCmd, @ARGV); 0188 $svnName = $svnCmd; 0189 $svnName =~ s,.*/(.*)$,\1,; 0190 0191 # Colorize the output from the svn program. 0192 while(<SVNOUT>) 0193 { 0194 chomp; 0195 if (m/^ (.).+/) # Property changed only 0196 { 0197 print($propcolors{$1}, $_, color("reset")); 0198 } 0199 elsif (m/^(.).+/) # S filename 0200 { 0201 print($colors{$1}, $_, color("reset")); 0202 } 0203 elsif (m/warning:/) # warning 0204 { 0205 print($colors{"warning"}, $_, color("reset")); 0206 } 0207 elsif (m/^$svnName[^:]*: / || m/^svn server: /) # server message 0208 { 0209 print($colors{"server"}, $_, color("reset")); 0210 } 0211 else # Anything else 0212 { 0213 # Print normally. 0214 print(color("reset"), $_); 0215 } 0216 print "\n"; 0217 } 0218 0219 # Get the return code of the svn program and exit with that. 0220 waitpid($svn_pid, 0); 0221 exit ($? >> 8);