#!/usr/bin/perl -w # # $Id: colordiff.pl,v 1.4.2.10 2004/01/04 15:02:59 daveewart Exp $ ######################################################################## # # # ColorDiff - a wrapper/replacment for 'diff' producing # # colourful output # # # # Copyright (C)2002-2004 Dave Ewart (davee@sungate.co.uk) # # # ######################################################################## # # # 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; either version 2 of the License, or # # (at your option) any later version. # # # # 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., 675 Mass Ave, Cambridge, MA 02139, USA. # # # ######################################################################## use strict; use Getopt::Long qw(:config pass_through); use IPC::Open2; my $app_name = 'colordiff'; my $version = '1.0.4'; my $author = 'Dave Ewart'; my $author_email = 'davee@sungate.co.uk'; my $app_www = 'http://colordiff.sourceforge.net/'; my $copyright = '(C)2002-2004'; my $show_banner = 1; # ANSI sequences for colours my %colour; $colour{white} = "\033[1;37m"; $colour{yellow} = "\033[1;33m"; $colour{green} = "\033[1;32m"; $colour{blue} = "\033[1;34m"; $colour{cyan} = "\033[1;36m"; $colour{red} = "\033[1;31m"; $colour{magenta} = "\033[1;35m"; $colour{black} = "\033[1;30m"; $colour{darkwhite} = "\033[0;37m"; $colour{darkyellow} = "\033[0;33m"; $colour{darkgreen} = "\033[0;32m"; $colour{darkblue} = "\033[0;34m"; $colour{darkcyan} = "\033[0;36m"; $colour{darkred} = "\033[0;31m"; $colour{darkmagenta} = "\033[0;35m"; $colour{darkblack} = "\033[0;30m"; $colour{OFF} = "\033[0;0m"; # Default colours if /etc/colordiffrc or ~/.colordiffrc do not exist my $plain_text = $colour{OFF}; my $file_old = $colour{red}; my $file_new = $colour{blue}; my $diff_stuff = $colour{magenta}; # Locations for personal and system-wide colour configurations my $HOME = $ENV{HOME}; my $etcdir = '/etc'; my ($setting, $value); my @config_files = ("$etcdir/colordiffrc", "$HOME/.colordiffrc"); my $config_file; foreach $config_file (@config_files) { if (open(COLORDIFFRC, "<$config_file")) { while () { chop; next if (/^#/ || /^$/); s/\s+//g; ($setting, $value) = split ('='); if ($setting eq 'banner') { if ($value eq 'no') { $show_banner = 0; } next; } if (!defined $colour{$value}) { print "Invalid colour specification ($value) in $config_file\n"; next; } if ($setting eq 'plain') { $plain_text = $colour{$value}; } elsif ($setting eq 'oldtext') { $file_old = $colour{$value}; } elsif ($setting eq 'newtext') { $file_new = $colour{$value}; } elsif ($setting eq 'diffstuff') { $diff_stuff = $colour{$value}; } else { print "Unknown option in $etcdir/colordiffrc: $setting\n"; } } close COLORDIFFRC; } } # colordiff specfic options here. Need to pre-declare if using variables GetOptions( "no-banner" => sub { $show_banner = 0 }, "plain-text=s" => \&set_color, "file-old=s" => \&set_color, "file-new=s" => \&set_color, "diff-stuff=s" => \&set_color ); if ($show_banner == 1) { print STDERR "$app_name $version ($app_www)\n"; print STDERR "$copyright $author, $author_email\n\n"; } if (defined $ARGV[0]) { # More reliable way of pulling in arguments open2(\*INPUTSTREAM, undef, "git", "diff", @ARGV); } else { *INPUTSTREAM = \*STDIN; } my $record; my $nrecs = 0; my $inside_file_old = 1; my $nparents = undef; while () { $nrecs++; if (/^(\@\@+) -[-+0-9, ]+ \1/) { print "$diff_stuff"; $nparents = length($1) - 1; } elsif (/^diff -/ || /^index / || /^old mode / || /^new mode / || /^deleted file mode / || /^new file mode / || /^similarity index / || /^dissimilarity index / || /^copy from / || /^copy to / || /^rename from / || /^rename to /) { $nparents = undef; print "$diff_stuff"; } elsif (defined $nparents) { if ($nparents == 1) { if (/^\+/) { print $file_new; } elsif (/^-/) { print $file_old; } else { print $plain_text; } } elsif (/^ {$nparents}/) { print "$plain_text"; } elsif (/^[+ ]{$nparents}/) { print "$file_new"; } elsif (/^[- ]{$nparents}/) { print "$file_old"; } else { print $plain_text; } } elsif (/^--- / || /^\+\+\+ /) { print $diff_stuff; } else { print "$plain_text"; } s/$/$colour{OFF}/; print "$_"; } close INPUTSTREAM; sub set_color { my ($type, $color) = @_; $type =~ s/-/_/; eval "\$$type = \$colour{$color}"; }