2006-04-12 10:05:14 +04:00
|
|
|
#!/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 (<COLORDIFFRC>) {
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-07-10 09:50:18 +04:00
|
|
|
# colordiff specific options here. Need to pre-declare if using variables
|
2006-04-12 10:05:14 +04:00
|
|
|
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 (<INPUTSTREAM>) {
|
|
|
|
$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}";
|
|
|
|
}
|