#!/bin/bash

read_pkgname()
{
	local OLDIFS="$IFS"
	# IFS (field separator) is only the newline character
	IFS="
"
	local line var val
	for line in $(bsdtar -xOf "$1" .PKGINFO |
		grep -v "^#" | sed 's|\(\w*\)\s*=\s*\(.*\)|\1="\2"|'); do
		eval "$line"
	done
	IFS=$OLDIFS
}

# $oldfile $oldmd5 $newfile $newmd5 $deltafile $deltamd5 $deltasize
create_xdelta()
{
	local oldfile=$1
	local newfile=$2
	local \
	oldname oldver oldarch oldmd5 \
	newname newver newarch newmd5 \
	deltafile deltamd5 deltasize

	read_pkgname "$oldfile"
	oldname="$pkgname"
	oldver="$pkgver"
	oldarch="$arch"
	read_pkgname "$newfile"
	newname="$pkgname"
	newver="$pkgver"
	newarch="$arch"
	
	if [ "$oldname" != "$newname" ]; then
		echo "error : different package name"
		return 1
	fi
	if [ -z "$oldname" ]; then
		echo "error : empty package name"
		return 1
	fi

	if [ "$oldarch" != "$newarch" ]; then
		echo "error : different package arch"
		return 1
	fi

	msg "$(gettext "Making delta from version %s...")" "$latest_version"
	deltafile="$(dirname $newfile)/$pkgname-${oldver}_to_${newver}-$arch.delta"
	local ret=0

	#xdelta delta "$oldfile" "$newfile" "$deltafile" || ret=$?
	xdelta3 -s "$oldfile" "$newfile" "$deltafile" || ret=$?
	if [ $ret -ne 0 -a $ret -ne 1 ]; then
		warning "$(gettext "Delta was not able to be created.")"
	fi

	oldmd5="$(openssl dgst -md5 "$oldfile" | awk '{print $NF}')"
	newmd5="$(openssl dgst -md5 "$newfile" | awk '{print $NF}')"
	deltamd5="$(openssl dgst -md5 "$deltafile" | awk '{print $NF}')"
	deltasize=$(stat -c %s "$deltafile")

	oldbase="$(basename $oldfile)"
	newbase="$(basename $newfile)"
	deltabase="$(basename $deltafile)"
	pacdelta="$(dirname $newfile)/$pkgname.pacdelta"
	if grep -q "$oldbase.*$newbase" "$pacdelta"; then
		warning "$(gettext "entry for delta from '%s' to '%s' already exists.")" "$oldfile" "$newfile"
	else
		echo "$oldbase $oldmd5 $newbase $newmd5 $deltabase $deltamd5 $deltasize" >> "$pacdelta"
	fi
}

if [ $# -ne 2 ]; then
	usage
	exit 0
fi


if [ ! "$(type -p xdelta)" ]; then
	error "$(gettext "Cannot find the xdelta binary! Is xdelta installed?")"
	exit 1
fi

create_xdelta $1 $2
