#! @SH@
#
# $Id: pkg_tarup,v 1.11 2003/12/11 16:29:08 erh Exp $
#
# Tar up installed package
#
# Package names are assumed to not contain spaces.
#
# (c) Copyright 2000-2002 Hubert Feyrer <hubert@feyrer.de>
#

PREFIX=${PREFIX:-@PREFIX@}

PATH=/sbin:/usr/sbin:/bin:/usr/bin:${PREFIX}/sbin:${PREFIX}/bin:@PKG_TOOLS_BIN@
export PATH

OS=`uname -s`

AWK=${AWK:-@AWK@}
ECHO=${ECHO:-@ECHO@}
HEAD=${HEAD:-@HEAD@}
ID=${ID:-@ID@}
SU=${SU:-@SU@}

if [ `${ID} -u` != 0 ]; then
	${ECHO} "Becoming root@`/bin/hostname` to create a binary package"
	${ECHO} -n "`${ECHO} ${SU} | ${AWK} '{ print $$1 }'` ";\
	exec ${SU} root -c "$0 $@"
fi

PKG_DBDIR=${PKG_DBDIR:-@PKG_DBDIR@}
PKG_SUFX=${PKG_SUFX:-@PKG_SUFX@}

PKGREPOSITORY=${PKGREPOSITORY:-/tmp}

usage()
{
	${ECHO} "Usage: $1 installed_pkg|pattern [...]"
	exit 1
}

check_and_add()
{
	opt="$1"
	file="$2"

	if [ x"$opt" = x"" -o x"$file" = x"" ]; then
	   ${ECHO} Usage: check_and_add -opt +FILE
	   exit 1
	fi

	if [ -f "$file" ]
	then
	    PKG_ARGS="${PKG_ARGS} ${opt} ${file}"
	fi
}

create_package()
{
	PKG="$1"
	PKG_ARGS=
	${ECHO} "Creating binary package: $PKG"

	check_and_add -c ${PKG_DBDIR}/${PKG}/+COMMENT
	check_and_add -d ${PKG_DBDIR}/${PKG}/+DESC
	check_and_add -b ${PKG_DBDIR}/${PKG}/+BUILD_VERSION
	check_and_add -B ${PKG_DBDIR}/${PKG}/+BUILD_INFO
	check_and_add -s ${PKG_DBDIR}/${PKG}/+SIZE_PKG
	check_and_add -S ${PKG_DBDIR}/${PKG}/+SIZE_ALL
	check_and_add -i ${PKG_DBDIR}/${PKG}/+INSTALL
	check_and_add -k ${PKG_DBDIR}/${PKG}/+DEINSTALL
	check_and_add -r ${PKG_DBDIR}/${PKG}/+REQUIRE
	check_and_add -D ${PKG_DBDIR}/${PKG}/+DISPLAY
	check_and_add -m ${PKG_DBDIR}/${PKG}/+MTREE		#NOTYET#

	PLIST=/tmp/+CONTENTS.$$
	sed -n \
		-e '/^@comment MD5:/d' \
		-e '/^@cwd \.$/,$d' \
		-e '/\$NetBSD/,$p' \
		<${PKG_DBDIR}/${PKG}/+CONTENTS >$PLIST

	# Duplicate first @cwd (work around pkg_create "feature" ...)
	grep '^@cwd' $PLIST | ${HEAD} -1 >$PLIST.1
	if [ -s ${PLIST}.1 ]
	then
		sed \
		   -e "/`cat ${PLIST}.1 | sed 's,/,\\\\/,g'`/r${PLIST}.1" \
		   <${PLIST} >${PLIST}.2
		mv ${PLIST}.2 ${PLIST}
	fi
	rm ${PLIST}.1

	# ${ECHO} -----
	# cat $PLIST
	# ${ECHO} -----
	# exit 0

	# Just for kicks ...
	# pkg_admin check "${PKG}"
	  
	pkg_create \
			${PKG_ARGS} \
		-v \
		-f ${PLIST} \
		-l \
		-p "`pkg_info -qp ${PKG} | ${AWK} 'NR == 1 { print $2; exit }'`" \
		-P "`pkg_info -qf ${PKG} | ${AWK} '/^@pkgdep/ { print $2 }'`" \
		-C "`pkg_info -qf ${PKG} | ${AWK} '/^@pkgcfl/ { print $2 }'`" \
		${PKGREPOSITORY}/${PKG}${PKG_SUFX}

	rm -f ${PLIST}
	return 0
}

while [ $# -gt 0 ] ; do
	rPKG="`pkg_info -e \"$1\"`"
	if [ -z "$rPKG" -o -f "${PKG_DBDIR}/${rPKG}" ] ; then
		${ECHO} "Error: package $1 not found"
		usage "$0"
	fi
	PKGS="$PKGS $rPKG"
	shift
done
if [ -z "$PKGS" ] ; then
	usage "$0"
fi
for xPKG in $PKGS ; do
	create_package "$xPKG"
	if [ $? -ne 0 ] ; then
		exit 1
	fi
done

exit 0


+REQUIRED_BY:

 - maybe the squirelling away of +REQUIRED_BY should be done here
   instead of in the bsd.pkg.mk framework that normally calls this.


mtree file considerations:

 - keeping uncompressed mtree file adds ~10% to the size of /var/db/pkg

 - could gzip file, space saving: 5kb->850b (plus some intelligence to
   uncompress them when needed)

 - not keeping mtree file results in pkgs w/o mtree file (but should work)

integration:

 - how/where?  I'd prefer not to have yet another pkg_* utility flying
   around, integration into pkg_admin would be nice.  But how merge a
   shell script into a C executable?  REWRITE in C of course!  ;-)
