#!/bin/sh

# ipkg-build -- construct a .ipk from a directory
# Carl Worth <cworth@east.isi.edu>
# based on a script by Steve Redler IV, steve@sr-tech.com 5-21-2001
set -e

ipkg_extract_value() {
	sed -e "s/^[^:]*:[[:space:]]*//"
}

required_field() {
	field=$1

	value=`grep "^$field:" < $CONTROL/control | ipkg_extract_value`
	if [ -z "$value" ]; then
		echo "ipkg-build: Error: $CONTROL/control is missing field $field" ;
		PKG_ERROR=1
	fi
	echo $value
}

pkg_appears_sane() {
	local pkg_dir=$1

	local owd=`pwd`
	cd $pkg_dir

	PKG_ERROR=0
	if [ ! -f "$CONTROL/control" ]; then
		echo "ipkg-build: Error: Control file $pkg_dir/$CONTROL/control not found."
		cd $owd
		return 1
	fi

	pkg=`required_field Package`
	version=`required_field Version`
	arch=`required_field Architecture`
	required_field Maintainer >/dev/null
	required_field Description >/dev/null

	if echo $pkg | grep '[^a-z0-9.+-]'; then
		echo "ipkg-build: Error: Package name $name contains illegal characters, (other than [a-z0-9.+-])"
		PKG_ERROR=1;
	fi

	local bad_fields=`sed -ne 's/^\([^[:space:]][^:[:space:]]\+[[:space:]]\+\)[^:].*/\1/p' < $CONTROL/control | sed -e 's/\\n//'`
	if [ -n "$bad_fields" ]; then
		bad_fields=`echo $bad_fields`
		echo "ipkg-build: Error: The following fields in $CONTROL/control are missing a ':'"
		echo "	$bad_fields"
		echo "ipkg-build: This may be due to a missing initial space for a multi-line field value"
		PKG_ERROR=1
	fi

	for script in $CONTROL/preinst $CONTROL/postinst $CONTROL/prerm $CONTROL/postrm; do
		if [ -f $script -a ! -x $script ]; then
			echo "ipkg-build: Error: package script $script is not executable"
			PKG_ERROR=1
		fi
	done

	if [ -f $CONTROL/conffiles ]; then
		for cf in `cat $CONTROL/conffiles`; do
			if [ ! -f ./$cf ]; then
				echo "ipkg-build: Error: $CONTROL/conffiles mentions conffile $cf which does not exist"
				PKG_ERROR=1
			fi
		done
	fi

	cd $owd
	return $PKG_ERROR
}

###
# ipkg-build "main"
###

case $# in
1)
	dest_dir=.
	;;
2)
	dest_dir=$2
	;;
*)
	echo "Usage: ipkg-build <pkg_directory> [<destination_directory>]" ;
	exit 1 
	;;
esac

pkg_dir=$1

if [ ! -d $pkg_dir ]; then
	echo "ipkg-build: Error: Directory $pkg_dir does not exist"
	exit 1
fi

# CONTROL is second so that it takes precedence
CONTROL=
[ -d $pkg_dir/DEBIAN ] && CONTROL=DEBIAN
[ -d $pkg_dir/CONTROL ] && CONTROL=CONTROL
if [ -z "$CONTROL" ]; then
	echo "ipkg-build: Error: Directory $pkg_dir has no CONTROL subdirectory."
	exit 1
fi

if ! pkg_appears_sane $pkg_dir; then
	echo "Please fix the above errors and try again."
	exit 1
fi

tmp_dir=$dest_dir/IPKG_BUILD.$$
mkdir $tmp_dir

tar -C $pkg_dir -czf $tmp_dir/data.tar.gz . --exclude=$CONTROL
tar -C $pkg_dir/$CONTROL -czf $tmp_dir/control.tar.gz .

echo "2.0" > $tmp_dir/debian-binary

pkg_file=$dest_dir/${pkg}_${version}_${arch}.ipk
tar -C $tmp_dir -czf $pkg_file debian-binary data.tar.gz control.tar.gz
rm $tmp_dir/debian-binary $tmp_dir/data.tar.gz $tmp_dir/control.tar.gz
rmdir $tmp_dir

echo "Packaged contents of $pkg_dir into $pkg_file"
