#!/bin/sh

. patchfns 2>/dev/null ||
. /usr/lib/patch-scripts/patchfns 2>/dev/null ||
. $PATCHSCRIPTS_LIBDIR/patchfns 2>/dev/null ||
{
	echo "Impossible to find my library 'patchfns'."
	echo "Check your install, or go to the right directory"
	exit 1
}

do_apply()
{
	FILES=$(cat $P/pc/$PATCH_NAME.pc)
	for file in $FILES
	do
		copy_file_to_bup $file $PATCH_NAME
	done

	silent=-s
	if [ $opt_force != 0 ]
	then
		silent=
		flags=-l
	else
		flags=
	fi

	if ! grep "^+++" "$1" > /dev/null
	then
		true
	elif patch -p1 $silent $flags -i "$1" || [ $opt_force != 0 ]
	then
		true
	else
		echo SOMETHING WENT WRONG
		exit 1
	fi
}

do_merge()
{
	echo blip
	ret=0
	FILES=$(cat $P/pc/$PATCH_NAME.pc)
	for file in $FILES
	do
		copy_file_to_bup $file $PATCH_NAME
	done

	for file in $FILES
	do
		merge_base=$(mergebase_name "$file" "$PATCH_NAME")
		if [ -e $merge_base ]
		then
			cp "$merge_base" "$file"
		fi
	done

	patch -p1 -s -i "$1" >/dev/null

	for file in $FILES
	do
		bup="$file"~"$PATCH_NAME"
		merge_base=$(mergebase_name "$file" "$PATCH_NAME")
		rej_file="$file".rej
		if [ -e "$merge_base" ]
		then
		    echo Wiggling changes into $file
		    if ! wiggle $bup $merge_base $file >"$file".tmp
		    then
			ret=1
		    fi
		    mv -f "$file".tmp $file
		elif [ -e $rej_file -a ! $rej_file -ot $bup ]
		then
		    echo Wiggling $rej_file into $file
		    if ! wiggle "$file" "$rej_file" >"$file".tmp
		    then
			ret=1
		    fi
		    mv -f "$file".tmp $file
		fi
	done

	return $ret
}

add_to_db()
{
	basename "$1" >> "$DB"
}

usage()
{
	echo "Usage: apatch patchname"
	exit 1
}

apatch()
{
	PATCH_NAME=$(stripit $1)

	need_file_there $P/pc/$PATCH_NAME.pc

	if is_applied "$PATCH_NAME"
	then
		echo "$PATCH_NAME" is already applied
		exit 1
	fi

	if [ $opt_force != 0 ]
	then
		echo FORCING PATCH
	fi

	if [ $opt_force != 0 ] || can_apply $P/patches/"$PATCH_NAME".patch
	then
		do_apply $P/patches/"$PATCH_NAME".patch
		add_to_db "$PATCH_NAME"
		echo applied $PATCH_NAME, next is $(nextpatch)
		echo
	elif [ $opt_merge != 0 ]
	then
		do_merge $P/patches/"$PATCH_NAME".patch
		ret=$?
		add_to_db "$PATCH_NAME"
		echo applied $PATCH_NAME, next is $(nextpatch)
		echo
		if [ $ret != 0 ]
		then
			echo "Resolve conflicts before pushing more patches."
			delete_mergebase_files "$PATCH_NAME"
			exit 1
		fi
	else
		echo "$PATCH_NAME" does not apply
		exit 1
	fi

	delete_mergebase_files "$PATCH_NAME"
}

opt_force=0
opt_merge=0
PATCH_NAMES=""

for i in $*
do
	case "$i" in
	-f)
		opt_force=1
		shift;;
	-m)
		opt_merge=1
		shift;;
	*)
		PATCH_NAMES="$PATCH_NAMES $i"
	esac
done

if [ x"$PATCH_NAMES" == x ]
then
	usage
fi


for i in $PATCH_NAMES
do
	if ! apatch $i
	then
		exit 1
	fi
done

