Warning, /sdk/kde-dev-scripts/colorcvs is written in an unsupported language. File is not indexed.

0001 #! /usr/bin/env perl
0002 
0003 # colorcvs
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 cvs lives, create a softlink to colorcvs:
0013 #
0014 #    cvs -> colorcvs
0015 #
0016 # That's it. When "cvs" is invoked, colorcvs 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 # colorcvs 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 cvs command is not a commit or import (as the text editor
0028 #    opened by cvs will often be hampered by colorcvs).
0029 #
0030 # If colorcvs colorizes the output, cvs's STDERR will be
0031 # combined with STDOUT. Otherwise, colorcvs just passes the output from
0032 # cvs 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 
0055 sub initDefaults
0056 {
0057         $cvsPath = "/usr/bin/cvs";
0058 
0059         $nocolor{"dumb"} = "true";
0060 
0061         $colors{"P"} = color("reset");
0062         $colors{"U"} = color("reset");
0063         $colors{"C"} = color("bold red");
0064         $colors{"M"} = color("bold yellow");
0065         $colors{"A"} = color("cyan");
0066         $colors{"R"} = color("cyan");
0067         $colors{"?"} = color("bold");
0068         $colors{"server"} = color("bold green");
0069         $colors{"warning"} = color("bold cyan");
0070 }
0071 
0072 sub loadPreferences
0073 {
0074 # Usage: loadPreferences("filename");
0075 
0076         my($filename) = @_;
0077 
0078         open(PREFS, "<$filename") || return;
0079 
0080         while(<PREFS>)
0081         {
0082                 next if (m/^\#.*/);          # It's a comment.
0083                 next if (!m/(.*):\s*(.*)/);  # It's not of the form "foo: bar".
0084 
0085                 $option = $1;
0086                 $value = $2;
0087 
0088                 if ($option =~ /cvs/)
0089                 {
0090                         $cvsPath = $value;
0091                 }
0092                 elsif ($option eq "nocolor")
0093                 {
0094                         # The nocolor option lists terminal types, separated by
0095                         # spaces, not to do color on.
0096                         foreach $termtype (split(/\s+/, $value))
0097                         {
0098                                 $nocolor{$termtype} = "true";
0099                         }
0100                 }
0101                 else
0102                 {
0103                         $colors{$option} = color($value);
0104                 }
0105         }
0106         close(PREFS);
0107 }
0108 
0109 #
0110 # Main program
0111 #
0112 
0113 # Set up default values for colors and cvs path.
0114 initDefaults();
0115 
0116 # Read the configuration file, if there is one.
0117 $configFile = $ENV{"HOME"} . "/.colorcvsrc";
0118 if (-f $configFile)
0119 {
0120         loadPreferences($configFile);
0121 }
0122 
0123 # Get the terminal type. 
0124 $terminal = $ENV{"TERM"} || "dumb";
0125 
0126 $commit = 0;
0127 foreach (@ARGV)
0128 {
0129         if(/^ci$/ || /^commit$/ || /^import$/)
0130         {
0131                 $commit = 1;
0132         }
0133 }
0134 
0135 # If it's in the list of terminal types not to color, or if
0136 # we're writing to something that's not a tty, don't do color.
0137 if (! -t STDOUT || $commit == 1 || $nocolor{$terminal})
0138 {
0139         exec $cvsPath, @ARGV
0140                 or die("Couldn't exec");
0141 }
0142 
0143 # Keep the pid of the cvs process so we can get its return
0144 # code and use that as our return code.
0145 $cvs_pid = open3('<&STDIN', \*CVSOUT, \*CVSOUT, $cvsPath, @ARGV);
0146 $cvsName = $cvsPath;
0147 $cvsName =~ s,.*/(.*)$,\1,;
0148 
0149 # Colorize the output from the cvs program.
0150 while(<CVSOUT>)
0151 {
0152         chomp;
0153         if (m/^(.) .+/) # S filename
0154         {
0155                 print($colors{$1}, $_, color("reset"));
0156         }
0157         elsif (m/warning:/) # warning
0158         {
0159                 print($colors{"warning"}, $_, color("reset"));
0160         }
0161         elsif (m/^$cvsName[^:]*: / || m/^cvs server: /) # server message
0162         {
0163                 print($colors{"server"}, $_, color("reset"));
0164         }
0165         else # Anything else
0166         {
0167                 # Print normally.
0168                 print(color("reset"), $_);
0169         }
0170         print "\n";
0171 }
0172 
0173 # Get the return code of the cvs program and exit with that.
0174 waitpid($cvs_pid, 0);
0175 exit ($? >> 8);