#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by git-commit with no arguments.  The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, make this file executable.

# This is slightly modified from Andrew Morton's Perfect Patch.
# Lines you introduce should not have trailing whitespace.
# Also check for an indentation that has SP before a TAB.

# Added Spell Checking Code to the existing code
# By Deepak Barua and Sasikumar Kandhasamy

if git-rev-parse --verify HEAD 2>/dev/null
then
	git-diff-index -p -M --cached HEAD
else
	# NEEDSWORK: we should produce a diff with an empty tree here
	# if we want to do the same verification for the initial import.
	:
fi |
perl -e '
   # Adding the Aspell module to the perl script need aspell-dev installed in machine for the same
 
    use Text::Aspell;
    my $found_bad = 0;
    my $filename;
    my $reported_filename = "";
    my $lineno;
    my $continue = 0;
    my $start_pattern = "";
    my $end_pattern = "";
    my $chosen_pattern = "";
    my $match_condition = 0;
# Finding the file name extension
    sub find_ext {


	if($_[0] =~ /\.cc|\.java/) {

		$start_pattern  = qr!/\*|// !;  
	}
	
	elsif($_[0] =~ /\.c|\.h/) {
		$start_pattern = qr!/\*!;
	}

	else {
		
		$start_pattern = qr!\# !;
		$end_pattern = qq!\014!;
	}

    }


    sub bad_line {
	my ($why, $line) = @_;
	if (!$found_bad) {
	    print STDERR "*\n";
	    print STDERR "* You have some suspicious patch lines:\n";
	    print STDERR "*\n";
	    $found_bad = 1;
	}
	if ($reported_filename ne $filename) {
	    print STDERR "* In $filename\n";
	    $reported_filename = $filename;
	}
	print STDERR "* $why (line $lineno)\n";
	print STDERR "$filename:$lineno:$line\n";
    }
    # Created a spell checker instance
    my $speller = Text::Aspell->new;
    die unless $speller;
    while (<>) {
	if (m|^diff --git a/(.*) b/\1$|) {
	    $filename = $1;
	    find_ext($filename);  # Calling the file extension finding function
	    next;
	}
	if (/^@@ -\S+ \+(\d+)/) {
	    $lineno = $1 - 1;
	    next;
	}
	if (/^ /) {
	    $lineno++;
	    next;
	}
	if (s/^\+//) {
	    $lineno++;
	    s/\n/ \014 /; # Substituting the newline in the file with junk octal character so chomp would not remove it
	    chomp; 
	# Main match condition for the start of the comment lines

	   if(($match_condition = m/($start_pattern)/) || $continue == 1) {
	   
           # Condition checking for not continuing comment and new comment pattern is matched
	   ($continue != 1 && $match_condition == 1) ? $chosen_pattern = $+ : "Continue Pattern"; 
	   
           # Condition checking for not continuing comment and no new comment pattern is found
	   ($continue != 1 && $match_condition != 1) ? $chosen_pattern = "" : "Continue Pattern"; 
	   
	   # If chosen pattern is as specified then the corresponding end pattern is assigned
	   $chosen_pattern eq qq!/\*! ? $end_pattern=qq!\*/! : "End Pattern Not Found" ;
	   $chosen_pattern eq qq!//! ? $end_pattern=qq!\014! : "End Pattern Not Found" ;
	   
           # Split the line to individual words
           @words = split / /,$_;
           foreach $word (@words) {
	   # Check to see if end is reached 
           if($word eq $end_pattern) {
	 	$continue=0;
		$chosen_pattern="";
		$end_pattern="";
                last;
           }
	   # Skip the start pattern
	   elsif($word eq $chosen_pattern) {
	   next;
           }
	   # Perform spell checking for the selected word 
           else {
                 $speller->check($word)
                        ? "Found"
                        : bad_line("\"$word\" spelling wrong"," ");
                }
	   $continue = 1;
            
	   }

        }
	s/ \014 / /; # Substituting the junk octal with a space
        # Continuation of the old code in pre-commit
	if (/\s$/) {
            bad_line("trailing whitespace", $_);
        }
        if (/^\s*   /) {
           bad_line("indent SP followed by a TAB", $_);
        }
        if (/^(?:[<>=]){7}/) {
           bad_line("unresolved merge conflict", $_);
        }
	   
	}

    }
    exit($found_bad);
'

