#!/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}";
}
