#!/bin/bash
# SPDX-License-Identifier: GPL-2.0

KERNEL_MINOR_VERSION='34'
KERNEL="2.6.$KERNEL_MINOR_VERSION"

EMAIL_ADDRESS='<gregkh@linuxfoundation.org>'

STABLE='<stable@vger.kernel.org>'
STABLE_COMMITS='<stable-commits@vger.kernel.org>'

extract_addr()
{
	read l
	read l
	read l
	read l
	a=$(echo "$l" | sed -n -e 's/.*<\(.*@[^>]*\).*/\1/p')
	echo $a
}

if [ x"$SMTP_SERVER" = x ]
then
	SMTP_SERVER=localhost:25
fi

if [ x"$EMAIL_ADDRESS" = x ]
then
	echo "You must set the EMAIL_ADDRESS environment variable to your email address"
	exit 1
fi
FROM=$EMAIL_ADDRESS

TO=""
CC=""

author()
{
        first_author=""
        TXT=$2
        if [ ! -f $TXT ]
        then
                echo "$TXT is missing"
                exit 1
        fi
        author=""
        while read l
        do
		# skip the Message-ID: line so we don't send email to the wrong place
		echo "$l"
		reply=$(echo "$l" | grep -a -i Message-ID:)
		if [ x"$reply" != x ]
		then
			continue
		fi

		# if this is the start of the diff, then it's time to stop looking
		diff=$(echo "$l" | grep "^---")
		if [ x"$diff" != x ]
		then
			echo "diffstart!!!!!"
			break
		fi

                for x in $l
                do
                        a=$(echo "$x" | sed -n -e 's/.*<\(.*@[^>]*\).*/\1/p')
                        if [ x"$a" != x ]
                        then
                                if [ x"$author" == x ]
                                then
                                        author=$a
                                        first_author=$a
                                else
                                        author="$author $a"
                                fi
                        fi
                done
        done < $TXT
        author=$(echo "$author" | tr ' ' '\n' | grep -v "$first_author" |
                sort | uniq)
        author="$first_author $author"
        eval $1=$(echo $author | sed -e 's/ /,/g')
        if [ x"$3" != x ]
        then
                eval $3=$first_author
        fi
}



reply()
{
	PATCH=$1
#	patch_name=$(stripit $1)
#	PATCH=$P/patches/$patch_name.patch
#	TXT=$P/txt/$patch_name.txt
#	if [ ! -f $TXT ]
#	then
#		echo $TXT is missing
#		exit 1
#	fi
	echo "PATCH=$PATCH"
#	SUBJECT=`grep -a "Subject:" $PATCH`
	SUBJECT=`grep -a "Subject:" $PATCH | sed s/Subject\:\ //`
#	SUBJECT=$(head -n 2 $PATCH | tail -n 1)
	MESSAGE_ID=`grep -a -i "^Message-ID:" $PATCH | cut -f 2 -d ' ' | cut -f 2 -d '<' | cut -f 1 -d '>'`
	author AUTHOR $1 FIRST_AUTHOR
	echo "author said $AUTHOR"
	echo "first_author said $FIRST_AUTHOR"
	if [ x"$AUTHOR" == "x" ]
	then
		echo "nobody to notify"
		exit 0
	fi
	to=""
	for i in $(echo "$AUTHOR" | sed -e 's/,/ /g')
	do
		if ! echo "$TO" | grep "$i"
		then
			to=$to" -to $i"
		fi
	done
	if [ x"$cc" != x ]
	then
		cc="-cc $cc"
	fi

#	SUBJECT="patch $PATCH added to $KERNEL-stable tree"

	CHARSET=$(guess-charset "$PATCH")
	if test "x$CHARSET" = "ANSI_X3.4-1968"; then
		CHARSET=
	else
		CHARCMD="-charset=$CHARSET"
	fi

	ID=`make_message_id`

	echo "makemail -to $AUTHOR -from=$FROM -subject=\"$SUBJECT\" -date=\"$(date -R)\" -reply_to=$MESSAGE_ID --message=$ID $CHARCMD"
#	echo "smtpsend -server=$SMTP_SERVER $to -from=$FROM"


	(
		echo
		echo "This is a note to let you know that I've just added the patch titled"
		echo
		echo "    $SUBJECT"
		echo
		echo "to the $KERNEL-stable tree which can be found at:"
		echo "    https://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary"
		echo
		echo "The filename of the patch is:"
		echo "    " `basename "$PATCH"`
		echo "and it can be found in the queue-$KERNEL subdirectory."
		echo
		echo "If you, or anyone else, feels it should not be added to the stable tree,"
		echo "please let <stable@vger.kernel.org> know about it."
		echo
		echo
		cat $PATCH
		echo
		echo
		echo -n "Patches currently in stable-queue which might be from "
		echo "$FIRST_AUTHOR are"
		echo
		grep -lR $FIRST_AUTHOR /home/gregkh/linux/stable/stable-queue/queue-$KERNEL/ 2> /dev/null |
			sed -e 's/\/home\/gregkh\/linux\/stable\/stable-queue\///'
	) |
	makemail -to "$AUTHOR" \
		-from="$FROM" \
		-cc="$STABLE, $STABLE_COMMITS"  \
		-subject="Patch \"$SUBJECT\" has been added to the $KERNEL-stable tree" \
		-date="$(date -R)" \
		-reply_to="$MESSAGE_ID" \
		-message_id="$ID" \
		"$CHARCMD" \
		| \
	~/bin/msmtp-enqueue.sh "$to"
#	~/bin/msmtp-enqueue.sh -a coco "$to"
	#msmtp $to
}

for patch_file in $*
do
	reply $patch_file
	echo "acknowledged $patch_file"
	echo "-----------------------------------------------"
	echo
done
