You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
6.1 KiB
196 lines
6.1 KiB
#!/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; |
|
} |
|
} |
|
|
|
# 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 (<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}"; |
|
}
|
|
|