#!/bin/sh

usage()
{
	cat << EOF
	Usage: `basename $0` patchdir
EOF

	exit 1
}

trap 'printf "\a\n"' EXIT

if [ $# -ne 1 ]; then
	usage
fi

if [ `git status --porcelain drivers include linuxkpi Makefile */Makefile */*/Makefile *.mk | wc -l` -gt 0 ]; then
	echo "Cannot proceed, you have uncommitted changes"
	exit 1
fi

if ! command -v gpatch 1>/dev/null; then
	echo "GNU patch not found, install devel/patch"
	exit 1
fi

mkdir -p $1/alreadyapplied/
mkdir -p $1/applied/
mkdir -p $1/rej/

for file in $1/*.patch; do
	echo "Trying to apply $file with git am"
	git am --3way ${file}
	if [ $? -ne 0 ]; then
		echo "Patch $file failed"
		mv $file $1/rej
		rejfile=$1/rej/`basename ${file}`
		read -p "Apply it with GNU patch (y/n) ? [n] " yn
		case ${yn} in
			[Yy]* ) ;;
			* ) exit 1;;
		esac
		gpatch -p1 -B /tmp/ -E -V none -i ${rejfile}
		if [ $? -ne 0 ]; then
			echo "Patch $rejfile failed"
			exit 1
		fi
		read -p "Commit changes (y/n) ? [n] " yn
		case ${yn} in
			[Yy]* ) ;;
			* ) exit 1;;
		esac
		git add drivers include linuxkpi
		git am --continue
		mv ${rejfile} $1
	fi
	mv $file $1/applied
	patchfile=$(echo $file | awk -F '/' '{print $NF}')
	newfiles=$(awk '$0 == "--- /dev/null" { getline; print $2 }' $1/applied/${patchfile} | sed 's/^b\///')
	if [ -n "${newfiles}" ]; then
	    echo "New files appeared, makefiles needs modification"
	    echo "New files in questions : ${newfiles}"
	    exit 1
	fi
	renames=$(awk '($1 == "rename" && $2 == "from") {print $3" renamed to "; getline; print $3}' $1/applied/${patchfile})
	if [ -n "${renames}" ]; then
	    echo "files got renamed, makefiles needs modification"
	    echo "renamed files in questions : "
	    echo "${renames}"
	    exit 1
	fi
	deleted=$(awk '$1 == "deleted" { getline; getline; print $2 }' $1/applied/${patchfile} | sed 's/\(a\/\)\(.*\)/\2/')
	if [ -n "${deleted}" ]; then
	    echo "files got deleted, makefiles needs modification"
	    echo "deleted files in questions : "
	    echo "${deleted}"
	    exit 1
	fi
	make -sj$(sysctl -n hw.ncpu) -DDEVELOPER || exit 1
done
